Es ist allgemein bekannt, dass die Entscheidung, ob eine Turing-Maschine anhält, unentscheidbar ist. Dies gilt jedoch nicht unbedingt für einfachere Maschinen.
Eine Foo-Maschine ist eine Maschine mit einem endlichen Band, bei der jede Zelle auf dem Band eine Ganzzahl oder ein Haltesymbol aufweist h
, z
2 h 1 -1
Der Anweisungszeiger zeigt zunächst auf die erste Zelle:
2 h 1 -1
^
Bei jedem Schritt bewegt sich der Befehlszeiger um die Nummer vorwärts, auf die er zeigt, und negiert dann diese Nummer. So würde es nach einem Schritt vorwärts 2
Zellen bewegen und das 2
in ein verwandeln -2
:
-2 h 1 -1
^
Die Foo-Maschine tut dies so lange, bis der Anweisungszeiger auf das Stoppsymbol ( h
) zeigt. Hier ist die vollständige Ausführung dieses Programms:
2 h 1 -1
^
-2 h 1 -1
^
-2 h -1 -1
^
-2 h -1 1
^
-2 h 1 1
^
Das Band ist ebenfalls kreisförmig. Bewegt sich der Befehlszeiger von einer Seite des Bandes weg, bewegt er sich zur anderen Seite, z.
3 h 1 3
^
-3 h 1 3
^
-3 h 1 -3
^
-3 h -1 -3
^
-3 h -1 3
^
3 h -1 3
^
Eine interessante Sache an diesen Foo-Maschinen ist, dass einige nicht anhalten, zB:
1 2 h 2
^
-1 2 h 2
^
-1 -2 h 2
^
-1 -2 h -2
^
-1 2 h -2
^
-1 2 h 2
^
Dieses Programm wird in den letzten vier Zuständen für immer weitergeschleift.
Schreiben Sie also ein Programm, das feststellt, ob eine Foo-Maschine anhält oder nicht! Sie können für die Foo-Maschinen jedes (angemessene) Eingabeformat verwenden, das Sie möchten, und Sie können wählen, ob Sie das Stoppsymbol verwenden 0
möchten. Sie können zwei unterschiedliche Ausgaben für den Fall verwenden, dass es anhält und für den Fall, dass es nicht anhält. Ihr Programm muss natürlich für alle gültigen Eingaben eine Antwort in endlicher Zeit ausgeben.
Das ist Code-Golf , also versuchen Sie, Ihr Programm so kurz wie möglich zu halten!
Testfälle
2 h 1 -1
Halts
3 h 1 3
Halts
h
Halts
1 1 1 1 h
Halts
2 1 3 2 1 2 h
Halts
3 2 1 1 4 h
Halts
1 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 h -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36
Halts
2 h
Does not halt
1 2 h 2
Does not halt
8 1 2 3 3 4 8 4 3 2 h
Does not halt
1 2 4 3 h 2 4 5 3
Does not halt
3 1 h 3 1 1
Does not halt
1 2 h 42
Does not halt
quelle
1 2 h 42
(hält nicht an)3 2 1 1 4 h
. Dieser hält an, erfordert jedoch mehr Iterationen als die doppelte Anzahl von Elementen.1 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 h -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36
:, der nach 786430 Schritten anhält.Antworten:
C # (Visual C # Interactive Compiler) , 71 Byte
Probieren Sie es online!
Ich weiß nicht, ob das Folgende gültig ist, da es einen benutzerdefinierten Delegaten mit der Signatur von erfordert
unsafe delegate System.Action<int> D(int* a);
und in einenunsafe
Block eingeschlossen werden muss, um verwendet zu werden, aber hier ist es trotzdem:C # (.NET Core) , 64 Byte
Probieren Sie es online!
Diese Funktion nimmt ein int * auf und gibt eine Aktion zurück. Mit anderen Worten, es ist eine Curry-Funktion. Der einzige Grund, warum ich Zeiger verwende, ist codegolf.meta.stackexchange.com/a/13262/84206, mit dem ich Bytes speichern kann, wenn bereits eine Variable mit der Länge des Arrays definiert ist.
9 Bytes dank @someone gespeichert
quelle
1<<f
mit2*f
einem Byte zu speichern.Python 3 ,
6389 BytesProbieren Sie es online!
Funktioniert auch für Python 2; Ein Byte kann in Python 2 gespeichert werden, indem return durch print ersetzt und die Funktion statt return auf stdout gedruckt wird. R dreht sich
True
zum Anhalten undFalse
zum Nichtanhalten.Vielen Dank an @Neil und @Arnauld für die Feststellung, dass ich länger nach dem Anhalten suchen musste. Vielen Dank an @Jitse für den Hinweis auf ein Problem mit
[2,0]
. Vielen Dank an @mypetlion für die Feststellung, dass der absolute Wert des Bandes die Bandlänge überschreiten kann.quelle
x+x
ist genug?[ 3, 2, 1, 1, 4, 0 ]
, das in mehr als 12 Iterationen anhält.len(x)*x
[8,7,6,5,7,4,0,3,6]
2**len(x)
immer noch ein bisschen zu kurz für das Maximum? Ich berechne die Anzahl der Zustände alsn*(2**n)
(mitn=len(x)-1
).Jelly ,
1511 BytesProbieren Sie es online!
Ein monadischer Link, der die Eingabe als Liste von Ganzzahlen aufnimmt, wobei 0 für Halt steht. Gibt 0 für das Anhalten von Eingaben und 1 für diejenigen zurück, die nicht angehalten werden.
Vermeidet das Problem, dass die Anzahl der Iterationen ermittelt werden muss, da bei deren Verwendung
ÐL
eine Schleife ausgeführt wird, bis kein neues Ergebnis mehr zu sehen ist.Vielen Dank an @ JonathanAllan für das Speichern eines Bytes!
Erläuterung
quelle
N1¦ṙ⁸ḢƊÐLḢẸ
Python 3 , 91 Bytes
Probieren Sie es online!
-40 Bytes dank JoKing und Jitse
quelle
while
Bedingung umformuliert wird.Perl 6 ,
46 4336 BytesProbieren Sie es online!
Stellt halt by dar
0
und gibt true zurück, wenn der Computer anhält. Dies wiederholt die logischen2**(length n)
Zeiten, in denen der Zeiger, wenn er auf der Haltezelle endet, dort bleibt, sonst befindet er sich auf einer nicht-Haltezelle.Dies funktioniert, weil es nurOkay ja, es gibt Zustände als das, aber aufgrund der begrenzten möglichen Übergänge zwischen Zeigern (und daher Zuständen) wird es weniger als 2 ** $ _ Zustände geben ... Ich denke2**n
mögliche Zustände (ohne Berücksichtigung der angehaltenen Zellen) für die Foo-Maschine gibt, da jede nicht angehaltene Zelle nur zwei Zustände hat.Erläuterung
quelle
05AB1E ,
1413 BytesProbieren Sie es online!
Übernimmt die Eingabe als eine Liste von Ganzzahlen mit 0 als Halteanweisung. Gibt 1 zum Anhalten und 0 zum Nichtanhalten zurück.
Vielen Dank an @KevinCruijssen für das Speichern von 2 Bytes!
quelle
ć
! Ich habe auf eine Erklärung gewartet, in der Hoffnung, meine Antwort zu finden, aber Sie haben mich geschlagen, haha. ; p -1 Byte für den gleichen Golf wie meine Antwort tut aber:g·F
zu«v
( Versuchen Sie es online. )©®
anstelle vonDŠs
:«vć©(š®._}®_
( Versuchen Sie es online. )«v
zugoF
.Java 8,
787973 BytesEinfacher Port der C # .NET-Antwort von @EmbodimentOfIgnorance. Stellen Sie also sicher, dass Sie ihn unterstützen!
Vielen Dank an @Arnauld für das Auffinden von zwei Fehlern (was auch für einige andere Antworten gilt).
Führt zu einem
java.lang.ArithmeticException: / by zero
Fehler, wenn er angehalten werden kann, oder zu keinem Fehler, wenn nicht.Probieren Sie es online aus.
Erläuterung:
quelle
int*
(von codegolf.meta.stackexchange.com/a/13262/84206 )Haskell , 79 Bytes
Probieren Sie es online!
Rückgabe
True
für das Anhalten von Maschinen undFalse
ansonsten. Eingabe in Form einer Liste mit0
Darstellung eines Haltezustands.Nimmt eine Version von GHC größer als 8.4 an (veröffentlicht im Februar 2018).
quelle
JavaScript (Node.js) ,
7167 ByteGrundsätzlich identisch mit der C # .NET-Antwort von @EmbodimentOfIgnorance
4 Byte sparen dank @Arnaud
Probieren Sie es online!
JavaScript (Node.js) , 61 Byte
Diese Version wird
undefined
als Haltesymbol verwendet und wirft ein,TypeError: Cannot read property 'f' of undefined
wenn die Maschine anhält, und wird leise beendet, wenn die Maschine nicht anhält.Probieren Sie es online!
quelle
Scala , 156 Bytes
IMO immer noch golffähig, aber im Moment bin ich damit einverstanden. Gibt
0
für nicht haltendeFoo
s und1
für haltendeFoo
s zurück. Nimmt die Eingabea
als einArray[Int]
, soh
wird als genommen0
.Die Laufzeit ist ziemlich lang (etwa 4 Sekunden für alle Testfälle), da ich mehrere vollständige Array-Suchvorgänge durchgeführt habe und
.deep
Kopien erstellt habe. Sie können sie jedoch weiterhin online testen .quelle
Perl 5
-ap
, 88 BytesProbieren Sie es online!
quelle
Attache , 40 Bytes
Probieren Sie es online!
Erläuterung
Dies führt eine einzelne Iteration der Foo-Maschine durch. Es negiert das erste Element und dreht dann das Array um das (ursprüngliche, nicht negierte) erste Element des Arrays.
Periodic
Wendet diese Funktion an, bis sich ein doppeltes Ergebnis angesammelt hat. Eine Maschine hält an oder geht in eine triviale Endlosschleife. Wenn es anhält, ist das erste Element 0. Andernfalls ist es ungleich Null.&N
ist eine einfache Methode, um das erste Element eines numerischen Arrays zu erhalten. DannNot
kehrttrue
für 0 (Anhalten Maschinen) undfalse
für alles andere (nicht stockend Maschinen).quelle
Kohle , 28 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Die Ausgabe erfolgt mit der booleschen Standardausgabe von Charcoal, die
-
für true und nichts für false steht. Erläuterung:Initialisieren Sie den Anweisungszeiger.
Schleife so oft es theoretisch mögliche Zustände gibt.
Negieren Sie den Wert am Befehlszeiger.
Subtrahieren Sie den neuen Wert vom Anweisungszeiger. Die Array-Zugriffe von Charcoal sind zyklisch, sodass das kreisförmige Band von Foo automatisch emuliert wird.
Geben Sie am Ende der Schleife aus, ob das Programm angehalten wurde.
quelle
Stax , 11 Bytes
Führen Sie es aus und debuggen Sie es
Die Eingabe erfolgt in Form eines Integer-Arrays, wobei
0
halt dargestellt wird.Es gibt
1
für eine stoppende und0
für eine nicht stoppende Maschine aus.quelle
Pyth , 12 Bytes
Testsuite!
Verwendet den direkten Ansatz. Wiederholen Sie den Vorgang, bis die Liste zweimal in identischem Zustand angezeigt wird. Bei Programmen, die angehalten werden, wird die Liste irgendwann einen Vorsprung haben,
0
da an dieser Stelle die Rekursion endet. Bei Programmen, die nicht angehalten werden, beginnt die Liste nicht mit dem0
, sondern befindet sich in einem Zustand, in dem der Prozess regelmäßig abläuft und die Foo-Maschine daher nicht angehalten wird.quelle