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
0
die aktuelle Produktion übersprungen - War es das, wird
1
die 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
0
und1
,True
undFalse
,T
undNIL
,A
undB
, oder sogar1
und0
, 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ür0
und 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 0
das Eingangswort selbst und die Generierung 1
das 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).
quelle
Antworten:
GolfScript (17 bis 19 Byte je nach Eingabeformat und akzeptiertem Ausgabeformat)
18 Bytes:
Nimmt Eingaben in das Formular auf
[1 1 0 0 1] [[0 1 0] [0 0 0] [1 1 1 1]] 4
und gibt Ausgaben in das Formular aus[1 0 1 0 0 0 0]
. (Könnte 17 Bytes ohne das letzte sein,`
wenn die Ausgabe1010000
akzeptabel ist).Online-Demo
19 Bytes:
Nimmt Eingaben in das Formular auf
"11001" ["010" "000" "1111"] 4
.Online-Demo
Präparation
Kredit Martin Büttner ‚s CJam Lösung für die Idee , die Liste der Produktionen durch Wiederholung und Abschneiden zu erzeugen.
quelle
Haskell,
555351dies verwendet
True
as1
undFalse
as0
. Beispiellauf:quelle
CJam,
313028272418 BytesDies definiert einen Block (der einer Funktion am nächsten kommt), der davon ausgeht, dass sich die Eingabe wie folgt auf dem Stapel befindet
Auf ähnliche Weise verbleibt ein Array von
0
s und1
s auf dem Stapel.Teste es hier. Fügen Sie die Eingabe in die erste Zeile und den Code in die dritte Zeile ein und fügen Sie ein
~
an, um den Block tatsächlich auszuwerten. Z.BWenn die Ausgabe nicht dieselbe Form wie die Eingabe haben muss
Erläuterung:
Der Endzustand des Wortes bleibt auf dem Stapel.
Vielen Dank an Peter Taylor, der mich dazu gebracht hat, das noch einmal zu überdenken.
quelle
l~{_,g{('1=@(:Pa+@@P*+}*}*\;
28 und noch verbesserungswürdig (vor allem der(:P
Teil), aber Zeit für das Mittagessen:P
nervt mich auch: Dl~{_,g{(si@(:Pa+@@P*+}*}*\;
: 27 und nach:P
_,g
kann auch durch_!!
dieselben Bytes ersetzt werden._{...}{}?
.Mathematica,
84 8077 ZeichenBeispiel:
quelle
Pyth 22
Benötigt alle 3 Argumente als separate Eingaben.
Nimmt Argumente wie:
Erläuterung:
Python 2 - 61
67 91 105 124Hübsche Joe-Basic-Antwort. Angenommen, die leere Produktion ist
[[]]
.Vielen Dank an @xnor für den Hinweis, dass Golfen um 2 Uhr morgens eine schlechte Entscheidung ist.
Zusätzlicher Dank geht an @xnor, dem ich anscheinend 50% meiner Punktzahl zu verdanken habe.
Stichprobe:
quelle
g and w
fürx
? Außerdem denke ich,g*w
sollte es funktionieren, um einen wahrheitsgemäßen Wert zu liefern, wenn beideg
ungleich Null undw
nicht leer sind.if x else w
. Wird nichtx
immer wahr sein, weil dieser Code nur ausgeführt wirdif x
, oder fehle ich etwas?and
or
p
n
c=lambda p,w,g:g*w and c(p[1:]+p[:1],w[1:]+w[0]*p[0],g-1)or w
Javascript ES6 - 88 Bytes
Sieht der Antwort von Fry, die gerade in meinem Browser aufgetaucht ist, unheimlich ähnlich. (Kein Kopieren, ich schwöre feierlich.)
Es scheint, dass er die Array-Route gegangen ist, während ich die String / Regex-Route gegangen bin.
Erweitert:
Beispielausgabe
Beobachten Sie jetzt, wie die Golfsprachen hereinkommen und uns beide massakrieren. : D
quelle
n
. Großartige Köpfe, was? : D