Ein zyklisches Tag-System ist ein winziges, Turing-vollständiges Rechenmodell, das aus einem Alphabet mit zwei Symbolen (ich werde es verwenden {0,1}), einer endlichen, nicht leeren zyklischen Liste von Produktionen , die aus diesen beiden Symbolen bestehen, und einem unbegrenzten Wort besteht, aus dem auch besteht diese beiden Symbole.
Bei jedem Schritt:
- Das erste Element im Wort wird entfernt
- wenn es war, wird
0die aktuelle Produktion übersprungen - War es das, wird
1die aktuelle Produktion an das Ende des Wortes angehängt . - Die nächste Produktion wird aktiv. Wenn dies die letzte Produktion war, kehren Sie zur ersten zurück.
Das System hält an, wenn das Wort leer wird.
Ein Beispiel (aus 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
Ihre Aufgabe besteht darin, ein Programm oder eine Funktion zu schreiben, die Folgendes übernimmt:
- eine Liste der Produktionen,
- das Anfangswort und
- eine Generation,
und druckt oder gibt das Wort bei dieser Generation zurück.
Beispielsweise,
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]
Implementierungsdetails:
Das Alphabet spielt keine Rolle. Sie können
0und1,TrueundFalse,TundNIL,AundB, oder sogar1und0, oder was auch immer Sie sich vorstellen, solange Sie konsequent sind. Alle Eingaben und Ausgaben müssen dasselbe Alphabet verwenden, und Sie müssen angeben, wofür0und wofür Sie verwenden1.Die Länge des Wortes muss theoretisch unbegrenzt sein. Das heißt, Sie können eine maximale Wortlänge möglicherweise nicht fest codieren. Wenn ich Ihr Programm auf einem idealen Computer mit unendlich viel Arbeitsspeicher ausführe, muss Ihr Programm theoretisch in der Lage sein, darauf zuzugreifen. (Sie können die Grenzen Ihres Interpreters / Compilers ignorieren.)
Wenn das angegebene System anhält, bevor die angegebene Generation erreicht ist, müssen Sie das leere Wort zurückgeben oder ausdrucken.
Die leere Produktion ist vorhanden, und Sie müssen damit umgehen können. Wenn Sie ein vollständiges Programm schreiben, muss Ihre E / A auch damit umgehen können.
Bearbeiten : Ich hatte ursprünglich vorgesehen, dass die Generierung 0das Eingangswort selbst und die Generierung 1das Ergebnis des ersten Schritts ist. Das heißt, ich hatte vorgehabt, dass Sie die vorherige Spalte zurückgeben. Da ich dies jedoch nicht klar genug dargelegt habe, werde ich beide Optionen akzeptieren . Für jede Generation können Sie den Wert entweder in der Vorher- oder in der Nachher- Spalte zurückgeben. Sie müssen angeben , dass Sie die folgen nach Spalte, wenn Sie so tun. Sie müssen auch konsistent sein, in welcher Spalte Sie sich entscheiden.
Ich werde ab sofort den kleinsten Code pro Woche vergeben (27.10.2014).