Roguelike Wegfindung
Ihre Aufgabe ist es, anhand einer zweidimensionalen Anordnung der unten beschriebenen Elemente, die ein Verlies darstellen, eine einzelne Zahl auszugeben oder zurückzugeben, die die Menge der Goldstücke darstellt, die der Schurke sammeln kann, ohne Monster zu wecken.
Die Elemente des Arrays lauten wie folgt:
- Leerzeichen werden durch entweder
.
ein Leerzeichen oder ein Leerzeichen dargestellt. - Rogues Ausgangsposition ist natürlich vertreten durch
@
; - Ein Goldstück wird dargestellt durch
$
; - Wände werden dargestellt durch
#
; - Monster werden von Zeichen aus dem folgenden regulären Ausdruck dargestellt wird :
[a-zA-Z*&]
.
Das Array darf keine Zeichen enthalten, die nicht oben aufgeführt sind. Sie können also davon ausgehen, dass alles, was keine Mauer, kein leerer Raum, kein Schurke oder kein Goldstück ist, ein Monster ist.
Die Regeln für die Wegfindung sind:
- Der Schurke kann nur durch leere oder goldhaltige Zellen gehen;
- Es dauert eine Runde, um zu einer benachbarten oder diagonal benachbarten Zelle zu gelangen.
- Das Gold zu holen ist augenblicklich;
- Der Schurke kann nicht länger als eine Runde neben oder diagonal neben einem Monster bleiben, ohne es aufzuwecken, was verboten ist.
- Der Schurke kann das Bewusstseinsgebiet eines Monsters beliebig oft betreten. Das Monster wacht nur auf, wenn der Schurke zwei aufeinanderfolgende Runden in der Nähe des Monsters verbringt .
Eingabe- und Ausgaberegeln
Sie können die Eingabe in jedem vernünftigen Format abrufen, einschließlich eines zweidimensionalen Arrays, eines flachen Arrays, einer Zeichenfolge oder was auch immer. Wenn es Ihnen das Leben erleichtert, können Sie auch die Abmessungen des Arrays bestimmen.
Es ist garantiert, dass der Schurke am Anfang nicht in der Nähe eines Monsters ist.
Ein volles Programm oder eine Funktion ist in Ordnung.
Wertung
Dies ist Code-Golf , die Punktzahl ist die Anzahl der Bytes Ihrer Einreichung, wobei weniger besser ist.
Testfälle
Ich verwende hier Punkte für Leerzeichen, um die Lesbarkeit zu verbessern. Wenn Sie dies wünschen, können Sie Leerzeichen verwenden (siehe oben). Beachten Sie auch, dass dies ein reiner Zufall ist, dass sich der Schurke immer in der oberen linken Ecke befindet und Ihr Code auch jede andere gültige Position verarbeiten sollte.
1)
@..
.$.
... -> 1
Nur ein Gesundheitstest.
2)
@....
...g$
..... -> 0
Wieder ein Gesundheitstest.
3)
@....
...$g
..... -> 1
Der Schurke kann das Gold greifen, indem er von links einrückt.
4)
@....g..
.......$
........
.....h.. -> 1
Der Schurke kann zwischen den Monstern im Zick-Zack verkehren und sich nie länger als eine Runde in der Nähe aufhalten.
5)
@....z..
.......$
.....b.. -> 0
Die Taktik aus dem vorherigen Testfall funktioniert hier nicht - die Monsterempfindlichkeitsbereiche überlappen sich.
6)
@$#.
###$
.... -> 1
Gesundheitstest.
7)
@..#..
$.$g.$
...#.. -> 2
Dito.
8)
@#.d#$
$...##
e.....
..$...
##..$b
.#..g$ -> 3
Von all dem Gold sind hier nur drei sicher zu erreichen: Das Gold in der Nähe der Startposition kann durch Herunterschieben um eins und dann zurück in die Startposition erhalten werden. Um aus der oberen linken Ecke zu entkommen, muss sich der Schurke zweimal diagonal nach rechts unten bewegen. Das Gold in der Mitte ist keine Herausforderung. Das äußere Gold wird von bewacht g
und b
kann erhalten werden, indem man diagonal von der Stelle rechts neben dem mittleren Gold und dann zurück zieht. Der Rest ist nicht zu bekommen: Das Gold oben rechts ist durch Wände blockiert, und das Gold unten rechts erfordert zwei Runden in den empfindlichen Bereichen der Monster.
Die folgenden Testfälle wurden von mbomb007 großzügig gespendet.
9)
12345678
a @....g.D
b .......$
c ......#.
d .....h.. -> 1
Dieser ist schwierig. Ein Weg ist b4-b5-c6-b7-c8-b8(grab)
.
10)
12345678
a @....g.D
b .......$
c .......#
d .....h.. -> 1
Ein Weg ist [bc]4-c5-b6-c7-b8(grab)
.
11)
12345678
a @....g.D
b ......#$
c .......#
d .....h.. -> 1
Die zusätzliche Wand ändert eigentlich nichts, [bc]4-c5-b6-c7-b8(grab)
ist immer noch eine Lösung.
@
eine gültige Eingabe?