Arithmetisches Mittel der Fibonacci-Primzahlen bis zur x-Fibonacci-Zahl

18

Sie sollten von den Fibonacci-Zahlen gehört haben , die oft als Fibonacci-Sequenz bezeichnet werden. In dieser Sequenz sind die ersten beiden Terme 0 und 1, und jede Zahl nach den ersten beiden ist die Summe der beiden vorhergehenden. Mit anderen Worten F(n) = F(n-1) + F(n-2).

Hier sind die ersten 20 Fibonacci-Zahlen:

0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181

Aufgabe:

xBerechnen Sie bei einer gegebenen ganzen Zahl das arithmetische Mittel (den Durchschnitt) der Fibonacci-Primzahlen bis zur xNummer der Fibonacci-Sequenz.

Regeln:

  • Die Fibonacci-Sequenz beginnt bei dieser Herausforderung mit 0 und 1
  • 3 < x < 40, weil höhere Werte von xmöglicherweise eine sehr lange Ausführungszeit oder Überläufe verursachen und kleinere Werte keine Ausgabe haben
  • 1 ist NICHT prim, da es nur 1 Divisor hat
  • Das arithmetische Mittel sollte, falls zutreffend, Dezimalzahlen enthalten oder als exakter Bruch angezeigt werden
  • Sie dürfen nur xals Eingabe nehmen und der Code, der für die Eingabe benötigt wird, zählt nicht (zB: Wenn Sie etwas benötigen x = input(), sollten Sie es beim Zählen der Bytes nicht berücksichtigen).

Beispiele:

Ex. 1: Denn x=10die Ausgabe ist 5.75, weil die 10. Fibonacci-Zahl ist 55und die Primzahlen bis zu Fibonacci 55sind 2, 3, 5, 13, ihr Durchschnittswert5.75

Nach der Erläuterung von Beispiel 1 sind andere Beispiele:

Ex. 2: Für x=15ist die Ausgabe57.5

Ex. 3: Für x=20ist die Ausgabe 277.428571428571oder eine andere enge Annäherung. In diesem Fall 277.4286ist zum Beispiel ein akzeptierter Wert

Ex. 4: Für x=11ist die Ausgabe22.4

Ex. 5: Für x=30ist die Ausgabe 60536.4444444444oder eine andere enge Annäherung, wie z60536.444


Bestenliste:


Senden Sie eine kürzere gültige Lösung, um den Anführer zu ändern. Ihr Code sollte so kurz wie möglich sein, da dies , damit die kürzeste Antwort in Bytes gewinnt. Viel Glück!

Mr. Xcoder
quelle
Kann das Ergebnis als exakter Bruch statt als gerundete Dezimalzahl zurückgegeben werden?
Martin Ender
Ja natürlich, solange es der richtige Wert ist. Bearbeitet die Frage :))
Mr. Xcoder
Wenn die Antwort als Bruch angegeben wird, muss der Bruch reduziert werden?
DLosc
Das liegt an dir. Sie können es reduzieren, wenn Sie wollen, aber ich denke nicht, dass das notwendig ist.
Mr. Xcoder
Bitte aktualisieren Sie die akzeptierte Antwort.
Erik der Outgolfer

Antworten:

5

Eigentlich 10 Bytes

Code:

R♂F;Mr♂P∩æ

Erläuterung:

R            # On the input, create the range [1 .. input].
 ♂F          # Map the nth Fibonacci command over it.
   ;M        # Duplicate and get the maximum of the list.
     r       # Create the range [0 .. maximum - 1].
      ♂P     # Map the nth prime operator over each element (zero-indexed).
        ∩    # Intersection of both.
         æ   # Get the mean and implicitly display.

Verwendet die CP-437- Codierung. Probieren Sie es online!

Adnan
quelle
Wow, erledigt so einen Job in nur 10 Bytes. Beeindruckend!
Mr. Xcoder
12

Python 2 , 71 Bytes

s=2.;a=b=c=1
exec"p=2**a%a==2;c+=p;s+=a*p;a,b=b,a+b;"*input()
print s/c

Probieren Sie es online!

Python hat dafür keine nützlichen arithmetischen Funktionen, daher erledigen wir die Dinge von Hand. Der Code durchläuft Fibonacci-Zahlen über a,b=b,a+bab a=b=1.

Der Fermat-Primalitätstest mit Basis 2 wird verwendet, um Primzahlen als awo zu identifizieren 2^a == 2 (mod a). Obwohl hiermit nur nach wahrscheinlichen Primzahlen gesucht wird, liegt keine der falsch-positiven Zahlen innerhalb der ersten 40 Fibonacci-Zahlen.

Die aktuelle Summe sund Anzahl cder Primzahlen wird jedes Mal aktualisiert, wenn eine Primzahl angetroffen wird, und ihr Verhältnis (der Mittelwert) wird am Ende gedruckt. Da der Prime Check fehlschlägt a=2und garantiert im Eingabebereich liegt, beginnt die Summe bei 2 und die Zählung beginnt bei 1, um dies zu kompensieren.

xnor
quelle
8

Jelly , 11 Bytes

ÆḞ€ÆPÐfµS÷L

Probieren Sie es online!

Wie es funktioniert

ÆḞ€ÆPÐfµS÷L  Main link. Argument: n (integer)

ÆḞ€          Map the Fibonacci atom over [1, ..., n].
   ÆPÐf      Filter by primality.
       µ     Begin a new chain. Argument: A (array of Fibonacci primes)
        S    Yield the sum of A.
          L  Yield the length of A.
         ÷   Compute the quotient.
Dennis
quelle
11
Eine solide 2 von 3 für integrierte mathematische Funktionen. Fibonacci, überprüfe. Primalität, überprüfe. Arithmetisches Mittel, nein.
Xnor
Ich habe die akzeptierte Antwort geändert, da eine kürzere Antwort veröffentlicht wurde.
Mr. Xcoder
7

Mathematica, 38 Bytes

Mean@Select[Fibonacci@Range@#,PrimeQ]&

(* or *)

Mean@Select[Fibonacci~Array~#,PrimeQ]&

Erläuterung

Mean@Select[Fibonacci@Range@#,PrimeQ]&  
                                     &  (* For input # *)
                      Range@#           (* List {1, 2, 3, ... #} *)
            Fibonacci@                  (* Find the corresponding fibonacci numbers *)
     Select[                 ,PrimeQ]   (* Select the prime terms *)
Mean@                                   (* Take the Mean *)
JungHwan min
quelle
2
Ich denke, Sie wollen #und nicht #-1: Das OP sagt, dass 55 die 10. Fibonacci-Zahl ist, daher muss ihre Liste mit 0 indiziert sein (wie es die beste Konvention ist). Vergleichen Sie Ihren Ausgang für Eingänge 10und 11mit dem OP. Zum Glück spart das drei Bytes!
Greg Martin
Sie können die fallen &und ersetzen #durch x(Frage besagt, dass Eingabe unter Code nicht bewertet wird)
CalculatorFeline
6

Perl 6 , 51 Bytes

{sum($/=[grep *.is-prime,(0,1,*+*...*)[0..$_]])/$/}

Versuch es

Erweitert:

{
  sum(
    $/ = [                # store as an Array in $/

      grep
        *.is-prime,       # find the primes
        (
          0, 1, *+* ... * # Fibonacci sequence
        )[ 0 .. $_ ]      # grab the indicated values in the sequence

    ]
  )

  /

  $/   # use the Array as a number (elems)
}
Brad Gilbert b2gills
quelle
5

MATL , 16 Bytes

lOi:"yy+]vtZp)Ym

Probieren Sie es online!

Erläuterung

lO     % Push 1, then 0. This way the generated numbers with indices 1, 2, 3, ...
       % will be 1, 1, 2, ... as required
i      % Input n
:"     % Do the following n times
  yy   %   Duplicate top two numbers
  +    %   Add
]      % End
v      % Concatenate all numbers into a column vector
t      % Duplicate
Zp     % Vector of logical values: true for prime numbers, false otherwise
)      % Apply that vector as an index. This keeps only prime numbers
Ym     % Mean. Implicitly display
Luis Mendo
quelle
4

Oktave , 75 71 Bytes

@(n)mean((t=fix(((1+(s=5^.5)).^(x=1:n)-(1-s).^x)/s./2.^x))(isprime(t)))

Anonyme Funktion, die die Binet-Formel verwendet . Ein- und Ausgabe erfolgen in Form von Funktionsargumenten.

Probieren Sie es online!

Luis Mendo
quelle
1
+1 für die interessante Verwendung der Binet-Formel in Kombination mit der integrierten Formel, isprimedie perfekt für diese Herausforderung geeignet ist.
Mr. Xcoder
4

Maxima, 49 Bytes

f(n):=mean(sublist(makelist(fib(x),x,n),primep));
rahnema1
quelle
4

Prolog (SWI) , 269 264 254 218 Bytes

  • Danke an Fatalize für das Speichern von 37 Bytes!
  • Danke an Emigna für das Speichern von 9 Bytes!

Ich bin mir ziemlich sicher, dass ich noch ein paar Bytes mehr Golf spielen könnte.

X/X:-X<3.
N/R:-A is N-1,B is N-2,A/C,B/D,R is C+D.
2^0^0.
C^S^E:-G is C-1,G/M,G^Q^R,(p(M)->S=M+Q,E is R+1;S=Q,E is R).
a(X,S):-X^R^Q,S is R/Q.
p(N):-N*(N-1).
p(2).
p(3).
N*2:-N mod 2=\=0.
N*C:-N mod C=\=0,D is C-1,N*D.

Führen Sie es aus wie a(15, R).für x = 15 , R ist die Ausgabevariable.

Probieren Sie es online!


Eine lesbarere Version:

fibonacci(1, 1) :- !.
fibonacci(2, 2) :- !.

fibonacci(N, R) :-
  N0 is N - 1,
  N1 is N - 2,
  fibonacci(N0, R1),
  fibonacci(N1, R2),
  R is R1 + R2.

listed(2, 0, 0) :- !.

listed(C, S, Successes) :-
  C0 is C - 1,
  fibonacci(C0, Result),
  listed(C0, S0, S1),
  (
    is_prime(Result)
    ->
      S = Result + S0, Successes is S1 + 1
    ; S = S0, Successes is S1
  ).

f(X, S) :-
  listed(X, R, Q),
  S is R / Q.

is_prime(Num) :- is_prime(Num, Num - 1).

is_prime(2).
is_prime(3).

is_prime(Num, 2) :- Num mod 2 =\= 0, !.

is_prime(Num, C) :-
  Num mod C =\= 0,
  C0 is C - 1,
  is_prime(Num, C0).
Adnan
quelle
1
Golfen in SWI Prolog ist Gold wert (und sehr hart), so schöne Arbeit!
Mr. Xcoder
Ich bin mir ziemlich sicher, dass N*C:-solche Dinge für Kopfdeklarationen in PPCG zulässig sind, wodurch Sie einige Bytes sparen können.
Fatalize
@Fatalize Ich habe diese Programmiersprache erst vor einer Woche gelernt, daher bin ich mir nicht sicher, was du meinst: p. Meinst du zu ersetzen p(N,C):-mit N*C:-?
Adnan
@Adnan Genau!
Fatalize
@Fatalize Oohhh, das ist wirklich ordentlich! Vielen Dank :).
Adnan
3

Röda , 98 94 93 Bytes

f n{z=0;i=1;j=1;s=0;seq 2,n-1|{|_|c=i+j;i=j;j=c;seq 2,c-1|{z+=1;s+=c}if[c%p>0]()for p}_[s/z]}

Es ist eine Funktion, die das Ergebnis als Gleitkommazahl zurückgibt.

Ungolfed-Version:

function f(n) {
    i = 1
    j = 1
    sum = 0
    num = 0
    seq(2, n-1) | for _ do
        /* calculate next fibonacci number: */
        c = i+j
        i = j
        j = c
        /* if it's prime: */
        {
            num += 1
            sum += c
        /* primality test: */
        } if [c%p > 0]() for p in [seq(2, c-1)]
    done
    return sum/num
}
fergusq
quelle
Können Sie c%p>0anstelle von tun c%p!=0?
Kritixi Lithos
@KritixiLithos Ja! Vielen Dank.
Fergusq
3

05AB1E , 13 Bytes

!ÅF¹£DpÏDOsg/

Probieren Sie es online! oder als Testsuite

Erläuterung

!ÅF             # get a list of fibonacci numbers up to fac(input)
   ¹£           # take the first input elements of that list
     D          # duplicate
      p         # isprime on the copy
       Ï        # keep the fibonacci numbers which are true in the isprime list
        D       # duplicate the list of fibonacci primes
         O      # sum the list
          s     # swap the other copy to the top of the stack
           g    # get its length
            /   # divide sum by length
Emigna
quelle
2

Gleichstrom , 129 Bytes

?sa0sb1sd0ss0sz[[lF1+sF]sqlelG!=q]si[ls+sslz1+sz]sw[lddlb+dsdrsbdsG2se0sF[lGdle%0=ile1+dse<p]dspxlF0=wla1-dsa1<c]dscxEkls1-lz1-/p

Ein Fibonacci-Zahlengenerator und ein Primalitätsprüfer in einem. Nett.

Probieren Sie es online!

R. Kap
quelle
2

Japt , 14 Bytes

ò@MgXÃfj
x /Ul

Probier es aus


Erläuterung

Implizite Eingabe einer Ganzzahl U.
30

ò

Generieren Sie ein Array von Ganzzahlen von 0 bis Ueinschließlich.
[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30]

@   Ã

Übergeben Sie jede Ganzzahl durch eine Funktion.

MgX

Holen Sie sich die Xth Fibonacci-Zahl, wo Xist das aktuelle Element.

[0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,75025,121393,196418,317811,514229,832040]

fj

Filtern Sie ( f) das Array zu den Elementen, die beim Überprüfen auf Primalität ( j) die Wahrheit zurückgeben . Ordnen Sie das resultierende Array implizit der Variablen zu U.
[2,3,5,13,89,233,1597,28657,514229]

x

Reduzieren Sie das Array durch Summieren.
544828

/Ul

Teilen Sie das Ergebnis durch die Länge des Arrays ( l) und geben Sie das Ergebnis implizit aus.
60536.444444444445

Zottelig
quelle
Wow, ich liebe neue Antworten auf alte Fragen. Auch in der Nähe der anderen Golfsprachen, also +1.
Mr. Xcoder
1

Perl, 91 Bytes

$b=1;map{($a,$b)=($b,$a+$b),$p=("x"x$b)!~/^(.|(..+)\2+)$/,$s+=$b*$p,$c+=$p}2..$x;print$s/$c

Cuold war 8 Bytes kürzer, wenn der Modulo-Pseudoprime-Test sowohl in Perl als auch in der Python-Antwort funktionierte:

$b=1;$s=2;map{($a,$b)=($b,$a+$b),$p=2**$b%$b==2,$s+=$b*$p,$c+=$p}2..$x;print$s/++$c

... aber dies gibt eine falsche Antwort für Eingaben> 16 in Perl.

Kjetil S.
quelle
1

Axiom, 104 Bytes

g(n)==(y:=x:=r:=0;repeat(x>n=>break;j:=fibonacci(x);x:=x+1;if prime?(j)then(r:=r+j;y:=y+1));y=0=>-1;r/y)

ungolfed, test code und ergebnisse

f(n)==
  y:=x:=r:=0
  repeat
     x>n=>break
     j:=fibonacci(x)
     x:=x+1
     if prime?(j) then(r:=r+j;y:=y+1)
  y=0=>-1
  r/y

(3) -> [[i,g(i)::Float] for i in [1,2,3,10,15,20,11,30,50]]
   Compiling function g with type PositiveInteger -> Fraction Integer
   (3)
   [[1.0,- 1.0], [2.0,- 1.0], [3.0,2.0], [10.0,5.75], [15.0,57.5],
    [20.0,277.4285714285 7142857], [11.0,22.4], [30.0,60536.4444444444 44444],
    [50.0,309568576.1818181818 2]]

ich versuche den matematica, octave etc sprachen eintrag zu duplizieren, wenn man die mean () funktion nicht mitzählt, wäre es hier 62 bytes auch so gut umzusetzen

mean(a:List Float):Any== 
    i:=1; s:=0.0
    repeat  
       if~index?(i,a)then break
       s:=s+a.i
       i:=i+1
    i=1=>[]
    s/(i-1)

--62 bytes
f(x:NNI):Any==mean(select(prime?,[fibonacci(i)for i in 1..x]))
RosLuP
quelle
1

JavaScript ES6, 137 136 118 113 Bytes

m=

n=>(a=[],(f=x=>a[x]=x<2?x:f(--x)+f(--x))(n),eval((a=a.filter(x=>eval("for(y=x;x%--y;);y==1"))).join`+`)/a.length)

console.log(m(10))
console.log(m(15))
console.log(m(20))
console.log(m(11))
console.log(m(30))


Geschichte

118 Bytes

n=>(a=[0,1,1],(f=x=>a[--x]=a[x]||f(x)+f(--x))(n),eval((a=a.filter(x=>eval("for(y=x;x%--y;);y==1"))).join`+`)/a.length)

136 Bytes

n=>(a=[0,1,1],(f=x=>a[--x]=a[x]||f(x)+f(--x))(n),eval((a=a.filter(x=>x>1&&!Array(x).fill().some((i,j)=>j>1&&!(x%j)))).join`+`)/a.length)

137 Bytes

n=>(a=[0,1,1],(f=x=>a[--x]=a[x]||f(x)+f(--x))(n),eval((a=a.filter(x=>{d=x;while(--d>1)if(!(x%d))return 0;return x>1})).join`+`)/a.length)
Zottelig
quelle