Stellen Sie sich einen Pfad vor, der aus <
und besteht >
und in einem endet @
, z
><>@
Ein Wanderer beginnt in der Zelle ganz links. Er wird den Pfad wie folgt durchlaufen:
- Wenn der Wanderer in einer
@
Zelle ist, hat er das Ziel erreicht und ist fertig. - Befindet sich der Walker in einer
>
Zelle, verschiebt sich der gesamte Pfad zyklisch einen Schritt nach rechts und nimmt den Walker mit . - Befindet sich der Walker in einer
<
Zelle, verschiebt sich der gesamte Pfad zyklisch um einen Schritt nach links und nimmt den Walker mit . - Danach macht der Läufer einen einzelnen Schritt. Wenn er sich an einem Ende des Pfades befindet, bewegt er sich vom Ende weg. Andernfalls bewegt er sich weiter in die Richtung, in die er sich beim letzten Schritt bewegt hat (ohne Berücksichtigung der Drehung) und geht zunächst nach rechts.
Lassen Sie uns das obige Beispiel durcharbeiten. Die Position des Wanderers ist markiert mit ^
:
><>@ --rotate--> @><>
^ ^
step right (first step):
@><> --rotate--> ><>@
^ ^
step right:
><>@ --rotate--> @><>
^ ^
step left (dead end):
@><> --rotate--> ><>@
^ ^
step left:
><>@ --rotate--> @><>
^ ^
step left:
@><> Goal reached!
^
Der Walker besuchte dabei 6 Zellen (einschließlich der Startzelle sowie der @
und zählte jede Zelle so oft, wie sie besucht wurde).
Hier ein kleines Beispiel, bei dem der Läufer durch eine Drehung über die Kanten transportiert wird:
>>@ --rotate--> @>>
^ ^
step right (first step):
@>> --rotate--> >@>
^ ^
step right (dead end):
>@> Goal reached!
^
Diesmal besuchte der Wanderer 3 Zellen.
Wir können dies leicht in eine ganzzahlige Folge umwandeln:
- Sie erhalten eine positive ganze Zahl N , z
9
. - Sie berechnen die binäre Darstellung dieser ganzen Zahl, z
1001
. - Dann biegen Sie
1
in>
und0
in<
und fügen Sie ein@
:><<>@
. - Wir assoziieren mit N die Anzahl der vom Wanderer besuchten Zellen in der auf diese Weise konstruierten Anzahl.
Die ersten Elemente der resultierenden Sequenz sind:
2, 3, 3, 4, 6, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6,
6, 10, 6, 10, 8, 8, 6, 10, 8, 8, 6, 6, 6, 6, 7, 7
Das mag recht willkürlich erscheinen, aber die resultierende Sequenz hat tatsächlich eine Menge Struktur:
Als Referenz finden Sie die ersten 2048 Nummern der Sequenz in diesem Pastebin .
Die Herausforderung
Sie haben es erraten: Sie müssen die obige Sequenz berechnen. Sie können dies auf drei Arten tun:
- Sie können eine unendliche Folge erzeugen (solange der Speicher dies zulässt), indem Sie entweder fortlaufend Werte ausgeben (durch nicht numerische Zeichen getrennt) oder indem Sie einen unendlichen Generator in Sprachen verwenden, die diese unterstützen. Wenn Sie einen unendlichen Datenstrom nach STDOUT drucken, müssen Sie die Zahlen nicht einzeln drucken, sondern müssen sicherstellen, dass jede Zahl nach einer begrenzten Zeitspanne (und in der angegebenen Reihenfolge) gedruckt wird. Wenn Sie diese Option verwenden, sollten Sie keine Eingaben vornehmen.
- Sie können eine ganze Zahl N als Eingabe nehmen und den N- ten Term der Sequenz erzeugen .
- Sie können eine ganze Zahl nehmen N als Eingabe und produziert alles auf bis die N - te Glied der Folge, entweder als Liste oder String ein eindeutiges Trennzeichen verwenden.
Da ich Sprachen, die nicht einfach zwischen Basen konvertieren können, nicht bestrafen möchte, können Sie anstelle der Ganzzahl N die Binärdarstellung von N verwenden 0
und dabei 1
wie gewohnt s und s (als Liste oder Zeichenfolge) mit den meisten verwenden -signifikantes Bit zuerst.
Sie können ein Programm oder eine Funktion schreiben, indem Sie eine Eingabe über STDIN (oder die nächstgelegene Alternative), ein Befehlszeilenargument oder ein Funktionsargument vornehmen und das Ergebnis über STDOUT (oder die nächstgelegene Alternative), einen Funktionsrückgabewert oder einen Funktionsparameter (out) ausgeben.
Es gelten die Standardregeln für Code-Golf .
Hintergrund
Dies berechnet tatsächlich die Anzahl der "Ticks", die ein einfacher Interpreter meiner esoterischen Programmiersprache Labyrinth benötigen würde, um den "Pfad" als Quellcode zu interpretieren. In diesem Fall ist der "Walker" einfach der Befehlszeiger (der eine Position und eine Richtung hat), der @
Befehl beendet das Programm <
und >
sind Quellcode-Änderungsbefehle.