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
n
es par, saltas a la posición absolutaa[i] mod length(a)
, - si
n
es 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 0
o 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 a
de enteros para jugar.
Salida
El número máximo p
tal que, cuando comience en alguna posición i
y cuente el primer turno como 0
o 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
mod
se 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 cadai
hay 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 -> i
conb = 0
, entonces existe el cicloj -> k -> ... -> z -> i -> j
conb = 1
.Por lo tanto, un script simple puede funcionar de la siguiente manera. Iterar sobre todo
i
y tratar de llegari
mediante 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
i
calculo la lista de posiciones, y buscoi
en 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^=1
yif t: j=(j+a[j])%z else: j=a[j]%z
->j=(t*j+a[j])%z
while c not in s[:-1]:
podría serwhile(c in s[:-1])-1:
.j
, ya que este bucle asigna el contenido derange(z)
a eni
lugar de incrementarlo. Simplemente reemplacej
coni
para 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
xs
esxs % []
).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
n
elementos para garantizar tener un ciclo con el primer elemento. por cierto, logré desarrollar su algoritmo para112
personajes: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
where
el anterior]
. Además, ¿intentaste usar encycle l!!i
lugar del!!mod n(length l)
?b
y usar un protector de patrón|n<-l a
para eliminar elwhere
.Python, 160
La función para la respuesta es
j
.La función recursiva
l
devuelve la longitud del bucle para una matriz dada, inicio y primer turno, y la funciónj
encuentra 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
For
con 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
$1
eb
inicialización en$2
- seleccione el "juego").fuente