La secuencia de Fibonacci es una secuencia bien conocida en la que cada entrada es la suma de las dos anteriores y las dos primeras entradas son 1. Si tomamos el módulo de cada término por una constante, la secuencia se volverá periódica. Por ejemplo, si decidimos calcular la secuencia mod 7 obtendríamos lo siguiente:
1 1 2 3 5 1 6 0 6 6 5 4 2 6 1 0 1 1 ...
Tiene un período de 16. Una secuencia relacionada, llamada secuencia de Pisano , se define de manera tal que a(n)
es el período de la secuencia de Fibonacci cuando se calcula el módulo n.
Tarea
Deberá escribir un programa o función que, cuando se proporcione n
, calculará y generará el período del mod de secuencia de Fibonacci n
. Ese es el enésimo término en la secuencia de Pisano.
Solo debe admitir enteros en el rango 0 < n < 2^30
Esta es una competencia de código de golf , por lo que debe intentar minimizar el tamaño de su código fuente según la puntuación por bytes.
Casos de prueba
1 -> 1
2 -> 3
3 -> 8
4 -> 6
5 -> 20
6 -> 24
7 -> 16
8 -> 12
9 -> 24
10 -> 60
11 -> 10
12 -> 24
f(i),f(i+1)
puede tomar en la mayoría de losn^2
valores modn
. Por lo tanto,n
limitado a2^30
podría terminar produciendo un período de hasta2^60
. Restringirían <= 2^16
daríaP(n) <= 2^32
.f(i+2) = f(i+1)+f(i)
, por lo que el 'estado' de una máquina en bucle durante el período se puede describir con un par de mods de enterosn
. Hay en la mayoría de losn^2
estados, por lo que el período es como máximon^2
. Oh! Wikipedia afirma que el período es como máximo6n
. No importa mi trivialidad.Respuestas:
GolfScript (
28 25 2423 caracteres)Toma entrada en stdin, la deja en stdout (o en la pila, si desea procesarla más ...)
Esto maneja correctamente los casos de esquina ( Demo ).
Como un punto de interés para los programadores de GolfScript, creo que este es el primer programa que he escrito con un despliegue que en realidad salió más corto que los otros enfoques que probé.
fuente
GolfScript, 24 caracteres
Próxima iteración de una implementación de GolfScript. La segunda versión ahora también maneja 1 correctamente. Se hizo bastante largo, pero tal vez alguien pueda encontrar una manera de acortar esta versión. Puede probar la versión anterior en línea .
fuente
1
correctamente?1
, y todavía solo tiene 24 caracteres.Python,
1881321019587 caracteresUso
Por ejemplo:
fuente
cat
tingwc -c
y obtengo el mismo número.if k>0 and s[0:k]==s[k:]:break
se puede cambiar aif s and s[:k]==s[k:]:break
. También puede reducir significativamente eliminando el iterador, cambiando elfor
ciclo awhile 1:
y realizandoa,b=a,a+b
al final del ciclo while.Pitón
908596949082Editar: sugerencias implementadas por beary y primo
fuente
a.append(c) -> a+=[c]
mientras que el bucle se puede poner en una sola línea,((n>1)>>(c in a)) -> (n>1)>>(c in a)
append
en realidad tiene una funcionalidad diferente que+=
. Gracias por los consejos sin embargo.(n>1)>>(c in a)
->
(c in a)<1%n
por 3 bytes. Y estoy de acuerdo con Beary sobre el anexo. Ya sea que agregue una referenciac
o se extiendaa
por el valor dec
, es exactamente lo mismo de cualquier manera (ya que destruye inmediatamente su referencia dec
todos modos).a+=c
lugar dea+=[c]
Mathematica 73
fuente
PHP -
6157 bytesEste script informar erróneamente
2
an=1
, pero todos los demás valores son correctos.Muestra de E / S, una serie truncable a la izquierda donde π (n) = 2n + 2:
fuente
1<$a.$b=+$a+$a=!$i+++$b%$n+=fgets(STDIN)
Oh dios, ese es un orden de explotación de explotación allí mismo.PowerShell: 98
Código de golf:
Sin golf, con comentarios:
Notas:
No estoy seguro exactamente cuál es el límite máximo confiable para $ n con este script. Es posiblemente menos de 2 ^ 30, ya que $ x podría desbordar un int32 antes de que $ n llegue allí. Además de eso, no he probado el límite superior porque los tiempos de ejecución del script ya alcanzaron alrededor de 30 segundos en mi sistema por $ n = 1e7 (que es solo un poco más de 2 ^ 23). Por la misma razón, no me inclino rápidamente a probar y solucionar cualquier sintaxis adicional que pueda ser necesaria para actualizar las variables a uint32, int64 o uint64 cuando sea necesario para expandir el rango de este script.
Salida de muestra:
Envolví esto en otro bucle for:
Luego configure en
$n=$i
lugar de=read-host
, y cambie la salida a"$i | $x"
para tener una idea de la confiabilidad general del script. Aquí hay algunos de los resultados:...
Nota al margen:
no estoy realmente seguro de cómo algunos períodos de Pisano son significativamente más cortos que $ n. ¿Es esto normal o hay algo mal con mi script?No importa: acabo de recordar que, después de 5, los números de Fibonacci rápidamente se vuelven mucho más grandes que su lugar en la secuencia. Entonces, esto tiene mucho sentido ahora.fuente
Perl,
75,61, 62 + 1 = 63Uso
Sin golf
+1 byte para
-n
bandera. Afeitado 13 bytes gracias a Gabriel Benamy.fuente
$n=<>;
(-6) y reemplazarlo con la-n
bandera (+1), luego todas las instancias de$n
pueden reemplazarse con$_
. Puede usar-M5.010
de forma gratuita, lo que le permite usar elsay
comando en lugar deprint
(-2). Laswhile
instrucciones modificadoras no necesitan paréntesis alrededor de la condición (-2). En lugar de@{[%h]}/2
, puede tener un contador$a++,
antes($m,$k)=
y luego tenerlosay$a-1
al final (-2). En lugar de"$m,$k"
uso$m.$k
(-2). Esto debería salir$k=1%$_;$a++,($m,$k)=($k,($m+$k)%$_)while!$h{$m.$k}++;say$a-1
con la-n
bandera, para 61 + 1 = 62 bytes."$m,$k"
lugar de$m.$k
(+2), pero puede guardar 1 byte cambiandowhile!$h
auntil$h
(-1). ¡Lo siento!$m.$k
falla? Parecía funcionar de mi parte.Clojure, 102 bytes
No es demasiado emocionante, itera la fórmula hasta que volvamos
[1 1]
(espero que este sea siempre el caso). Manejo especial de(f 1)
como converge[0 0]
.fuente