Einführung
Jeder weiß, dass die Möglichkeit, erfolgreich durch ein Asteroidenfeld zu navigieren, ungefähr 3.720 zu 1 beträgt. Trotz Ihrer Warnung ist Han Solo immer noch bereit, sein Glück zu versuchen.
Aus Angst um Ihr künstliches Leben, entscheiden Sie Code, in dem eigentümlichen Dialekt des Schiffs ( lesen: Ihre bevorzugten Code Golf Sprache ), ein Asteroiden Vermeidungsprogramm, welcher Weg zu nehmen in einem Asteroidenfeld ASCII - Labyrinth wird entscheiden.
Eingang
Der Millenium Falcon verfügt über ein Asteroidenfeld-Mapping-Programm, das ähnliche Daten liefert:
| ##### ######### |
| ###### # ### # |
| # # # # #### # |
@ ## ####
|# # # ### ## |
|## ## #### # # |
|#### ##### # ## |
Die oberen Reihen befinden sich links vom Falken, die unteren Reihen rechts vom Falken und die Spalten repräsentieren, was sich vor dem Schiff befindet.
- Jeder
#
ist ein Hindernis. - Jedes Feld ist ein leeres Feld, in das das Schiff fliegen kann.
- Die Eingabe ist immer 7 Zeichen hoch. Dies ist die maximale Asteroidenkartierungsbreite.
- Die Eingabe ist immer 32 Zeichen lang (30 für das Feld selbst und 2 für die Start- und Endbegrenzung). Dies ist die Obergrenze für die Asteroidenkartierung. Vertikale Balken
|
markieren den Anfang und das Ende des Mappings. @
ist der Falke. Es befindet sich immer in der mittleren Zeile (4. Zeile) und in der ersten Spalte der Eingabe.- Der in den vertikalen Balken in der letzten Spalte verbleibende Raum ist der Ort, an dem das Schiff ankommen muss. Es befindet sich immer in der mittleren Zeile (4. Zeile) und in der letzten Spalte der Eingabe.
Die Eingabe kann als mehrzeilige Zeichenfolge, als Array von Zeichenfolgen, aus STDIN oder Funktionsparametern oder aus einer Datei gelesen werden.
Mögliche Manöver
Sie werden von TIE-Fighters verfolgt, deshalb müssen Sie immer vorwärts gehen. Es gibt also drei Möglichkeiten, wie das Schiff bei jedem Schritt fliegen kann:
-
Nach vorne/
Vorwärts und links abbiegen\
Vorwärts und rechts abbiegen
Dies sind beispielsweise gültige Pfade:
@---
--
/ \ /
@ -
-
/ \
/ \
@ \
Wie Sie sehen, gibt es immer genau einen Zug pro Spalte. Der Falke ist ein Stück Müll, deshalb kann er keine gewaltsamen Wendungen machen. Was bedeutet, dass Bewegungen wie /\
oder \/
nicht erlaubt sind . Es muss mindestens ein reiner Stürmer -
zwischen zwei entgegengesetzten Kurven sein. Auf der anderen Seite ist es möglich, mehrere Schritte hintereinander in eine Richtung zu drehen, wie oben gezeigt.
Der Falke stürzt ab, wenn ein Zug das Schiff an eine Stelle bringt, an der sich ein Hindernis befindet. Diese Bewegungen führen beispielsweise zu Abstürzen:
@-#
@
\
#
#
/
@
Beachten Sie, dass dies kein Absturz ist:
@-#
\
-
Ausgabe
Sie müssen dasselbe Asteroidenfeld ASCII mit einem gültigen Pfad bis zum Ende ausgeben. Der Falcon muss am Endpunkt statt am Startpunkt gedruckt werden.
Eine gültige Ausgabe für das zuvor angegebene Eingabebeispiel wäre beispielsweise:
| ##### ######### |
| ###### #-------- ### # |
| # # #/ # ####\ # |
--------- ## \ #### ----@
|# # # ### \ ## / |
|## ## #### \ #/ # |
|#### ##### #-- ## |
Ihr Weg muss nur den Falken nicht zum Absturz bringen. Es muss nicht der kürzest mögliche Weg sein.
Sie können davon ausgehen, dass es immer mindestens einen möglichen Weg zum Ende geben wird.
Sie können nach STDOUT, in einer Datei oder in einem gleichwertigen Format ausgeben, solange das Asteroidenfeld genau wie in diesem Beitrag gedruckt wird (z. B. ist die Ausgabe einer Koordinatenliste für den Pfad ungültig).
Testfälle
Ein normales Asteroidenfeld
| ##### ######### | | ###### # ### # | | # # # # #### # | @ ## #### |# # # ### ## | |## ## #### # # | |#### ##### # ## |
Mögliche Ausgabe
| ##### ######### | | ###### #-------- ### # | | # # #/ # ####\ # | --------- ## \ #### ----@ |# # # ### \ ## / | |## ## #### \ #/ # | |#### ##### #-- ## |
Hyperreguläres Asteroidenfeld
|# # # # # # # # # # # # # # # | | # # # # # # # # # # # # # # #| |# # # # # # # # # # # # # # # | @ # # # # # # # # # # # # # # |# # # # # # # # # # # # # # # | | # # # # # # # # # # # # # # #| |# # # # # # # # # # # # # # # |
Mögliche Ausgabe
|# # # # # # # # # # # # # # # | | # # # # # # # # # # # # # # #| |# # # # # # # # # # # # # # # | -# #-# #-# #-# #-# #-# #-# #--@ |#\#/#\#/#\#/#\#/#\#/#\#/#\#/# | | #-# #-# #-# #-# #-# #-# #-# #| |# # # # # # # # # # # # # # # |
Der Kern des Todessterns
| # # # # | | # # # | | # # # # # | @ # # # # # | # # # # | | # # # # # | | # # # # |
Mögliche Ausgabe
| # # # -- # | | --- # # / #\ - | | / #\ # # / # \ /#\ | - # \ # #/ # - # ----@ | # \ # ---- # # | | # \#/ # # # | | # - # # # |
Todesstern Graben
|##############################| |##############################| |##############################| @ |##############################| |##############################| |##############################|
Ausgabe
|##############################| |##############################| |##############################| ------------------------------@ |##############################| |##############################| |##############################|
Asteroidenhöhle
|### ##########################| |## # ############### ## ######| |# ### ######## ### ## # #####| @ ###### ###### ### ## ### |######## ### ### ## #########| |########## # ### ## ##########| |########### #####|
Mögliche Ausgabe
|###-##########################| |##/#\############### ##-######| |#/###--######## ### ##/#\#####| -######\###### ### ##/###-----@ |########--### ### ##/#########| |##########\# ### ##/##########| |###########-------- #####|
Wertung
R2D2 ist gerade mit dem Schwimmen in Sümpfen beschäftigt, daher müssen Sie die Steuerung des Falcon selbst programmieren, was mühsam ist. Daher gewinnt der kürzeste Code .
-
in jeder Runde den Weg, der als "Vorwärtsbewegung" definiert ist. Die tatsächlichen Bewegungen sind jedoch immer zwei diagonale-links, gefolgt von zwei diagonale-rechts.Antworten:
JavaScript (ES6), 186
201Runnable-Snippet:
Diese Funktion akzeptiert einen einzelnen String mit Zeilenumbrüchen. Die Funktion teilt den String mithilfe des
...
Operators in ein Array auf und erhält den Index für die(x,y)
Koordinaten von(33 * y) + x
.Die Funktion wird rekursiv ausgeführt und testet verschiedene mögliche Bewegungen für jedes Feld. Wenn es auf ein Hindernis stößt, wird ein falscher Wert zurückgegeben, und wenn es das Endzielfeld erreicht, wird es zurückgegeben
true
. (Im Golfcode wird dies vontrue
erstellt!console.log(...)
.)Beachten Sie, dass dieser Code keine langen Züge nach rechts verwendet, sondern sie mit geraden Zügen interpunktiert. Das heißt, es wird die zweite Option unten ausgeführt, nicht die erste:
Dies scheint legal zu sein, da
-
dies legal vor oder nach einer Wende erfolgen kann. Warum also nicht beide gleichzeitig? Das sieht am Ende besonders seltsam aus, wenn der letzte Zug\
aber wie folgt angezeigt wird@
:Mein fieser Lieblingsgolfhack hier ist der Standardargumentmissbrauch
c=k=" "
. Die Argumente(i,l,c=" ")
würden sagen , „die Zeichenfolge verwenden" "
für ,c
wennf
nicht ein drittes Argument geliefert“. Allerdings , indem Siec=k=" "
, sagen wir , „wennc
nicht geliefert wird, zu speichern" "
in den globalen Variablenk
und dann in diesem Wert speichernc
als auch“. Da die Rekursion mit nur einem Argument beginnt,k
wird beim ersten Funktionsaufruf immer initialisiert.Mild ungolfed:
quelle
" "
in einer Variablen zu speichern ), die meine Punktzahl noch weiter gesenkt haben.C (vollständiges Programm),
249247235 BytesDies ist ein vollständiges Programm, das die Eingabe aus einer Datei liest und das Ergebnis an stdout ausgibt. Der Name der Datei wird als Parameter an das Programm übergeben.
Ungolfed:
Ausgabe:
quelle
-
folgt ein\
, aber das\
wird von der verdeckt@
. (Mein Programm macht das gleiche.)Common Lisp, 303 Bytes
Ich hatte viel Spaß mit dieser Herausforderung, es ist die erste Codegolf-Aufgabe, die ich gemacht habe. Grundsätzlich gibt es eine einfache rekursive Funktion, die jede mögliche Bewegung versucht, bis die Endposition erreicht ist.
Golf / Minified
Liest Eingaben aus einer Datei i im Arbeitsverzeichnis. Ich bin mir ziemlich sicher, dass es noch Verbesserungspotenzial gibt.
Einfacher Code
Beispielausgabe
quelle
ActionScript 3, 364 Byte
Ich habe dies in zwei Funktionen aufgeteilt; eine, um das Array in ein Array von Arrays umzuwandeln, und eine rekursive, um die Flugbahn zu berechnen.
Ungolfed-Version in einem Programm mit einem Beispiel für ein Asteroidenfeld:
quelle