Eislabyrinthe sind seit ihrem Debüt in Pokémon Gold und Silber eine meiner Lieblingsheftklammern bei Pokémon- Spielen. Ihre Aufgabe wird es sein, ein Programm zu entwickeln, das diese Art von Problemen löst.
Eislabyrinthe bestehen hauptsächlich aus Eis, wie der Name schon sagt. Sobald sich der Spieler auf Eis in eine Richtung bewegt, bewegt er sich weiter in diese Richtung, bis er auf ein Hindernis stößt. Es gibt auch Boden, der frei bewegt werden kann und jeden Spieler davon abhält, sich darüber zu bewegen. Das letzte Hindernis ist Stein. Der Stein kann nicht das gleiche Feld wie der Spieler einnehmen. Wenn der Spieler versucht, sich darin zu bewegen, hört er auf, sich zu bewegen, bevor er kann.
Sie erhalten einen zweidimensionalen Wertebehälter, z. B. eine Liste mit Listen oder eine durch Zeilenumbrüche getrennte Zeichenfolge, die drei unterschiedliche Werte für jeden der drei Bodentypen (Eis, Boden und Stein) enthält. Sie erhalten außerdem zwei Paare (oder andere gleichwertige zwei Wertecontainer), die eine Start- und Zielkoordinate im Labyrinth angeben. Diese können null oder eins sein.
Sie müssen eine Liste von Zügen ausgeben (4 verschiedene Werte mit einer Bijektion auf N, E, S, W), die den Spieler veranlassen würden, am Ende anzukommen, wenn sie ausgeführt werden.
Die Eingabe hat immer einen geschlossenen Steinumfang um das Labyrinth, sodass Sie sich keine Sorgen machen müssen, dass der Spieler das Labyrinth verlässt
Dies ist Code-Golf, so dass die wenigsten Bytes gewinnen
Testfälle
Hier .
wird Eis dargestellt, ~
wird Boden dargestellt und O
wird ein Stein dargestellt. Koordinaten sind 1 indiziert. Jeder Buchstabe in der Lösung stellt die Richtung dar, die mit diesem Buchstaben beginnt (z. B. N
= Norden).
Eingang
OOOOO
OO.OO
O...O
OOOOO
Start : 3,3
End : 3,2
Ausgabe
N
Eingang
OOOOOOOOOOOOOOOOO
O........O.....OO
O...O..........OO
O.........O....OO
O.O............OO
OO.......O.....OO
O.............OOO
O......O.......~O
O..O...........~O
O.............OOO
O.......O......OO
O.....O...O....OO
O..............OO
OOOOOOOOOOOOOO~~O
OOOOOOOOOOOOOOOOO
Start : 15,12
End : 16,8
Ausgabe
N,W,N,E,N,E,S,W,N,W,S,E,S,E,N,E,N
Eingang
OOOOOOOOOOOOOOOO
O~~~~~OOOOO~~~~O
O~~O~OOOOOOO~~OO
O...O..........O
O........O.....O
O..............O
OO.............O
O.............OO
O....~....O....O
O..............O
O..............O
OOOOOOOOOOOOOOOO
Start : 2,2
End : 14,3
Ausgabe
E,S,S,W,N,E,N
Eingang
OOOOOOOOOOOOOOOOOOO
O~~~~~~~OOOOOOOOOOO
O~~~~...OOOOOOOOOOO
OO~O~..OOOOOOOOOOOO
O..OO.............O
O..............O..O
O....O............O
O.O............~..O
O........OOOO.....O
O.......OOOOO.....O
O.......O~~~O.....O
O.......~~~~~.....O
O.......~~~~~.....O
O..........O......O
O..O..~...........O
O...............O.O
O.....O...........O
O.................O
OOOOOOOOOOOOOOOOOOO
Start : 2,2
End : 11,11
Ausgabe
E,E,E,E,E,S,S,E,N,W,S,E,N,N,N
quelle
Antworten:
Mathematica, 247 Bytes
Mit Zeilenumbrüchen:
Meine unmittelbare Idee war es, die Eis- und Bodenpositionen als Knoten in einem Diagramm mit gerichteten Kanten darzustellen, die legalen Bewegungen entsprechen, und dann zu verwenden
FindPath
. Man könnte denken, dass die Bestimmung der rechtlichen Schritte der einfache Teil und das Finden der Lösung der schwierige Teil wäre. Für mich war es das Gegenteil. Offen für Vorschläge zur Berechnung der Kanten.Das erste Argument
#
ist ein 2D-Array, in dem0
Eis,1
Boden und2
Stein dargestellt werden.Das zweite Argument
#2
und das dritte Argument#3
sind die Start- bzw. Endpunkte in der Form{row,column}
.
ist das 3-Byte-ZeichenU+F4A1
für den privaten Gebrauch\[Function]
.Erläuterung
Definiert eine Funktion,
p
die eine Listex
der Formulare{row,column}
und Ausgaben annimmt#[[row,column]]
. dh der Eis- / Boden- / Steinwert bei dieser Koordinate.Definiert eine Funktion,
m
die eine Startpositionc
und einen Richtungsvektor annimmtv
und rekursiv festlegt, wo Sie enden würden. Wennc+v
es Eis gibt, gleiten wir von diesem Punkt aus weiter, sodass es zurückkehrtm[c+v,v]
. Wennc+v
Erde ist, dann bewegen wir uns zuc+v
und halten an. Andernfalls (wennc+v
Stein oder außerhalb der Grenzen), bewegen Sie sich nicht. Beachten Sie, dass dies nur für Eis- oder Bodenpositionen vorgesehen ist.Definiert die Liste
g
der Eis- und Bodenpositionen (p
Wert kleiner als2
).Definiert eine Funktion ,
a
die eine Startposition einnimmtc
und gibt die Ergebnisse des Bewegens in den{1,0}
,{-1,0}
,{0,1}
, und{0,-1}
Richtungen. Möglicherweise liegt eine gewisse Redundanz vor. Dies setzt wiederum voraus, dass diesc
Eis oder Erde entspricht.Definiert die Liste
e
der gerichteten Kanten, die zulässige Bewegungen darstellen. Berechnen Sie für jede Position#
ing
die Kantentabelle#->c
für jedec
ina@#
. Da wir dann für jede Position eine Unterliste haben#
, reduziere ich die erste Ebene. Es kann einige Schleifen und mehrere Kanten geben.Graph[e]
ist die Grafik, in der die Knoten die legalen Positionen (Eis oder Boden) und die Kanten legale Bewegungen darstellen (möglicherweise gegen einen Stein stoßen und sich nicht bewegen). Wir verwenden dannFindPath
, um einen Pfad von#2
bis zu finden ,#3
der als Liste von Knoten dargestellt wird. DaFindPath
zusätzliche Argumente erforderlich sind, um mehr als einen Pfad zu finden, ist das Ergebnis tatsächlich eine Liste, die einen einzelnen Pfad enthält. Daher verwende ich das erste Element[[1]]
. Dann nehme ich nacheinanderDifferences
die Koordinaten undNormalize
diese. Also oben ist{-1,0}
, unten ist{1,0}
, rechts ist{0,1}
und links ist{0,-1}
.Testfälle
quelle
JavaScript (ES6) 180
183Verwenden eines BFS , wie ich es getan habe, um diese verwandte Herausforderung zu lösen
Eingabe
Die Labyrinthkarte ist eine mehrzeilige Zeichenfolge mit
O
oder0
für Stein8
für Erde und einer beliebigen Ziffer ungleich Null, die für Eis kleiner als 8 ist (7
sehen Sie gut aus).Start- und Endposition sind nullbasiert.
Ausgabe
Eine Liste von Offsets, wobei -1 ist
W
, 1 istE
, negativ kleiner als -1 istN
und positiv größer als 1 istS
Weniger golfen
Prüfung
quelle