Un sistema di tag ciclico è un piccolo modello computazionale completo di Turing costituito da un alfabeto a due simboli (userò {0,1}
), un elenco ciclico finito e non vuoto di produzioni che consistono di quei due simboli e una parola illimitata che comprende anche quei due simboli.
Ad ogni passo:
- il primo elemento nella parola viene rimosso
- se fosse
0
la produzione corrente viene saltata - se fosse
1
la produzione attuale viene aggiunta alla fine della parola . - la produzione successiva diventa attiva. Se questa è stata l'ultima produzione, torna alla prima.
Il sistema si arresta quando la parola diventa vuota.
Un esempio (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
Il tuo compito, se scegli di accettarlo, è scrivere un programma o una funzione che accetta:
- un elenco di produzioni,
- la parola iniziale e
- una generazione,
e stampa o restituisce la parola a quella generazione.
Per esempio,
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]
Dettagli di implementazione:
L'alfabeto non ha importanza. Puoi usare
0
e1
,True
eFalse
,T
eNIL
,A
eB
, o anche1
e0
, o qualsiasi altra cosa tu possa inventare, purché tu sia coerente. Tutti gli input e output devono usare lo stesso alfabeto e devi indicare per cosa stai usando0
e per cosa1
.La lunghezza della parola deve essere teoricamente illimitata. In altre parole, potresti non codificare una lunghezza massima di parola. Se eseguo il tuo programma su un computer ideale con una quantità infinita di memoria, il tuo programma deve teoricamente essere in grado di utilizzarlo. (Puoi ignorare i limiti del tuo interprete / compilatore.)
Se il sistema specificato si arresta prima che venga raggiunta la generazione specificata, è necessario restituire o stampare la parola vuota.
La produzione vuota esiste e devi essere in grado di gestirla. Se si scrive un programma completo, anche l'I / O deve essere in grado di gestirlo.
Modifica : inizialmente avevo pensato che la generazione 0
fosse la parola di input stessa e che la generazione 1
fosse il risultato del primo passo. Cioè, avevo previsto che tu restituissi la colonna precedente . Tuttavia , poiché non sono stato abbastanza chiaro nel dichiararlo, accetterò entrambe le opzioni ; per ogni generazione è possibile restituire il valore in entrambi colonna prima o dopo . Devi dichiarare che stai seguendo la colonna after , se lo stai facendo. Devi anche essere coerente in quale colonna scegli.
Assegnerò il codice più piccolo tra una settimana (27/10/2014).