Um sistema cíclico de tags é um minúsculo modelo computacional completo de Turing que consiste em um alfabeto de dois símbolos (eu usarei {0,1}
), uma lista cíclica finita e não vazia de produções que consistem nesses dois símbolos e uma palavra ilimitada que também consiste em esses dois símbolos.
Em cada etapa:
- o primeiro elemento da palavra é removido
- se fosse
0
a produção atual é ignorada - se foi,
1
a produção atual é anexada ao final da palavra . - a próxima produção se torna ativa. Se essa foi a última produção, volte para a primeira.
O sistema pára quando a palavra fica vazia.
Um exemplo (da 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
Sua tarefa, se você optar por aceitá-la, é escrever um programa ou função que utilize:
- uma lista de produções,
- a palavra inicial e
- uma geração,
e imprime ou retorna a palavra nessa geração.
Por exemplo,
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]
Detalhes da implementação:
O alfabeto não importa. Você pode usar
0
e1
,True
eFalse
,T
eNIL
,A
eB
, ou mesmo1
e0
, ou qualquer outra coisa que possa inventar, desde que seja consistente. Todas as entradas e saídas devem usar o mesmo alfabeto e você deve indicar para o que está usando0
e para que1
.O comprimento da palavra deve ser teoricamente ilimitado. Ou seja, você não pode codificar um tamanho máximo de palavra. Se eu executar o seu programa em um computador ideal com uma quantidade infinita de memória, seu programa deve teoricamente ser capaz de fazer uso dele. (Você pode ignorar os limites do seu intérprete / compilador.)
Se o sistema especificado parar antes que a geração seja atingida, você deverá retornar ou imprimir a palavra vazia.
A produção vazia existe e você deve poder lidar com isso. Se você escrever um programa completo, sua E / S também deve poder lidar com isso.
Edit : Eu pretendia originalmente que geração 0
fosse a própria palavra de entrada e geração 1
fosse o resultado do primeiro passo. Ou seja, eu pretendia que você retornasse a coluna anterior . No entanto , como não fui suficientemente claro ao afirmar isso, aceitarei as duas opções ; para cada geração, você pode retornar o valor na coluna antes ou depois . Você deve declarar que está seguindo a coluna depois , se estiver fazendo isso. Você também deve ser consistente em qual coluna você escolher.
Atribuirei o menor código daqui a uma semana (27/10/2014).