Media aritmetica dei numeri primi di Fibonacci fino al numero x di Fibonacci


18

Avresti dovuto conoscere i numeri di Fibonacci , spesso chiamati la sequenza di Fibonacci. In questa sequenza i primi due termini sono 0 e 1 e ogni numero dopo i primi due è la somma dei due precedenti. In altre parole, F(n) = F(n-1) + F(n-2).

Ecco i primi 20 numeri di Fibonacci:

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

Compito:

Dato un numero intero x, calcola la media aritmetica (la media) dei numeri di Fibonacci primi fino al xnumero della sequenza di Fibonacci.

Regole:

  • la sequenza di Fibonacci inizia con 0 e 1 per questa sfida
  • 3 < x < 40, poiché valori più alti di xpotrebbero causare tempi di esecuzione o overflow enormi e valori più piccoli non hanno output
  • 1 NON è un numero primo, poiché ha solo 1 divisore
  • la media aritmetica dovrebbe includere i decimali, se è il caso, o dovrebbe essere visualizzata come una frazione esatta
  • ti è permesso prendere solo xcome input e il codice necessario per prendere l'input non conta (es: se hai bisogno di qualcosa del genere x = input(), non dovresti tenerne conto quando conti i byte)

Esempi:

Ex. 1: Per x=10, l'output è 5.75, perché il 10 ° numero di Fibonacci è 55e i numeri primi di Fibonacci fino a 55sono 2, 3, 5, 13, il loro essere medio5.75

Seguendo la spiegazione dell'esempio 1, altri esempi sono:

Ex. 2: Per x=15, l'uscita è57.5

Ex. 3: Per x=20, l'output è 277.428571428571o qualsiasi altra approssimazione ravvicinata. In questo caso 277.4286, ad esempio, è un valore accettato

Ex. 4: Per x=11, l'uscita è22.4

Ex. 5: Per x=30, l'output è 60536.4444444444, o qualsiasi altra approssimazione ravvicinata, come60536.444


Classifica:


Per cambiare il leader, invia una soluzione valida più breve. Il tuo codice dovrebbe essere il più breve possibile, poiché si tratta di , quindi vince la risposta più breve in byte. In bocca al lupo!


Il risultato può essere restituito come una frazione esatta anziché un decimale arrotondato?
Martin Ender,

Sì certo, purché sia ​​il valore corretto.
Ha

Se la risposta è data come una frazione, la frazione deve essere ridotta?
DLosc

Dipende da te. Puoi ridurlo se vuoi, ma non credo sia necessario.
Mr. Xcoder

Aggiorna la risposta accettata.
Erik the Outgolfer

Risposte:


5

In realtà , 10 byte

Codice:

R♂F;Mr♂P∩æ

Spiegazione:

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.

Utilizza la codifica CP-437 . Provalo online!


Caspita, fatto un lavoro del genere in soli 10 byte. Degno di nota!
Mr. Xcoder

12

Python 2 , 71 byte

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

Provalo online!

Python non ha utili utili aritmetici per questo, quindi facciamo le cose a mano. Il codice scorre attraverso i numeri di Fibonacci a a,b=b,a+bpartire da a=b=1.

Il test di primalità Fermat con base 2 viene utilizzato per identificare i numeri primi come adove 2^a == 2 (mod a). Sebbene questo controlli solo per probabili numeri primi, nessuno dei falsi positivi si trova nei primi 40 numeri di Fibonacci.

La somma se il conteggio correnti cdei numeri primi vengono aggiornati ogni volta che si incontra un numero primo e il loro rapporto (la media) viene stampato alla fine. Poiché il controllo primo a=2non viene eseguito ed è garantito che rientri nell'intervallo di input, la somma inizia da 2 e il conteggio inizia da 1 per compensare.


8

Gelatina , 11 byte

ÆḞ€ÆPÐfµS÷L

Provalo online!

Come funziona

ÆḞ€Æ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.

11
Un solido 2 di 3 su built-in di matematica. Fibonacci, controlla. Primalità, controllo. Media aritmetica, no.
xnor

Ho cambiato la risposta accettata, perché ne è stata pubblicata una più breve.
Mr. Xcoder

7

Mathematica, 38 byte

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

(* or *)

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

Spiegazione

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 *)

2
Penso che tu voglia #e no #-1: l'OP afferma che 55 è il decimo numero di Fibonacci, quindi la loro lista deve essere indicizzata a 0 (come è la migliore convenzione). Confronta il tuo output per input 10e 11con l'OP. Fortunatamente questo in realtà ti fa risparmiare tre byte!
Greg Martin

È possibile eliminare &e sostituire #con x(la domanda indica che il codice di immissione non viene assegnato)
CalculatorFeline

6

Perl 6 , 51 byte

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

Provalo

Allargato:

{
  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)
}

5

MATL , 16 byte

lOi:"yy+]vtZp)Ym

Provalo online!

Spiegazione

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

4

Ottava , 75 71 byte

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

Funzione anonima che utilizza la formula di Binet . L'input e l'output sono in forma di argomenti di funzione.

Provalo online!


1
+1 per l'interessante utilizzo della formula di Binet, combinata con quella integrata isprimeche è perfetta per questa sfida.
Mr. Xcoder

4

Maxima, 49 byte

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

4

Prolog (SWI) , 269 264 254 218 byte

  • Grazie a Fatalize per aver salvato 37 byte!
  • Grazie a Emigna per aver salvato 9 byte!

Sono abbastanza certo che potrei golf di qualche byte in più in basso.

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.

Eseguilo come a(15, R).per x = 15 , R è la variabile di output.

Provalo online!


Una versione più leggibile:

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).

1
Giocare a golf in SWI Prolog è d'oro (e molto duro), quindi un bel lavoro!
Mr. Xcoder

Sono abbastanza sicuro che cose del genere N*C:-siano consentite per le dichiarazioni di testa in PPCG, il che può farti risparmiare qualche byte.
Fatalizza il

@Fatalize Ho appena imparato questo linguaggio di programmazione circa una settimana fa, quindi non sono sicuro di cosa intendi: p. Intendi sostituirlo p(N,C):-con N*C:-?
Adnan,

@Adnan Exactly!
Fatalizza il

@Fatalizza Oohhh, è davvero pulito! Grazie :).
Adnan,

3

Röda , 98 94 93 byte

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]}

È una funzione che restituisce il risultato come numero in virgola mobile.

Versione non golfata:

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
}

Puoi fare c%p>0invece di c%p!=0?
Kritixi Lithos

@KritixiLithos Sì! Grazie.
Fergusq,

3

05AB1E , 13 byte

!ÅF¹£DpÏDOsg/

Provalo online! o come una suite di test

Spiegazione

!Å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


2

dc , 129 byte

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

Un generatore di numeri Fibonacci e un controllo di primalità tutto in uno. Bello.

Provalo online!


2

Japt , 14 byte

ò@MgXÃfj
x /Ul

Provalo


Spiegazione

Input implicito di numero intero U.
30

ò

Genera un array di numeri interi da 0 a Uinclusi.
[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]

@   Ã

Passa ogni numero intero attraverso una funzione.

MgX

Ottieni il Xnumero di Fibonacci, dove si Xtrova l'elemento corrente.

[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

Filtra ( f) l'array su quegli elementi che restituiscono la verità quando vengono controllati per primality ( j). Assegna implicitamente l'array risultante alla variabile U.
[2,3,5,13,89,233,1597,28657,514229]

x

Ridurre l'array sommando.
544828

/Ul

Dividi il risultato per la lunghezza dell'array ( l) e genera implicitamente il risultato.
60536.444444444445


Wow, adoro le nuove risposte a vecchie domande. Anche vicino alle altre lingue del golf, quindi +1.
Mr. Xcoder,

1

perl, 91 byte

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

Cuold è stato più corto di 8 byte se il test del modulo pseudoprime ha funzionato altrettanto bene in perl come nella risposta python:

$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

... ma questo dà una risposta errata per input> 16 in perl.


1

Assioma, 104 byte

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)

non golfato, codice test e risultati

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]]

provo a duplicare la voce delle lingue matematica, ottava ecc., se non si conta la funzione mean (), per implementarla sarebbe qui anche 62 byte così buono

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]))

1

JavaScript ES6, 137 136 118 113 byte

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))


Storia

118 byte

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 byte

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 byte

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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.