Schreiben Sie einen Turing-Maschinensimulator .
Der Einfachheit halber können wir Status als Ganzzahl, Symbole als Zeichen und leere Symbole als Leerzeichen annehmen
5-Tupel in Form von aktuellem Status, Eingabesymbol, nächster Status, Ausgabesymbol, Richtung (links oder rechts) Die Reihenfolge ist nicht obligatorisch, aber geben Sie an, ob Sie sie tauschen
Die Maschine muss anhalten, wenn ein unbekannter Zustand erreicht ist. Eine andere Anhaltebedingung ist nicht zulässig.
Das Band ist in beide Richtungen unendlich und Sie können immer ein leeres Zeichen lesen.
Eingabe: das Anfangsband, ein Anfangszustand und ein Programm. Sie können die Daten in dem von Ihnen gewünschten Format von jedem beliebigen Ort aus lesen
Ausgabe: das Band nach der Ausführung des Programms
Erforderlich: Ein Beispielprogramm, das auf Ihrem Simulator ausgeführt wird
Dies ist ein Code-Colf, so dass der kürzeste Code gewinnt.
Ich werde in den nächsten Stunden eine Implementierung und einige Beispielprogramme veröffentlichen.
quelle
Antworten:
GolfScript, 92 Zeichen
Die Turing-Maschine in GolfScript wurde viel länger als beabsichtigt. Ich spiele immer noch mit verschiedenen Darstellungen des Bandes herum.
Die erste Zeile der Eingabe ist der ursprüngliche Zustand, die zweite Zeile das ursprüngliche Band, gefolgt von einer Reihe von Übergängen (mit dem aktuellen Ordnungszustand, dem Eingabesymbol, dem nächsten Zustand, der Richtung, dem Ausgabesymbol).
Beispiel (auch online verfügbar )
quelle
GNU sed mit
-r
-13311711193 ZeichenJa, sed ist fertig. GNU sed und
-r
(erweiterte reguläre Ausdrücke) dienen nur zum Speichern weniger Zeichen. Die Arbeit mit POSIX sed ist nur eine kleine Änderung.Eingabeformat ist
Die Trennzeichen
@
,#
und Kopfzeichen>
können nicht als ein Symbol auf dem Band verwendet werden. Zustandsbezeichnungen dürfen nicht@
>
oder enthalten#
.Es werden alle Programme in der Eingabe ausgeführt, eines pro Zeile
Beispiele:
Marco ist ein n b n Programm
Marco ist Hallo! Programm
quelle
Ich bin also etwas spät dran, dachte aber, ich lasse das hier ...
Turingmaschine Eine Turingmaschine simulieren: 370 Bytes?
Hier verwende ich die Struktur, die Turing in seiner Arbeit von 1936 verwendet hat. Ich verwende ein Symbol = ein Byte, einschließlich M-Configs und Operationen.
Hier ist eines von Turings Beispielen aus dem obigen Papier für meine Maschine:
Probieren Sie es online! (Verwendet Python 3 als Interpreter) --Bearbeiten: Ich habe gerade das TIO überprüft und es scheint nicht richtig zu funktionieren ... Probieren Sie es auf Ihrem lokalen Computer aus und es sollte (hoffentlich) funktionieren. Das tut es bei mir.
quelle
APL (110)
(Es ist nicht einmal so kurz ...)
Es liest zwei Zeilen von der Tastatur: die erste ist das Programm und die zweite ist das Anfangsband.
Das Format ist
und sie sollten alle auf der gleichen Linie sein. 'Bewegung' ist 0, um sich nach rechts und 1, um sich nach links zu bewegen.
Beispielprogramm (Aus Gründen der Übersichtlichkeit sollten Zeilenumbrüche in einer Zeile stehen.)
Das Programm addiert zwei unäre Zahlen, zum Beispiel:
Beispiel 2 (angepasst aus dem binären Inkrementierungsprogramm von Marco Martinelli):
quelle
Python,
101189152142b und p sind die Eingaben, b ist das Anfangsband, p codiert die Regeln als (Zeichenfolgendarstellung von) einem Diktat von (In-State-, In-Tape-) Tupel zu (Out-State-, Head-Move-, Out-Tape-) Tupel . Wenn move 0 ist, wird das Programm beendet, 1 wird nach rechts verschoben und -1 wird nach links verschoben.
In diesem Beispielprogramm wird geprüft, ob der letzte Buchstabe der Zeichenfolge (vor dem leeren Band) "a" ist. In diesem Fall wird "Y" am Ende der Zeichenfolge (erstes Leerzeichen) geschrieben.
Bearbeiten 1:
Das Band wurde geändert, um als Diktat dargestellt zu werden, da dies der kürzeste Weg zu sein schien, eine erweiterbare Datenstruktur zu schreiben. Die vorletzte Zeile wandelt sie zumeist wieder in lesbare Form für die Ausgabe um.
Bearbeiten 2:
Vielen Dank an Strigoides für viele Verbesserungen.
Edit 3:
Ich hatte es unnötigerweise auf 0 gesetzt, da die Ausgabe den Ort so belassen würde, wie er ist. Ich habe dies entfernt, da wir immer die gleiche Ausgabe wie die Eingabe schreiben können.
quelle
r=0;s=0
werdenr=s=0
(und das Semikolon am Ende dieser Zeile ist unnötig), Sie können die Funktion entfernenw
, da es nicht verwendet wird, die Klammern können entfernt werden(s,m,t)=r[s,c]
, dertry
/except
Block kann gekürzt werden mit dict.get;c=a.get(i,' ')
, dam
entweder 0 oder 1 ist, können Sie verwendenif m-1:
, und Sie können Ihrenmap()
Anruf verkürzen , indem Sie ihn in ein Listenverständnis umwandeln.Nachsatz
(205)(156)(150)(135)Dies ist wahrscheinlich ein Betrug, aber die Übergangstabelle enthält Code zum Ausführen der Übergänge. Und da das Band durch eine Zuordnung von Ganzzahlen zu Ganzzahlen dargestellt wird, habe ich Zustände als Zuordnung von Namen zu Wörterbüchern dargestellt, sodass das Band und das Programm im gleichen anonymen Wörterbuch existieren.
Zusätzliche Einsparungen, indem alle Statusnamen ausführbar gemacht werden und automatisch geladen werden.
Ungolfed mit eingebettetem "Hallo" -Programm.
Weitere 52 Zeichen kaufen eine Schleife, um das Band von stdin zu lesen.Laufen Sie mitgsnd -q tm.ps
.Das Tabellenformat ist also
wo
in-state
ist ein Name,in-tape
undout-tape
sind Zeichen (dh. ganze Zahlen oder Ausdrücke , die Ausbeute ganze Zahlen sind ),movement
ist-1
für die nach links oder1
nach rechts, undout-state
ist ein ausführbarer Datei - Name. Mehrfachübergängein-tape
für denselben Zustand müssen wie oben kombiniert werden.quelle
currentdict{search-for-min-and-max}forall juggle-params-for-for
. :(0 1 0 not{(%stdin)(r)file read not{exit}if def}for
. Ich bin mir nicht sicher, warum ich dachte, ich könnte davonkommen, wenn ich das in der Golfversion weglasse. : P0 not
sollte es sein16#7fffffff
. Es tut uns leid. Aha! deshalb wurde es kommentiert! Es kam direkt aus dem Notebook, wurde nicht getestet und ich habe alle Kommentare abgeschnitten, ohne nachzuschauen, wenn ich Golf gespielt habe. Erzähl es nicht dem Python-Typ! : PC (noch nicht golfen)
Ich schätze, ich kann damit nicht gewinnen, aber es hat Spaß gemacht, es zum Laufen zu bringen. Dies gilt umso mehr, als es nun wirklich funktioniert . :)
Außer es ist nur unendlich in eine Richtung. Ich nehme an, es braucht auch ein Negativband. Seufzer....
Negativ war nicht so schlimm. Wir verschachteln die beiden Seiten als Ausgleich und Chance. Die Komplikation besteht nun darin, dass das Band in sequenzieller Reihenfolge angezeigt werden muss , da die Datei selbst nun durcheinander gebracht wird. Das ist eine legitime Änderung, denke ich. Sich auf diese Weise zu vereinfachen.
Und hier ist der Testlauf:
Das Programm gibt das Band in sequenzieller Reihenfolge aus, aber die Datei repräsentiert die verschachtelten negativen und positiven Seiten.
quelle
0 'a' 0 'b' R; 0 'b' 0 'a' R
mit Eingabe aaa vertauscht. Die Ausgabe ist bab statt bbb. Und es gibt Probleme, sich nach links zu bewegen.Groovy
234228154153149139124Zur besseren Lesbarkeit formatiert
t ist die Funktion, mit der das Band eingelegt wird. e ist die Funktion, mit der das Programm ausgewertet wird
Beispiel 1 - "Hallo!" auf dem Band :)
Beispiel 2 - Lassen Sie ein T auf dem Band, wenn die anfängliche Zeichenfolge die Form a n b n hat. Andernfalls beenden Sie den Vorgang.
Beispiel 3 - Inkrementieren einer Binärzahl
in den Beispielen bedeutet 1 nach rechts und -1 nach links
quelle