Um das Halteproblem zu lösen, erhalten Sie eine Beschreibung eines Programms und müssen bestimmen, ob es jemals beendet wird oder nicht. Sie können dies niemals für alle Programme tun. Doch für Programme wie (in brainf *** ):
>
Es wird offensichtlich aufhören und für Programme wie:
+[]
Das wird es offensichtlich nicht. Ihre Herausforderung besteht darin, das Stoppproblem für so viele Programme wie möglich zu "lösen". Diese Programme verwenden .
oder nicht ,
und haben keine Eingabe oder Ausgabe. Sie erhalten eine Beschreibung des Programms und müssen entweder "Halts", "Stoppt nicht" oder "Unbekannt" ausgeben. Wenn Ihr Programm "Halts" oder "Stoppt nicht" ausgibt, haben Sie das Eingabeprogramm gelöst. Hier sind einige Anforderungen.
- Es muss mindestens unendlich viele Programme lösen.
- Für jedes Programm, das es löst, muss seine Lösung korrekt sein.
- Sie können nur 1 der 3 oben genannten Optionen ausgeben.
- Sie können davon ausgehen, dass der laufende Computer über unendlich viel Zeit und Speicher verfügt, sodass XKCD 1266 nicht funktioniert (das Band ist unbegrenzt).
- Keine externen Ressourcen.
- Möglicherweise verwenden Sie keine Programmiersprache, die das Stoppproblem tatsächlich lösen kann .
Möglicherweise haben Sie ein Nebenprogramm ohne Code, das eine Zeichenfolge verwendet, die ein Programm ist, und auf Wunsch eine Art abstrakten Syntaxbaum daraus generiert. Beachten Sie, dass dies an sich keine wirkliche Punktzahl ist, sondern wie festgestellt werden kann, ob ein Programm ein anderes schlägt.
- Wenn Programm A eine unendliche Anzahl von Programmen löst, die B nicht löst, B jedoch nur endliche oder keine Programme löst, die A löst, gewinnt A automatisch.
- Andernfalls gewinnt das Programm mit den wenigsten Zeichen. Zählen Sie keine Leerzeichen oder Kommentare, also verschleiern Sie Ihren Code nicht.
Tipp: Timer funktionieren nicht. Sie sehen, für jede Zeit T und gegebene Maschine gibt es ein N, so dass alle Programme, die länger als diese sind, mehr als T Zeit benötigen müssen. Dies bedeutet, dass ein Timer nur die Lösung einer endlichen Anzahl von Programmen erreichen kann, und wie Sie oben sehen können, hilft das Lösen einer endlichen Anzahl von Programmen nicht.
>
, ignoriere es." Dann wäre dein Ding überflüssig.
>
s nach Programmende ignoriert , und suchen Sie dann ein Programm P, in dem S' mit "Unbekannt" antwortet, und erstellen Sie dann eine neue Lösung, die auf P mit richtig antwortet >
s angehängt und gibt die Antwort von S 'anders. Da S ' >
s ignoriert, wird P mit einer beliebigen Anzahl von >
s auch nicht von S' gelöst.
>
s wird am Ende hinzugefügt (da diese anhalten, wenn P anhält) und gibt die Antwort von S auf alle anderen Eingaben aus. Diese neue Lösung löst unendlich mehr Probleme als S.