Media aritmética de los números primos de Fibonacci hasta el x número de Fibonacci


18

Deberías haber escuchado sobre los números de Fibonacci , a menudo llamados la secuencia de Fibonacci. En esta secuencia, los dos primeros términos son 0 y 1, y cada número después de los dos primeros es la suma de los dos anteriores. En otras palabras, F(n) = F(n-1) + F(n-2).

Aquí están los primeros 20 números de Fibonacci:

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

Tarea:

Dado un número entero x, calcule la media aritmética (el promedio) de los números primos de Fibonacci hasta el xnúmero de la secuencia de Fibonacci.

Reglas:

  • la secuencia de Fibonacci comienza con 0 y 1 para este desafío
  • 3 < x < 40, porque los valores más altos de xpodrían causar un tiempo de ejecución enorme o desbordamientos y los valores más pequeños no tienen salida
  • 1 NO es primo, ya que solo tiene 1 divisor
  • la media aritmética debe incluir decimales, si es el caso, o debe mostrarse como una fracción exacta
  • solo se le permite tomar xcomo entrada y el código necesario para tomar la entrada no cuenta (por ejemplo: si necesita algo así x = input(), no debe tenerlo en cuenta al contar los bytes)

Ejemplos:

Ex. 1: Para x=10, la salida es 5.75, porque el décimo número de Fibonacci es 55y los números primos de Fibonacci 55son 2, 3, 5, 13, siendo su promedio5.75

Siguiendo la explicación del ejemplo 1, otros ejemplos son:

Ex. 2: para x=15, la salida es57.5

Ex. 3: Para x=20, la salida es 277.428571428571, o cualquier otra aproximación cercana. En este caso 277.4286, por ejemplo, es un valor aceptado

Ex. 4: parax=11 , la salida es22.4

Ex. 5: Para x=30, la salida es 60536.4444444444, o cualquier otra aproximación cercana, como60536.444


Tabla de clasificación:


Para cambiar el líder, envíe una solución válida más corta. Su código debe ser lo más corto posible, ya que es , por lo que gana la respuesta más corta en bytes. ¡Buena suerte!


¿Se puede devolver el resultado como una fracción exacta en lugar de un decimal redondeado?
Martin Ender

Sí, por supuesto, siempre que sea el valor correcto. Editó la pregunta :))
Sr. Xcoder

Si la respuesta se da como una fracción, ¿se debe reducir la fracción?
DLosc

Eso depende de usted. Puede reducirlo si lo desea, pero no creo que sea necesario.
Sr. Xcoder

Actualiza la respuesta aceptada.
Erik the Outgolfer

Respuestas:


5

En realidad , 10 bytes

Código:

R♂F;Mr♂P∩æ

Explicación:

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.

Utiliza la codificación CP-437 . Pruébalo en línea!


Wow, hice tal trabajo en solo 10 bytes. ¡Impresionante!
Sr. 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

Pruébalo en línea!

Python no tiene funciones aritméticas útiles para esto, por lo que hacemos las cosas a mano. El código itera a través de los números de Fibonacci a través dea,b=b,a+b partir de a=b=1.

La prueba de primalidad de Fermat con base 2 se utiliza para identificar primos como adónde 2^a == 2 (mod a). Aunque esto solo comprueba posibles números primos, ninguno de los falsos positivos está dentro de los primeros 40 números de Fibonacci.

La suma actual sy el recuento cde primos se actualizan cada vez que se encuentra un primo, y su relación (la media) se imprime al final. Debido a que la verificación principal falla a=2y se garantiza que está en el rango de entrada, la suma comienza en 2 y la cuenta comienza en 1 para compensar.


8

Jalea , 11 bytes

ÆḞ€ÆPÐfµS÷L

Pruébalo en línea!

Cómo funciona

ÆḞ€Æ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 sólido 2 de 3 en matemáticas incorporadas. Fibonacci, cheque. Primalidad, cheque. Media aritmética, no.
xnor

He cambiado la respuesta aceptada, porque se publicó una más corta.
Sr. Xcoder

7

Mathematica, 38 bytes

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

(* or *)

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

Explicación

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
Creo que quiere #y no #-1: el OP dice que 55 es el décimo número de Fibonacci, por lo que su lista debe estar indexada a 0 (como es la mejor convención). Compare su salida para entradas 10y 11con el OP. Afortunadamente, esto realmente te ahorra tres bytes.
Greg Martin

Puede soltar &y reemplazar #con x(la pregunta dice que el código de entrada no está calificado)
CalculatorFeline

6

Perl 6 , 51 bytes

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

Intentalo

Expandido:

{
  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 bytes

lOi:"yy+]vtZp)Ym

Pruébalo en línea!

Explicación

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

Octava , 75 71 bytes

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

Función anónima que usa la fórmula de Binet . La entrada y la salida están en forma de argumentos de función.

Pruébalo en línea!


1
+1 por el uso interesante de la fórmula de Binet, combinada con el incorporado isprimeque es perfecto para este desafío.
Sr. Xcoder

4

Máximo, 49 bytes

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

4

Prólogo (SWI) , 269 264 254 218 bytes

  • Gracias a Fatalize por guardar 37 bytes!
  • ¡Gracias a Emigna por guardar 9 bytes!

Estoy bastante seguro de que podría jugar algunos bytes más hacia abajo.

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.

Ejecútelo como a(15, R).para x = 15 , R es la variable de salida.

Pruébalo en línea!


Una versión más legible:

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
Jugar al golf en SWI Prolog es dorado (y muy duro), ¡tan buen trabajo!
Sr. Xcoder

Estoy bastante seguro de que N*C:-se permiten cosas como las declaraciones de encabezado en PPCG, que pueden ahorrarle algunos bytes.
Fatalize

@Fatalize Acabo de aprender este lenguaje de programación hace aproximadamente una semana, así que no estoy seguro de lo que quieres decir: p. Qué quiere decir sustituir p(N,C):-con N*C:-?
Adnan

@Adnan Exactamente!
Fatalize

@ Fatalize Oohhh, ¡eso es genial! Gracias :).
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 una función que devuelve el resultado como un número de coma flotante.

Versión sin golf:

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
}

¿Se puede hacer en c%p>0lugar de c%p!=0?
Kritixi Lithos

@KritixiLithos ¡Sí! Gracias.
fergusq

3

05AB1E , 13 bytes

!ÅF¹£DpÏDOsg/

Pruébalo en línea! o como un conjunto de pruebas

Explicación

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

cc , 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

Un generador de números de Fibonacci y un verificador de primalidad, todo en uno. Agradable.

Pruébalo en línea!


2

Japt , 14 bytes

ò@MgXÃfj
x /Ul

Pruébalo


Explicación

Entrada implícita de entero U.
30

ò

Genere una matriz de enteros de 0 a Uinclusive.
[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]

@   Ã

Pase cada número entero a través de una función.

MgX

Obtenga el Xnúmero de Fibonacci, donde Xestá el elemento actual.

[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) la matriz a aquellos elementos que devuelven la verdad cuando se verifica la primalidad ( j). Asigna implícitamente la matriz resultante a la variable U.
[2,3,5,13,89,233,1597,28657,514229]

x

Reduzca la matriz sumando.
544828

/Ul

Divida el resultado por la longitud de la matriz ( l) y genere el resultado implícitamente.
60536.444444444445


Wow, me encantan las nuevas respuestas a viejas preguntas. También cerca de los otros idiomas de golf, entonces +1.
Sr. 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 ha sido 8 bytes más corto si la prueba de módulo pseudoprime funcionó tan bien en Perl como en la respuesta de 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

... pero esto da una respuesta incorrecta para la entrada> 16 en perl.


1

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

sin golf, código de prueba y resultados

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

i tratar de duplicar la matematica, octava entrada, etc idiomas, si uno no cuenta la función de la media (), para poner en práctica, sería aquí 62 bytes tan bueno también

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


Historia

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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.