Un système d'étiquettes cycliques est un minuscule modèle de calcul complet de Turing composé d'un alphabet à deux symboles (je vais utiliser {0,1}
), d'une liste cyclique finie et non vide de productions qui se composent de ces deux symboles, et d'un mot illimité qui se compose également de ces deux symboles.
À chaque étape:
- le premier élément du mot est supprimé
- si c'était
0
la production actuelle est sautée - si c'était le cas,
1
la production actuelle est ajoutée à la fin du mot . - la prochaine production devient active. S'il s'agissait de la dernière production, revenez à la première.
Le système s'arrête lorsque le mot devient vide.
Un exemple (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
Votre tâche, si vous choisissez de l'accepter, est d'écrire un programme ou une fonction qui prend:
- une liste de productions,
- le mot initial, et
- une génération,
et imprime ou renvoie le mot à cette génération.
Par exemple,
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]
Détails d'implémentation:
L'alphabet n'a pas d'importance. Vous pouvez utiliser
0
et1
,True
etFalse
,T
etNIL
,A
etB
, ou même1
et0
, ou tout ce que vous pouvez proposer, tant que vous êtes cohérent. Toutes les entrées et sorties doivent utiliser le même alphabet et vous devez indiquer ce que vous utilisez0
et pour quoi1
.La longueur du mot doit être théoriquement illimitée. Autrement dit, vous ne pouvez pas coder en dur une longueur de mot maximale. Si j'exécute votre programme sur un ordinateur idéal avec une quantité infinie de mémoire, votre programme doit théoriquement pouvoir l'utiliser. (Vous pouvez ignorer les limites de votre interprète / compilateur.)
Si le système donné s'arrête avant que la génération donnée ne soit atteinte, vous devez retourner ou imprimer le mot vide.
La production vide existe et vous devez pouvoir la gérer. Si vous écrivez un programme complet, vos E / S doivent également pouvoir le gérer.
Edit : j'avais initialement prévu que la génération 0
soit le mot d'entrée lui-même, et la génération 1
soit le résultat de la première étape. C'est-à-dire que j'avais prévu que vous retourniez la colonne précédente . Cependant , comme je n'ai pas été suffisamment clair pour le dire, j'accepterai les deux options ; pour chaque génération, vous pouvez renvoyer la valeur dans la colonne avant ou après . Vous devez indiquer que vous suivez la colonne après , si vous le faites. Vous devez également être cohérent dans la colonne que vous choisissez.
J'attribuerai le plus petit code d'ici une semaine (27/10/2014).