Encuentra el enésimo Fibonnaci Prime, en el código más corto

8

El desafío es bastante simple:

  1. Tome un número entero positivo ncomo entrada.
  2. Salida del nnúmero primo de Fibonacci.

La entrada puede ser como un parámetro para una función (y la salida será el valor de retorno), o puede tomarse de la línea de comando (y enviarse allí).

Nota: No se permite el uso de funciones de verificación principales integradas o generadores de la serie Fibonacci.

¡Buena suerte!

Chinche de tinta
fuente
1
posible duplicado de la función o secuencia
Keith Randall
1
¿Hay un límite para el tamaño?
MrZander
@MrZander Tamaño de qué?
Inkbug
Tamaño de entrada / salida. ¿Debo dar cuenta de prime_fib (1000000000000000000)? ¿Dónde está el límite?
MrZander
@MrZander El algoritmo debe admitir números arbitrariamente grandes, pero la función puede generar una excepción fuera de límite si el resultado es demasiado grande para un int normal.
Inkbug

Respuestas:

2

Rubí, 55

f=->n,a=1,b=2{n<1?a:f[n-(2..b).find{|f|b%f<1}/b,b,a+b]}

Se llama de forma recursiva, haciendo un seguimiento de los dos últimos números en la secuencia de Fibonacci en ay b, y con cuántos primos se ha visto hasta ahora n. nse decrementa cuando el factor más pequeño mayor que 1 de b, dividido por by redondeado al entero más cercano, es 1 en lugar de 0, lo que ocurre solo para primo b. Cuando ve todos los números primos que se supone que debe ver, imprime a, que es la bprueba más reciente de primalidad.

histocrat
fuente
4

C, 66

f(n,a,b){int i=2;while(a%i&&i++<a);return(n-=i==a)?f(n,b,a+b):a;}

Gautama
fuente
2
Creo que debería definir los valores iniciales de ay bdentro de su función.
defhlt
¿No sería un ciclo for más corto? (No conozco bien C)
Inkbug
1
Se puede reducir a 65 caracteres: f(n,a,b){int i=2;while(a%i&&i++<a);return(n-=i==a)?f(n,b,a+b):a;}- @ArtemIce: a= 1 y b= 2 funcionó para mí.
schnaader
2
@schnaader, por supuesto, funcionaron, pero el código que establece a & b debe contarse porque es codegolf
defhlt
3
Carece de código de inicialización para a & b ... Entonces, ¿puede mejorar con solo agregar g(n){f(n,1,2);}?
conejo de bebé
3

C, 85 , 81 , 76

f(n){int i=1,j=0,k;for(;n;n-=k==i)for(j=i-j,i+=j,k=2;i%k&&k++<i;);return i;}
  • estilo de código prestado de verificación simplificada de números primos de @Gautam

  • función C autónoma (sin globals)

Pruebas:

main(int n,char**v){printf("%d\n",f(atoi(v[1])));}

./a.out 10
433494437

./a.out 4
13
conejo bebé
fuente
2

Mathematica, 59 o 63 bytes

(a=b=1;Do[While[{a,b}={b,a+b};Length@Divisors@b>2],{#}];b)&
(a=b=1;Do[While[{a,b}={b,a+b};b~Mod~Range@b~Count~0>2],{#}];b)&

Estas son funciones sin nombre que toman ncomo entrada y devuelven el primo correcto de Fibonacci. La versión más corta usa Divisors. No estoy completamente seguro de si esto está permitido, pero la otra respuesta de Mathematica incluso lo usa FactorInteger.

El segundo no utiliza ninguna función relacionada con la factorización, sino que cuenta el número de números enteros más pequeños que los nque se producen 0en una operación de módulo. Incluso esta versión supera todas las presentaciones válidas, pero estoy seguro de que solo publicar esta respuesta hará que algunas personas proporcionen respuestas competitivas en GolfScript, APL o J.;)

Martin Ender
fuente
1

Mathematica 147 143 141 caracteres

f@0 = 0; f@1 = 1; f@n_ := f[n - 1] + f[n - 2]
q@1 = False; q@n_ := FactorInteger@n~MatchQ~{{_, 1}}
p = {}; k = 1; While[Length@p < n, If[q@f@k, p~AppendTo~f[k]]; k++];p[[-1]]

f es la definición recursiva del número de Fibonacci.

q detecta primos.

kes un primo de Fibonacci si q@f@kes verdadero.

Para n= 10, la salida es 433494437.

DavidC
fuente
oh dios, inducción ...: estremecimientos:
acólito
@acolyte Es divertido mirar un rastro de una función que se llama a sí misma.
DavidC
Persona: Ese fue uno de los cursos que confirmó que necesitaba sacar el truco de CompSci.
acólito
1

Rubí, 94 68 67

n=->j{a=b=1
while j>0
a,b=b,a+b
(2...b).all?{|m|b%m>0}&&j-=1
end
b}





Clojure, 112

Sin golf:

(defn nk [n]
  (nth 
    (filter
      (fn[x] (every? #(> (rem x %) 0) (range 2 x)))    ; checks if number is prime
      ((fn z[a b] (lazy-seq (cons a (z b (+ a b))))) 1 2)) ; Fib seq starting from [1, 2]
    n)) ; get nth number

Golf: (defn q[n](nth(filter(fn[x](every? #(>(rem x %)0)(range 2 x)))((fn z[a b](lazy-seq(cons a(z b(+ a b)))))2 3))n))

defhlt
fuente
1

Haskell 108

p=2 : s [3,5..]  where
    s (p:xs) = p : s [x|x<-xs,rem x p /= 0]
f=0:1:(zipWith (+) f$tail f)
fp=intersect p f

Para obtener el nnúmero llámalo fp !! n.

EDITAR: Sic. Respuesta incorrecta, lo arreglo.

Hauleth
fuente
0

Groovy: 105 (134 con espacios en blanco)

b Es la función de Fibonacci.

el cierre dentro del if es la función de verificación principal. Actualización: una pequeña solución

r es el primer número de fibonacci.

r={ n->
  c=k=0
  while(1) {
    b={a->a<2?a:b(a-1)+b(a-2)}
    f=b k++
    if({z->z<3?:(2..<z).every{z%it}}(f)&&c++==n)return f
  }
}

Casos de prueba:

assert r(0) == 0
assert r(1) == 1
assert r(2) == 1
assert r(3) == 2
assert r(4) == 3
assert r(5) == 5
assert r(6) == 13
assert r(7) == 89
assert r(8) == 233
assert r(9) == 1597

Una versión legible:

def fib(n) { 
  n < 2 ? n : fib(n-1) + fib(n-2)
}
def prime(n) {
  n < 2 ?: (2..<n).every { n % it }
}
def primeFib(n) { 
  primes = inc = 0
  while( 1 ) {
    f = fib inc++
    if (prime( f ) && primes++ == n) return f
  }
}
Will Lp
fuente
0

C, 105 (con espacios)

Implementación de Fibonacci mediante programación dinámica:

long f(int n){int i;long b2=0,b1=1,n;if(n)return 0;for(i=2;i<n;i++){n=b1+b2;b2=b1;b1=n;}return b1+b2;}

Código legible:

long f(int n)
{
  int i;
  long back2 = 0, back1 = 1;
  long next;

  if ( n == 0 ) return 0;

  for ( i=2; i<n; i++ )
  {
    next  = back1 + back2;
    back2 = back1;
    back1 = next;
  }

  return back1 + back2;
}
elp
fuente
¿Cómo puede esto tener 1 voto? No responde la pregunta (sin verificación de primalidad) y la versión corta ni siquiera se compila
edc65
0

Pyth - 29 bytes

Recorre Fibonacci en bucle hasta que la matriz tenga una longitud n, pero solo se agrega a la matriz si es primo.

J2K1W<lYQAJK,+KJJI!tPK~Y]K;eY

Algo lento, pero alcanzó n = 10 en ~ 15 segundos. Probablemente se pueda jugar más al golf.

J2              J=2
K1              K=1
W        <lYQ   While length of array<input
 AJK,+KJJ       J,K=K+J,J
 I!tPK          If K prime(not builtin prime function, uses prime factorization)
  ~Y]K          append K to Y
;               End loop so next is printed
eY              last element of Y
Descargo de responsabilidad: Pyth es más nuevo que este desafío, por lo que no compite.
Maltysen
fuente
-1

Javascript:

Number.prototype.fiboN = function()
{
var r = (Math.pow((1 + Math.sqrt(5)) / 2,this) - (Math.pow(1 - (1 + Math.sqrt(5)) / 2,this))) / Math.sqrt(5);
return r.toFixed(0);
}

alert((10).fiboN()); // = 55 assuming the serie starts with 1,1,2,3,5,8,13,...
alert((46).fiboN()); // = 1836311903
Jón Jónsson
fuente
No responde la pregunta: 55 no es Prime. Sin embargo, es bueno que hayas usado esa relación de Golden Ratio.
Jacob