Un sistema de etiquetas cíclicas es un pequeño modelo computacional completo de Turing que consta de un alfabeto de dos símbolos (lo usaré {0,1}
), una lista cíclica finita, no vacía de producciones que consisten en esos dos símbolos, y una palabra sin límites que también consiste en Esos dos símbolos.
En cada paso:
- se elimina el primer elemento de la palabra
- si fuera
0
la producción actual se omite - si era
1
la producción actual se agrega al final de la palabra . - La próxima producción se activa. Si esta fue la última producción, regrese a la primera.
El sistema se detiene cuando la palabra se vacía.
Un ejemplo (de Wikipedia):
Productions: (010, 000, 1111)
Initial word: 11001
Generation Production Word (before) Word (after)
0 010 11001 → 1001010
1 000 1001010 → 001010000
2 1111 001010000 → 01010000
3 010 01010000 → 1010000
4 000 1010000 → 010000000
5 1111 010000000 → 10000000
6 010 10000000 → 0000000010
7 000 0000000010 → 000000010
8 1111 000000010 → 00000010
9 010 00000010 → 0000010
Su tarea, si elige aceptarla, es escribir un programa o función que tome:
- una lista de producciones,
- la palabra inicial, y
- Una generación,
e imprime o devuelve la palabra en esa generación.
Por ejemplo,
cyclic_tag(
prod=[[0,1,0],[0,0,0],[1,1,1,1]],
word=[1,1,0,0,1],
gen=4) => [1,0,1,0,0,0,0]
Detalles de implementacion:
El alfabeto no importa. Puede usar
0
y1
,True
yFalse
,T
yNIL
,A
yB
, o incluso1
y0
, o cualquier otra cosa que se le ocurra, siempre que sea coherente. Todas las entradas y salidas deben usar el mismo alfabeto, y usted debe indicar para qué está usando0
y para qué1
.La longitud de la palabra debe ser teóricamente ilimitada. Es decir, no puede codificar una longitud máxima de palabra. Si ejecuto su programa en una computadora ideal con una cantidad infinita de memoria, su programa teóricamente debe poder usarlo. (Puede ignorar los límites de su intérprete / compilador).
Si el sistema dado se detiene antes de que se alcance la generación dada, debe devolver o imprimir la palabra vacía.
La producción vacía existe y debes poder manejarla. Si escribe un programa completo, su E / S también debe poder manejarlo.
Editar : originalmente tenía la intención de que la generación 0
fuera la palabra de entrada en sí, y que la generación 1
fuera el resultado del primer paso. Es decir, tenía la intención de que devolvieras la columna anterior . Sin embargo , como no he sido lo suficientemente claro al afirmar esto, aceptaré ambas opciones ; para cada generación, puede devolver el valor en la columna anterior o posterior . Debe indicar que está siguiendo la columna posterior , si lo está haciendo. También debe ser coherente en la columna que elija.
Otorgaré el código más pequeño dentro de una semana (27/10/2014).
fuente
Respuestas:
GolfScript (17 a 19 bytes dependiendo del formato de entrada y el formato de salida aceptado)
18 bytes:
Toma entrada en el formulario
[1 1 0 0 1] [[0 1 0] [0 0 0] [1 1 1 1]] 4
y da salida en el formulario[1 0 1 0 0 0 0]
. (Podría tener 17 bytes sin el último`
si la salida1010000
es aceptable).Demostración en línea
19 bytes:
Toma entrada en el formulario
"11001" ["010" "000" "1111"] 4
.Demostración en línea
Disección
El crédito a Martin Büttner 's solución Cjam de la idea de generar la lista de producciones de repetición y truncamiento.
fuente
Haskell,
555351esto usa
True
as1
yFalse
as0
. ejemplo ejecutado:fuente
CJam,
313028272418 bytesEsto define un bloque (lo más parecido a una función), que espera que la entrada resida en la pila de esta manera
Del mismo modo que dejará una gran variedad de
0
s y1
s en la pila.Pruébalo aquí. Pegue la entrada en la primera línea, el código en la tercera línea, y agregue una
~
para evaluar realmente el bloque. P.ejSi la salida no tiene que tener la misma forma que la entrada
Explicación:
El estado final de la palabra se deja en la pila.
Gracias a Peter Taylor por hacerme volver a visitar esto.
fuente
l~{_,g{('1=@(:Pa+@@P*+}*}*\;
28 y todavía posibilidades de mejora (especialmente la(:P
parte), pero tiempo para almorzar:P
también me molesta: Dl~{_,g{(si@(:Pa+@@P*+}*}*\;
: 27 y después de analizarlo,:P
es realmente eficiente: P_,g
también se puede reemplazar con_!!
pero los mismos bytes._{...}{}?
entonces.Mathematica,
84 8077 caracteresEjemplo:
fuente
Pyth 22
Requiere los 3 argumentos como entradas separadas.
Toma argumentos como:
Explicación:
Python 2 - 61
67 91 105 124Pretty Joe-Basic respuesta. Asume que la producción vacía es
[[]]
.Gracias a @xnor, por señalar que jugar golf a las 2 am es una mala decisión.
Un agradecimiento adicional a @xnor, a quien parece que le debo el 50% de mi puntaje.
Muestra:
fuente
g and w
parax
? Además, creo queg*w
debería funcionar para dar un valor verdadero cuando ambosg
son distintos de cero yw
no son vacíos.if x else w
. ¿Nox
será siempre cierto porque este código solo se ejecutaif x
o me falta algo?and
/or
truco y girando enp
lugar den
c=lambda p,w,g:g*w and c(p[1:]+p[:1],w[1:]+w[0]*p[0],g-1)or w
Javascript ES6 - 88 bytes
Se ve extrañamente similar a la respuesta de Fry que acaba de aparecer en mi navegador. (Sin copiar, lo juro solemnemente).
Sin embargo, parece que él siguió la ruta de la matriz mientras yo fui por la ruta de cadena / expresión regular.
Expandido:
Salida de muestra
Ahora mire cómo llegan los idiomas del golf y masacre a los dos. :RE
fuente
n
. Grandes mentes, ¿eh? : D