Este es un reenvío de un viejo desafío , con el fin de ajustar los requisitos de E / S a nuestros estándares recientes. Esto se hace en un esfuerzo por permitir que más idiomas participen en un desafío sobre esta secuencia popular. Vea esta meta publicación para una discusión de la nueva publicación.
La secuencia de Kolakoski es una secuencia divertida autorreferencial, que tiene el honor de ser la secuencia OEIS A000002 (y es mucho más fácil de entender e implementar que A000001). La secuencia se inicia con 1 , se compone sólo de 1 s y 2 s y el elemento de secuencia de un (n) describe la longitud de la n º plazo de 1 s o 2 s en la secuencia. Esto define de forma única la secuencia que debe ser (con una visualización de las ejecuciones debajo):
1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1,2,1,1,2,1,2,2,1,1,2,1,1,2,...
= === === = = === = === === = === === = = === = = === === = === =
1, 2, 2, 1,1, 2, 1, 2, 2, 1, 2, 2, 1,1, 2, 1,1, 2, 2, 1, 2, 1,...
Su tarea es, por supuesto, implementar esta secuencia. Puede elegir uno de los tres formatos para hacerlo:
- Tome una entrada n y la salida de la n º término de la secuencia, donde n comienza ya sea desde 0 o 1 .
- Tome una entrada n y la salida de los términos hasta e incluyendo el n º término de la secuencia, donde n comienza ya sea desde 0 o 1 (es decir, imprimir o bien la primera n o la primera n + 1 términos).
- Valores de salida de la secuencia indefinidamente.
En el segundo y tercer caso, puede elegir cualquier formato de lista razonable y sin ambigüedades. Está bien si no hay un separador entre los elementos, ya que siempre son un solo dígito por definición.
En el tercer caso, si su envío es una función, también puede devolver una lista infinita o un generador en idiomas que los admitan.
Puede escribir un programa o una función y utilizar cualquiera de nuestros métodos estándar para recibir entradas y proporcionar salidas. Tenga en cuenta que estas lagunas están prohibidas por defecto.
Este es el código de golf , por lo que gana la respuesta válida más corta, medida en bytes .
Respuestas:
Jalea , 7 bytes
Este es un programa completo que imprime los primeros n términos.
Pruébalo en línea!
Cómo funciona
Ejecución de ejemplo
Deje n = 5 .
La primera invocación de la cadena se repite 1, 2 cíclicamente para alcanzar la longitud 5 , luego cada elemento 5 veces y finalmente trunca el resultado a la longitud 5 .
Esto produce una lista de longitud 5 . El primer elemento es el primer elemento de la secuencia de Kolakoski.
La segunda invocación de la cadena repite 1, 2 cíclicamente para alcanzar la longitud 5 , luego repite el elemento k ésimo j veces, donde j es el elemento k ésimo de la lista anterior, y finalmente trunca el resultado a la longitud 5 .
Esto produce otra lista de longitud 5 . Los dos primeros elementos son los dos primeros elementos de la secuencia de Kolakoski.
El proceso continúa durante tres iteraciones más.
Estos son los primeros cinco elementos de la secuencia de Kolakoski.
fuente
Python 2 , 51 bytes
Imprime indefinidamente. Crea la lista a
l
medida que se repite. Para cada entradax
del
, agregax
copias de1
o2
, lo que sea opuesto al último elemento actual.La principal dificultad es tratar con el fragmento inicial autorreferencial
[1,2,2]
. Este código solo imprime la inicial1,2
y procede desde allí. La impresión extra cuesta 12 bytes. Sin eso:39 bytes , faltan las dos primeras entradas:
Otro enfoque es inicializar especialmente las dos primeras entradas. Inicializamos
l
como[0,0,2]
para que las dos primeras entradas no causan anexar, peroprint x or n
los hace ser impresa comon
.51 bytes
Otra solución es inicializar
l=[1]
, rastrear la alternancia manualmenten
y corregir la impresión:51 bytes
Sin el
(l==[1,1])+
, todo funciona excepto las secuencias impresas que comienzan en1,1,2
lugar de1,2,2
. Tiene que haber una mejor manera de reconocer que estamos en este segundo paso.Y otra solución extraña, también de alguna manera el mismo conteo de bytes:
51 bytes
fuente
Wumpus ,
1311 bytesPruébalo en línea!
Imprime la secuencia indefinidamente sin separadores.
Estoy realmente sorprendido por lo breve que es esto.
Explicación
La idea básica es mantener la secuencia en la pila y usar repetidamente el elemento más inferior para generar otra ejecución y luego imprimirla. Estamos abusando efectivamente de la pila como una cola aquí. También podemos guardar un par de bytes trabajando
0
e1
(incrementando solo para la salida) en lugar de1
y2
, porque de esta manera no necesitamos inicializar explícitamente la pila con a1
y podemos usar la negación lógica para alternar entre los dos valores.fuente
Brachylog ,
30 26 25 23 17 1614 bytesEmite los primeros n valores. Utiliza la "variable de salida"
.
para la entrada y las salidas a la "variable de entrada"?
. Pruébalo en línea!Explicación
Estoy bastante contento con lo declarativo que resultó: el programa es básicamente una descripción de alto nivel de la lista de resultados y su relación con la entrada.
Como
{1|2}ᵐ
prueba las listas en orden lexicográfico, la salida comenzará con 1.fuente
Casco , 10 bytes
Devuelve los primeros n valores. Pruébalo en línea!
Explicación
Para la entrada 20, el proceso es el siguiente:
fuente
Java 10,
15510810510097 bytesImprime indefinidamente sin delimitador.
-3 bytes después de una sugerencia indirecta de @Neil .
-5 bytes gracias a @MartinEnder .
-3 bytes que convierten Java 8 a Java 10.
Explicación:
Pruébelo en línea (agota el tiempo de espera después de 60 segundos en TIO).
fuente
[1,2,2]
e ir desde allí) y escribí la respuesta de 155 bytes (que ahora se juega con una cadena en lugar de Lista).(3-i)
lugar de(1+i%2)
?i
no es 1 o 2, es el índice de cadena.Jalea , 10 bytes
Devuelve el n º plazo.
Pruébalo en línea!
Cómo funciona
fuente
Haskell , 33 bytes
Pruébalo en línea!
Ørjan Johansen guardó 7 bytes usando un patrón irrefutable para forzar el prefijo.
fuente
n:
al comienzo de la expresión, no necesita saber six
está allí para producir la primeran
. Pero necesita que el patrón sea perezoso para evitar que la función lo verifique antes de llegar aln:
.Gol> <> ,
87 bytesPruébalo en línea!
Explicación
Este es un puerto de mi respuesta Wumpus . Gol> <> es básicamente el lenguaje que tiene todas las características necesarias para portar la respuesta Wumpus (específicamente, ceros implícitos en la parte inferior de la pila, "duplicado" implementado "pop, push, push" y un comando de rotación de pila), pero :
00.
para volver al principio.K
, que es "pop N, luego duplica el siguiente elemento N veces", que puede reemplazar?=
, guardando otro byte.Entonces el mapeo de Wumpus a Gol> <> se convierte en:
fuente
Lenguaje de programación Shakespeare ,
594 583572 bytes¡Gracias a Ed Wynn por -10 bytes!
Pruébalo en línea!
Esta es una versión de golf de la solución no adaptada de Ed Wynn , comenzando desde la solución de 828 bytes que vinculó en los comentarios y a partir de ahí.
Explicación:
fuente
> <> ,
1312 bytesPruébalo en línea!
Un puerto de la respuesta Wumpus de Martin Ender . Desafortunadamente,
><>
no tiene un comando de incremento o de inversión ni tiene ceros implícitos en la parte inferior de la pila, por lo que esto termina siendo un poco más largo.fuente
JavaScript,
67666058525150 bytes¡Bueno, eso hizo que mi cerebro picara más de lo que debería! Vuelve a ejecutar el
n
término th, 0-indexado.¡5 + 1 bytes guardados gracias a tsh rascando mi cerebro con picazón!
Pruébalo
El fragmento a continuación mostrará los primeros 50 términos.
Mostrar fragmento de código
Explicación
Esta es una de esas raras ocasiones en las que podemos declarar algunas variables fuera del alcance de nuestra función, modificarlas dentro de la función y aún así poder reutilizarlas en llamadas posteriores de la función.
fuente
n=>(g=s=>s[n]||g(s+(++x%2+1)*(10*s[x]-9)))('122',x=1)
s='122',x=1,g=n=>s[n]||g(n,s+=(++x%2+1)*(10*s[x]-9))
considera una presentación válida?s[n]||
¡Era un caso claro de no ver la madera de los árboles! Sin embargo, su segunda sugerencia no sería válida, ya que la función solo se puede llamar una vez;s
&x
necesita ser inicializado con cada llamada.s
y cuandox
no sea tocado por otros códigos entre cada invocación (que es por defecto).s[x]+0-9
es un truco bastante buenoPython (2 y 3),
6560 bytesDevuelve el n ° de entrada, 0-indexado.
Alternativa (65 bytes):
fuente
[1,2,2]
como valor inicial en elsum
Haskell , 48 bytes
-1 byte gracias a nimi. -2 bytes gracias a Lynn.
Pruébalo en línea!
Repita cada elemento su posición mod 2 + 1 veces.
fuente
c=1:2:c
brainfuck , 61 bytes
Pruébalo en línea!
Imprime números como códigos char indefinidamente. Para mayor claridad, aquí hay una versión que se imprime en números (excepto los dos primeros elementos, que son lo suficientemente fáciles de verificar).
Cómo funciona:
fuente
05AB1E ,
129 bytesGuardado 3 bytes gracias a Grimy
Imprime los primeros n elementos.
Pruébalo en línea!
Explicación
fuente
2L[2LÞsÅΓ
.∞[2LÞsÅΓ
.Δ2LÞsÅΓI∍
para una versión que imprime los primeros n elementos con la entrada n.05AB1E , 15 bytes
Pruébalo en línea! o con un límite de iteración
Explicación
fuente
¸«
,=
los imprimiría para 2 bytes guardados.ƵLS[NÌ©èF®É>=
, no hay necesidad de engañar si no estás consumiendo.Python 3 ,
5554 bytesPruébalo en línea!
fuente
J , 12 bytes
Función de argumento único que toma n y produce los primeros n términos. Pruébalo en línea!
Simplemente arreglando mi vieja respuesta a la vieja pregunta.
I.
es un verbo que toma una matriz de números y escupe una lista de índices, de modo que si el k -ésimo elemento en la matriz es n , entonces el índice k aparece n veces. Lo usaremos para iniciar la secuencia de Kolakowski desde una semilla inicial. Cada paso procederá de la siguiente manera:Si realizamos esta operación (
1+2|I.
) una y otra vez desde 10, se ve así:Observe cómo obtenemos más y más términos correctos cada vez, y después de un tiempo los primeros n términos son fijos. El número de iteraciones que se necesitan para establecerse es difícil de describir con precisión, pero parece ser aproximadamente logarítmico en n , por lo que si lo ejecutamos n veces (
^:]
) debería estar bien. (Consulte estas otras secuencias OEIS para obtener más información: longitudes de generación , sumas parciales ).Una vez que hayamos hecho eso, todo lo que tenemos que hacer es tomar los primeros n términos usando
$
. La construcción$v
de cualquier verbov
es un ejemplo de un gancho, y sin
se ejecuta como argumento se ejecutarán $ (v n)
.Aquí está la vieja versión de 13 bytes, que es mucho menos desperdicio de tiempo y espacio:
($1+2|I.)^:_~
. Trunca la entrada en cada paso, por lo que podemos ejecutar exactamente tantas veces como sea necesario para resolver, en lugar de muchas veces linealmente.fuente
I.
. Siempre he querido ver la función de copia que se usa en algunos campos de golf.Fueue , 30 bytes
Fueue es un esolang basado en la cola en el que el programa en ejecución y sus datos están en la misma cola, la ejecución gira alrededor de la cola en ciclos y la programación requiere mucha sincronización para evitar que algo se ejecute en el momento equivocado.
Pruébalo en línea!
Lo anterior imprime una lista interminable de dígitos como códigos de control. Para 34 bytes, puede imprimir dígitos reales:
Pruébalo en línea!
El resto de la explicación usa la última versión.
Resumen de elementos de Fueue
La cola de Fueue puede contener el siguiente tipo de elementos:
)
función los desbloquee , y~
(intercambiar dos elementos siguientes),:
(duplicar el siguiente elemento) y)
(desbloquear el siguiente bloque).Resumen de alto nivel
Durante el ciclo principal del programa, la cola consiste en:
[49]
y[50:]
, respectivamente.Seguimiento de bajo nivel de los primeros 10 comandos
Tutorial de una iteración completa del bucle principal
Se ha insertado un espacio en blanco opcional para separar los comandos.
Ciclo 1:
49
impresiones1
.)
está inactivo, esperando ser reunido con el bloque de bucle principal.50
impresiones2
.:
duplica el bloque del bucle principal (que necesita una copia para la autorreplicación)Ciclo 2:
)
desbloquea el primer bloque del bucle principal, lo que hace que comience a ejecutarse el próximo ciclo.Ciclo 3:
[50:]
representa el primer dígito producido en la cadena,2
aún no desbloqueado. Lo siguiente)
finalmente lo hará después de que el resto del bucle principal lo haya atravesado.~)~:~
es un retraso de un ciclo de golf (usando un intercambio y una copia) de~)~~
.[[49]:~))~:~~]
está inactivo~
intercambia el siguiente bloque de bucle principal más allá del[50:]
bloque de dígitos.Ciclo 4:
)
todavía espera,~)~
produce~)
,~
intercambia más[[49]:~))~:~~]
allá del[50:]
bloque de dígitos.Ciclo 5:
~
intercambios más)
allá del[50:]
bloque de dígitos.Ciclo 6: el primero
)
ahora desbloquea el[50:]
bloque de dígitos, el siguiente)
desbloquea el subprograma[[49]:~))~:~~]
.Ciclo 7:
50
imprime2
,:
duplica el[49]
bloque de dígitos recién producido , creando una serie de dos1
s.:~))~:~
es un retraso de un ciclo de~~))~:
.~
intercambia el bloque de bucle principal restante más allá del primero[49]
.Ciclo 8:
~~))
es un retraso de un ciclo de)~)
.~
intercambia más:
allá del recorrido actual[49]
.Ciclo 9:
~
intercambios)
pasados[49]
.:
duplica el bloque del bucle principal.Ciclo 10: el primero
)
desbloquea el[49]
bloque de dígitos que acaba de atravesar, el segundo)
reinicia el bucle principal para atravesar el siguiente (se muestra arriba al comienzo de la cola).fuente
x86,
4137353328 bytesMe divertí mucho jugando con diferentes instrucciones x86, ya que esta es mi primera respuesta x86 "no trivial". En realidad, aprendí x86-64 primero, y ahorré muchos bytes simplemente convirtiendo mi programa a 32 bits.
Resulta que el algoritmo que utilicé de OEIS empuja los valores a una matriz, lo que lo hace compatible con x86 y almacena valores en la pila (tenga en cuenta que MIPS no tiene instrucciones de pila).
Actualmente, el programa toma
N
valores como entradaecx
y devuelve una direcciónebp
de una matriz con el enésimo elemento que representa el enésimo valor de la secuencia. Supongo que regresar a la pila y calcular valores adicionales es válido (de todos modos, consideramos lo que está más allá de la matriz como basura).Registro de cambios
-4 bytes calculando
x = 2 - n%2
conxor
cada iteración-2 bytes usando do-while en lugar de while loop.
-2 bytes presionando los valores iniciales 1, 2, 2 usando
eax
-5 bytes al no almacenar
n
explícitamente y en su lugar ejecutarN
tiempos de bucleObjdump:
fuente
C (gcc) ,
7271656462 bytes-9 bytes gracias a @ceilingcat
Pruébalo en línea!
Genera valores de la secuencia indefinidamente (opción 3 del desafío)
fuente
for($x=$y=-1;;$y=$y+1|$f&.5*$x^=$f=$y&-$y-2)echo$x&1?:2;
. 2)50-x%2
debería guardar un byte para usted. 3) Traté de hacerlo funcionar conx=y=1
; pero no podía hacer las operaciones bien hasta ahora. ¿Puedes?Perl 5 , 36 bytes
Todavía una modificación trivial de la solución clásica de TPR (0,3):
Emite la serie de
0
an
Pruébalo en línea!
fuente
Javascript ES6 -
717068 bytes1 bit ahorrado gracias a Neil
Gracias a Shaggy por corregir mi error, también por ahorrar 1 bit.
fuente
x=0
lugar dex=1
), pero @Shaggy tiene razón: esto no funciona en su forma actual (agregué,i=100;i-->0
temporalmente para ver los primeros 100 elementos, en lugar de tener que espere 60 segundos antes de ver una salida). Sin embargo, no tengo idea de por qué no funciona. JS no es lo mío.1.
iniciarx
a 0 en lugar de 1 (como mencionó @KevinCruijssen) y2.
verificar si elx
carácter th en la cadena, que solo puede ser 1 o 2, es mayor que 49.(_[x]*10-9)
que(_[x]>1?11:1)
Manzana , 89 bytes
Define una función
K
que no toma argumentos y devuelve la secuencia de Kolakoski como una lista infinita. Pruébalo en línea!Este enfoque se inspiró en la respuesta de Haskell del totalmente humano . Mi enfoque original fue más largo y probablemente fue O (2 ^ n). : ^ P
Sin golf
La lista de retorno comienza con
(1 2)
. Después de eso, para generar el resto (lectura de adentro hacia afuera):(kolakoski)
para obtener la lista de secuencias de Kolakoski (debido a una evaluación perezosa, no importa que la lista aún no se haya generado por completo)(cycle (list 1 2))
crea una lista infinita(1 2 1 2 1 2 ...)
repeat-val
. Esto repetirá1
o2
desde lacycle
lista una o dos veces dependiendo del valor asociado en la lista de Kolakoski. Resultado:((1) (2 2) (1 1) ...)
flatten
esa lista en(1 2 2 1 1 ...)
(concat (list 1 2)
, así quedrop
los dos primeros de la lista generada para evitar la duplicación.fuente
Stax , 12 bytes
Ejecutar y depurarlo
Esta es la representación ascii del mismo programa.
Expande la secuencia x veces donde x es la entrada. Entonces se da salida a la x ésimo elemento, 0 indexados.
Aquí hay una solución adicional de 12 bytes que produce resultados como una secuencia infinita. Presione Ejecutar para comenzar.
fuente
R, 63 bytes o 61 bytes
Aplicación 1: imprime el n º término de la secuencia.
Implementación 2: imprime los primeros n términos de la secuencia.
(La diferencia es solo en la última línea).
Sí, sí, puede quejarse de que mi solución es ineficiente, que calcula realmente más términos de los necesarios, pero aún así ...
Actualización: Gracias a @Giuseppe por reducir 9 bytes.
fuente
a=c(a,rep(2-n%%2,a[n]))
lugar del segundofor
bucle para eliminar algunos bytes.Lenguaje de programación Shakespeare, 575 bytes (pero defectuoso), o 653 o 623 bytes
En la categoría SPL muy disputada, esto superaría la entrada actual de Jo King (583 bytes), excepto que es defectuoso: Primero, no se ejecuta en la versión TIO (implementando el sitio web SPL), pero se ejecuta en el Perl versión , así que tal vez no sea un defecto grave. En segundo lugar, sin embargo, no imprime los dos primeros dígitos. Si permitimos ese defecto en la solución de Jo King, entonces esa solución defectuosa sería de 553 bytes, superando a mi solución defectuosa.
Mi solución falla en TIO por dos razones: intentamos confiar en una pila vacía que devuelve cero cuando aparece; y pasamos a la primera escena, con "[Enter Ford and Puck]" aunque nadie haya salido del escenario. Estas son meras advertencias en la versión Perl. Si corrijo estos errores y pongo los dos primeros dígitos, llego a 653 bytes:
Pruébalo en línea!
Puedo generar la secuencia completa en la implementación de Perl usando 623 bytes:
Sin embargo, quisiera señalar que esta solución es rápida comparación con muchas otras soluciones y utiliza cantidades logarítmicas de memoria en lugar de almacenar toda la lista. (Esto es similar a la solución C de vazt, con la cual está relacionado de forma distante). Esto no hace ninguna diferencia para el golf, pero aún así estoy satisfecho. Puede generar un millón de dígitos en aproximadamente un minuto en Perl (por ejemplo, si canaliza a sed y wc para obtener un recuento de dígitos), donde la otra solución podría proporcionarle unos pocos miles de dígitos.
Explicación
Almacenamos una secuencia de variables en orden: la pila de Puck (de abajo hacia arriba), el valor de Puck, el valor de Ford, la pila de Ford (de arriba hacia abajo). Además de los valores cero en los extremos (con el cero a la izquierda tal vez por hacer estallar una pila vacía), cada valor es el dígito generado a continuación en esa generación, con 2 agregados si la próxima generación necesita tener otro hijo de ese padre. Cuando tenemos N valores distintos de cero en la secuencia, generamos todos los hijos hasta la generación N-ésima incluida, en una especie de recorrido de árbol de profundidad primero. Imprimimos valores solo de la enésima generación. Cuando la enésima generación se ha generado por completo, los valores almacenados son de hecho los valores iniciales para las generaciones 2 a (N + 1), por lo que agregamos un 2 a la izquierda y comenzamos de nuevo, esta vez generando el (N + 1 ) -th generación.
Entonces, un bosquejo: Escena X: Cuando llegamos aquí, este es el comienzo de un nuevo recorrido. Puck == 0. Opcionalmente, empujamos ese cero en la pila de Puck y establecemos Puck = 2. Escena L: Si Ford == 0, hemos alcanzado la generación de impresión. Si no, vaya a V. Para imprimir, si el valor en Puck ha agregado 2, elimine el 2 e imprímalo dos veces; si no, imprímalo una vez. Escena M: este es un bucle donde repetidamente alternamos el valor de Puck y volvemos a través de la secuencia. Repetimos hasta llegar al final (Puck == 0), en cuyo caso ir a X, o alcanzar un valor que necesite otro hijo (Puck> 2), en cuyo caso restar el 2 extra y avanzar en V. Escena V: Aquí vamos hacia adelante. Si Puck es 2 o 4, la próxima generación contendrá dos hijos del padre actual, por lo que Ford + = 2. Avanza por la secuencia. Pase a L para verificar la terminación.
fuente
axo , 13 bytes
Pruébalo en línea!
Explicación
Esto comenzó como un puerto de una solución alternativa en mi respuesta de Wumpus :
Esto resultó en 18 bytes. Terminé jugando golf hasta los 13 bytes que ves arriba para ajustarlo más a la forma en que funciona axo. Esta versión de 13 bytes terminó inspirando la mejora hasta 11 bytes en Wumpus, por lo que ahora está más cerca de esa versión.
Al igual que en Wumpus, en la iteración i , la parte inferior de la pila contiene un (i) -1 y la parte superior contiene el primer elemento de la i ésima ejecución, pero estamos trabajando con 0 y 1 en todo momento, excepto para la impresión.
fuente
Ruby ,
4539 bytesimprime indefinidamente
Pruébalo en línea!
Pruébelo con una función de impresión sobrecargada que le permite elegir un separador y la cantidad de elementos impresos
fuente