Juguemos un juego para un jugador llamado Jump the array . Para jugar, solo necesitas una variedad de enteros, por ejemplo a. Comienzas en alguna posición i, y en cada turno, saltas a una nueva posición. A su vez n,
- si
nes par, saltas a la posición absolutaa[i] mod length(a), - si
nes extraño, saltas a la posición relativa(i + a[i]) mod length(a).
La indexación de la matriz comienza en cero. Puedes contar el primer salto como turno 0o turno 1, lo que da un juego diferente. Dado que el espacio de estado del juego es finito (su movimiento está determinado por su posición y la paridad del número de turno), por supuesto, eventualmente entrará en un bucle de longitud uniforme. Denote por loop(a, i, b)la longitud de este bucle, cuando el primer salto se cuenta como giro b.
Entrada
Un conjunto no entero ade enteros para jugar.
Salida
El número máximo ptal que, cuando comience en alguna posición iy cuente el primer turno como 0o 1, eventualmente ingrese un bucle de longitud 2 * p. En otras palabras, su salida es el número
max { loop(a, i, b)/2 : i in [0 .. length(a)-1], b in [0,1] }
Reglas
Puedes dar una función o un programa completo. El recuento de bytes más pequeño gana, y las lagunas estándar no se permiten.
Casos de prueba
[0] -> 1
[-213] -> 1
[1,3,12,-1,7] -> 1
[2,3,5,7,9,11,13,17,19] -> 2
[-2,3,-5,7,-9,11,-13,17,-19,23,-27] -> 3
[0,2,5,4,-9,0,-1,1,-1,1,-6] -> 4

modse define como siempre positivo (-1 mod 5 == 4) a diferencia de C. ¿Es ese el caso?mod, que siempre da resultados no negativos.Respuestas:
Pyth : 28 caracteres (Python 2: 116 caracteres)
Uso:
Pruébelo aquí: Pyth Compiler / Executor
Espera una lista de enteros como entrada
[0,2,5,4,-9,0,-1,1,-1,1,-6]Explicación:
Noté una propiedad importante de la función
loop: para cadaihay unj, así queloop(a,i,0) == loop(a,j,1)y viceversa. Por lo tanto, solo necesitamos calcular los valoresloop(a,i,b)parab=0.Prueba: si el es un ciclo
i -> j -> k -> ... -> z -> iconb = 0, entonces existe el cicloj -> k -> ... -> z -> i -> jconb = 1.Por lo tanto, un script simple puede funcionar de la siguiente manera. Iterar sobre todo
iy tratar de llegarimediante la computación iterativai = a[(i + a[i]) mod len(a)] mod len(a). Dado que este cálculo puede encontrarse en un ciclo sini, cancelamos el cálculo después de loslen(a)pasos. Luego imprimimos el ciclo máximo.Una implementación de Python 2 se ve así ( 125 caracteres }:
Para la implementación de Pyth, utilicé un enfoque un poco diferente. Para cada uno
icalculo la lista de posiciones, y buscoien esta lista.editar: Python 2: 116 caracteres
La solución de @proud haskeller tenía unos pocos caracteres menos que mi solución de Python, por lo tanto, tuve que acortarla un poco.
La diferencia es que calculo el número de forma recursiva en lugar de iterativa.
fuente
Python - 157
fuente
len(a)una variable y reemplaza todos loslen(a)s con el nombre de esa variable, puede guardar algunos caracteres.t+=1;t%=2->t^=1yif t: j=(j+a[j])%z else: j=a[j]%z->j=(t*j+a[j])%zwhile c not in s[:-1]:podría serwhile(c in s[:-1])-1:.j, ya que este bucle asigna el contenido derange(z)a enilugar de incrementarlo. Simplemente reemplacejconipara guardar 4 caracteres.Haskell,
120105esto genera una lista infinita para cada punto de partida (por razones de golf iteramos sobre todos los valores en lugar de todos los índices, que son equivalentes). luego calcula el ciclo de cada lista (la duración del ciclo de
xsesxs % []).utiliza las observaciones de @ jakubes sobre los ciclos. Debido a que avanza 2 pasos a la vez, no necesitamos dividir entre 2 al final.
Editar : ahora usa el truco de @ MthViewMark de soltar los primeros
nelementos para garantizar tener un ciclo con el primer elemento. por cierto, logré desarrollar su algoritmo para112personajes:fuente
Haskell - 139 caracteres
Ejemplos:
Esto hace uso de la observación de @ jakube de que solo necesita verificar la mitad de los valores iniciales, mientras realiza 2 pasos por iteración.
fuente
whereel anterior]. Además, ¿intentaste usar encycle l!!ilugar del!!mod n(length l)?by usar un protector de patrón|n<-l apara eliminar elwhere.Python, 160
La función para la respuesta es
j.La función recursiva
ldevuelve la longitud del bucle para una matriz dada, inicio y primer turno, y la funciónjencuentra el máximo.fuente
lambda.Mathematica,
189162161bytesSi se permiten funciones anónimas - 161 bytes:
De lo contrario, 163 bytes:
Ejecutando esto en todos los casos de prueba:
Resultados en:
Python 2, 202 bytes
MANIFESTACIÓN
Este es casi un puerto de mi respuesta de Mathematica.
fuente
Forcon 3 argumentos suele ser más corto queWhile(ya que puede guardar en un punto y coma delante deFor).Mathematica,
113112 caracteresEjemplo:
fuente
ised 82
El primer argumento no cuenta en longitud (inicialización de matriz
$1ebinicialización en$2- seleccione el "juego").fuente