Einige textbasierte Schurken-Likes lassen dich nicht in Wände laufen und geben dir den Weg zurück, wenn du es versuchst. Warum tun Sie das, wenn Sie den Spieler dazu bringen können, sich in die nächste gültige Richtung zu bewegen?
Die Herausforderung
Schreiben Sie ein Funktionsprogramm, das unter Angabe einer Richtung und eines 3 x 3-Zeichenrasters dasselbe Raster ausgibt, nachdem der Spieler einen Schritt ausgeführt hat.
Beispielsweise,
9
#..
.@#
#.#
wird
#.@
..#
#.#
Eingang
Die Richtung wird durch eine einzelne Ziffer von 1 bis 9 angegeben, die jeweils 8 Hauptrichtungen entsprechen und stillstehen. Dies ergibt sich aus den relativen Positionen der Zahlen auf einer Tastatur:
NW N NE .. \ | / ... 7 8 9 W-4 5 6 -E ... 1 2 3 ../ | \ SW S SE
Sie können jedoch auch die Nummern 123, 456, 789 anstelle von 789, 456, 123 verwenden. Mit anderen Worten, Sie können die oberen und unteren 2 Zeilen oder Nummern vertauschen, wenn Sie dies wünschen. Dies sind die einzigen 2 akzeptablen Indexkombinationen.Das 3 x 3-Raster besteht aus 3 verschiedenen druckbaren ASCII-Zeichen, die den begehbaren Boden, die Wände und den Player darstellen. (In den Testfällen
.
wird für Boden verwendet,#
s sind Wände und@
ist der Spieler)- Sie können wählen, welche Zeichen Ihr Programm verwendet, aber Sie müssen sie in Ihrer Antwort angeben und sie müssen über mehrere Versuche hinweg konsistent sein.
- Das Zeichen, das das Zeichen darstellt, befindet sich immer in der Mitte des 3 x 3-Gitters, und die Richtung liegt immer zwischen 1 und 9 (einschließlich).
- Sie können Eingaben in beliebiger Reihenfolge vornehmen
- Das 3 x 3-Raster kann als Zeichenfeld, Zeichenfolgenfeld, Zeichenfolge mit 9 Längen oder als andere sinnvolle Alternative eingegeben werden.
Ausgabe
- Von einer Funktion zurückkehren oder an StdOut oder die nächstgelegene Alternative ausgeben
- Leerzeichen und Zeilenumbrüche sind erlaubt
- Sie müssen die gleichen Zeichendarstellungen wie die Eingabe verwenden
- Dieselben für Eingaben zulässigen Formate sind für Ausgaben zulässig
Wie der Spieler sich bewegt
Wenn die angegebene Richtung durch eine Wand blockiert ist (z. B. wenn das obige Beispiel die Richtung 6 hatte), schauen Sie in die 2 nächstgelegenen Richtungen:
- Wenn eine (und nur eine) Richtung frei ist, bewegen Sie den Spieler in diese Richtung.
- Wenn keine Richtungen frei sind, schauen Sie sich die nächstgelegenen 2 Richtungen an (außer Richtung 5). Wenn Sie sich vollständig eingewickelt haben und keine offene Richtung gefunden haben (Spieler von Wänden umgeben), bewegen Sie den Spieler nicht
- Wenn beide Richtungen offen sind, wählen Sie eine aus, zu der Sie zufällig wechseln möchten (obwohl dies nicht unbedingt einheitlich ist).
Wenn die angegebene Richtung eine 5 ist, bewegen Sie den Player nicht
Testfälle
( #
= Wand, .
= Boden, @
= Spieler)
Eingang: 9 # .. . @ # #. # Ausgabe: #. @ .. # #. # Eingang: 3 # .. . @ # #. # Ausgabe: # .. .. # # @ # Eingang: 7 ##. # @ # .. # Ausgabe: ## @ ##. #.# oder #.# .. # @. # Eingang: 5 ... . @. ... Ausgabe: ... . @. ... Eingang: 2 ### # @ # ### Ausgabe: ### # @ # ###
Wertung
Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
yuhjklbn
? RUHE IN FRIEDEN.123;456;789
anstelle von verwenden789;456;123
?Antworten:
Pyth -
7370 BytesVersuch es
Die Eingabe besteht aus zwei Zeilen:
1. Zeile: Bewegungsrichtung
2. Zeile: Das Brett (Positionen 123456789, wobei 123 die oberste Zeile ist)
quelle
JavaScript (ES6),
192163 BytesAnmerkungen
Diese Funktion verwendet ein spezielles Eingabeformat. Die erste Eingabe ist ein Array von Ganzzahlen (
0
fürfloor
,1
fürwall
und2
fürplayer
), die die Karte darstellen. Die zweite Eingabe ist die (gespiegelte) Richtung:1
ist Nordwesten,2
ist Norden,3
ist Nordosten,4
ist Westen usw. Die Eingaben sollten durch currying syntax (Z(a)(b)
) erfolgen.Testfälle
Die Karten und Wegbeschreibungen wurden an mein Eingabeformat angepasst.
quelle
Python 3,
120104153176175 BytesProbieren Sie es online!
Diese Methode ruft Richtung und Liste von '.', '#' Und '@' ab. Indizes beginnen mit 1 bis 9 (mit 0 bis 8 in der Liste). So hat es die Form
Methode gibt neue Liste mit neuen Positionen zurück.
Diese Linie
gibt eine Liste dieses Typs zurück:
Wir berechnen Entfernungen zu freien Punkten und addieren Zufälligkeiten. Weil
ord('#') <= ord('.') - 8 and ord('.') + 8 <= ord('@')
wir sagen können, dass das nächste "." für n = 7 (Index in Liste) hat einen Index von 8.Beispiel:
quelle
','
(was für die Testfälle 2, 3 und 5 der Fall ist). 2) Ihr E / A-Format scheint nicht das gleiche zu sein wie in der Frage. Bitte geben Sie Ihr E / A-Format an.f(9, ...
funktioniert nicht - es platziert das Zeichen auf 2, aber die nächsten Positionen zu 9 sind 6 und 8, daher sollte eine davon zufällig ausgewählt werden (es gibt auch keine Zufälligkeit in Ihrem Code). Außerdem sollte es dann den Umkreis umrunden, um den nächstgelegenen zu finden,f(9,list("####@#.##"))
und den Charakter an der einzig möglichen Stelle platzieren (hier 7).f(9, ...
sollte zurückkehrenlist("#....##@#")
(weil 8 frei ist und neben 9 steht). 2. Etwas wief(9,list("####@.#.#"))
sollte eine Chance haben, zurückzukehrenlist("####..#@#")
(nicht immerlist("####.@#.#")
), wie angegeben. "Wenn beide Richtungen offen sind, wählen Sie eine aus, zu der Sie zufällig wechseln möchten."