Schlangen sehen so aus:
>>>v
@ ^ v
^ >>>^ v
^ v
^<<<<<<<<<
Die Schlange kann sich wie folgt kreuzen:
@
^
>^>v
^<<
Damit eine Frequenzweiche gültig ist, müssen sich die Zeichen auf beiden Seiten in dieselbe Richtung bewegen. Der Fall von
@
>^v
^<
kann als unklar und ungültig angesehen werden.
Die Ausgabe ist eine Zeichenfolge, WASD
die den Übergang vom Kopf zum Schwanz ( @
) darstellt.
Können Sie bei einer Schlange, die nicht rückwärts läuft und nicht mehrdeutig ist, ein Programm schreiben, das die Folge von Zügen ausgibt, die die Schlange ausführt?
Das ist Code-Golf, also gewinnt die kürzeste Antwort!
Testfälle:
(Hinweis: Das @
kann durch ein beliebiges Zeichen ersetzt werden, das nicht in enthalten ist. v^<>
)
Eingang:
>>>>v
v
v<< @
v ^
>>>>>^
Ausgabe: ddddssaassdddddww
Eingang:
@>>v
^ v
^ v
^<<<
Ausgabe: dddsssaaawww
Eingang:
>>>v
v @
v ^
>>>>v ^
>>>>^
Ausgabe: dddsssddddsddddwww
Eingang:
@<< v
^ v
v<^<<
v ^
>>^
Ausgabe: ssaaaassddwwwwaa
Eingang:
@v<v
^v^v
^v^<
^<
Ausgabe: ssawwasssawww
Antworten:
Java,
626539536529 Bytes-87 Bytes durch Speichern einiger weniger an vielen Stellen. Vielen Dank an Herrn Public für den Hinweis.
-3 Bytes, da ich nicht in der Lage bin, alle Leerzeichen zu entfernen (danke mbomb007)
+8 Bytes für diesen Fall zu beheben:
-15 Bytes durch Frontloading-Variablendeklaration
Lesbare Version:
Nimmt einen String wie
v @\n>>>^
. Erstellt einen Pfad, der an jeder Koordinate beginnt, und gibt dann den längsten zurück. Der für die überlappenden Pfade erforderliche Vorausblick war der schwierigste Teil.quelle
Ruby, 217
Dies beginnt am
@
und geht rückwärts, wobei nach Nachbarn gesucht wird, die auf die aktuelle Position zeigen (z
). Um an Kreuzungen mit vier Richtungen den richtigen Weg zu wählen, werden Nachbarn bevorzugt, die in dieselbe Richtung zeigen (max_by{...}
). Wenn keine unmittelbaren Nachbarn gefunden werden, wird davon ausgegangen, dass ein Crossover stattgefunden hat, und es wird jeweils eine Ebene nach der anderen erreicht, bis ein (until n
undc+=1
) gefunden wird. Dieser Vorgang wiederholt sich für die Anzahl der Körpersegmente (ohne Kopf) (.scan(/\w/){...}
).Der Testfall, den ich zu dem Puzzle hinzugefügt habe, hat mich immer wieder aus der Fassung gebracht, also bin ich von 182 Zeichen auf 218 übergegangen. Diese zusätzlichen Charaktere haben alle dafür gesorgt, dass meine horizontalen Züge nicht in die nächsten / vorherigen Zeilen eingingen. Ich frage mich, ob ich besser damit umgehen kann.
Ungolfed:
quelle