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).