Introducción
La secuencia de Gijswijt ( A090822 ) es realmente famosa, REALMENTE lenta. Para ilustrar:
- Los primeros 3 aparecen en el noveno término (está bien).
- Los primeros 4 aparecen en el término 220 (muy lejos, pero factible).
- Los primeros 5 aparecen en (aproximadamente) el término 10 ^ (10 ^ 23) (solo no).
- Nadie sabe realmente dónde están los primeros 6 ... se sospecha que está en el ...
2 ^ (2 ^ (3 ^ (4 ^ 5))) th término.
Puede suponer que no tendrá que lidiar con un número de dos dígitos.
La secuencia se genera así:
- El primer término es 1.
- Cada término después de eso es la cantidad de "bloques" repetidos anteriores (si hay múltiples "bloques" repetidos, se usa la mayor cantidad de bloques repetidos).
Para aclarar, aquí están los primeros términos.
1 -> 1, 1
(un bloque repetitivo ( 1
), por lo que el dígito registrado es 1
)
1, 1 -> 1, 1, 2
(dos bloques repetidos ( 1
), por lo que el dígito registrado es 2
)
1, 1, 2 -> 1, 1, 2, 1
(un bloque repetitivo ( 2
o 1, 1, 2
), por lo que el dígito registrado es 1
)
1, 1, 2, 1 -> 1, 1, 2, 1, 1
(entiendes la idea)
1, 1, 2, 1, 1 -> 1, 1, 2, 1, 1, 2
1, 1, 2, 1, 1, 2 -> 1, 1, 2, 1, 1, 2, 2
(dos bloques repetidos ( 1, 1, 2
), por lo que el dígito registrado es 2
)
Tarea
Su tarea es, como se indica en la pregunta, generar n dígitos de la secuencia de Gijswijt.
Instrucciones
- La entrada será un número entero
n
. - Su código puede generar los dígitos en cualquier forma (una lista, múltiples salidas, etc.).
Este es el código de golf, por lo que gana el código más corto en bytes.
._
función y otras funciones útiles en Pyth.CJam,
33313027 bytesGracias a Peter Taylor por guardar 1 byte.
Pruébalo aquí.
Explicación
fuente
CJam (
30 29 2724 bytes)Demostración en línea
Este es un esfuerzo conjunto con Martin.
e`
) para identificar repeticiones es de MartinW$
para simplificar la gestión de la pila$W>+
una carcasa especial, como se explica en la disección a continuación.Mi primer enfoque de 30 bytes:
Demostración en línea
Disección
fuente
Haskell, 97 bytes
La tercera línea define una función anónima que toma un entero y devuelve una lista de enteros. Véalo en acción.
Explicación
La función auxiliar
f
construye la secuencia en reversa, verificando recursivamente si la secuencia anterior comienza con un bloque repetido.k
es el número de repeticiones yp
es la longitud del bloque.fuente
Pyth,
4138 bytesPruébalo en línea!
fuente
Retina ,
6660 bytesLa entrada es un entero unario que se usa
!
como dígito (aunque eso podría cambiarse a cualquier otro carácter no numérico). La salida es simplemente una cadena de dígitos.Pruébalo en línea! (Alternativamente, por conveniencia, aquí hay una versión que toma entrada decimal )
Para fines de prueba, esto se puede acelerar mucho con una pequeña modificación, lo que permite probar la entrada 220 en menos de un minuto:
Pruébalo en línea! ( Versión decimal ) .
Si desea probar números aún más grandes, es mejor alimentarlo con una entrada masiva y poner un
:
después de la inicial+
. Esto hará que Retina imprima la secuencia actual cada vez que termine de calcular un nuevo dígito (con todos los dígitos desactivados por uno).Explicación
La solución consiste en una única sustitución de expresiones regulares, que se aplica a la entrada repetidamente hasta que el resultado deja de cambiar, lo que en este caso ocurre porque la expresión regular ya no coincide. El
+
al principio introduce este bucle. El1
es un límite que le dice a Retina que solo reemplace la primera coincidencia (esto solo es relevante para la primera iteración). En cada iteración, la etapa reemplaza una!
(desde la izquierda) con el siguiente dígito de la secuencia.Como de costumbre, si necesita una introducción a los grupos de equilibrio, lo remito a mi respuesta SO .
Aquí hay una versión anotada de la expresión regular. Tenga en cuenta que el objetivo es capturar el número máximo de bloques repetidos en el grupo
1
.Finalmente, una vez hecho todo esto, reescribimos
$1
(eliminando así!
) el número de capturas en el grupo con el$#1
que corresponde al número máximo de repeticiones.fuente
Ruby, 84 bytes
La respuesta de Retina me inspiró a hacer una solución basada en expresiones regulares para encontrar la mejor secuencia en lugar de contar de alguna manera las secuencias en una matriz, pero con menos genio (las miradas negativas con cuantificadores no parecen estar permitidas en Ruby, así que dudo Podría portar directamente la respuesta de Retina de todos modos)
Dada una secuencia ya generada
s
, se asigna sobre todoi
desde1
hastas.length
(n
se usó en este caso para guardar bytes desde entoncesn>=s.length
) y luego usa esta expresión regular para ayudar a calcular el número de repeticiones de una subsecuencia con longitudi
:Si se encuentra una coincidencia de esa longitud, calcula el número de repeticiones dividiendo la longitud de la coincidencia dada
$&
pori
, la longitud de la subsecuencia; Si no se encuentra ninguna coincidencia, se trata como1
. La función luego encuentra el número máximo de repeticiones de esta asignación y agrega ese número al final de la cadena.fuente