Prämisse
Vor kurzem war ich ungefähr eine halbe Stunde zu früh zu einem Termin und beschloss, draußen zu warten. Ich entschied auch, dass es seltsam aussehen würde, wenn ich nur regungslos vor dem Haus stand. Aus diesem Grund habe ich mich für einen kurzen Spaziergang in einem begrenzten Gebiet entschieden. Ich kam auch zu dem Schluss, dass ich herumlungern würde, wenn ich anfinge, im Kreis zu laufen. So war ich inspiriert, meine erste Code Golf-Herausforderung zu erstellen.
Spezifikation
Sie erhalten eine Liste, eine Karte des Gebiets, die entweder " "
oder enthält "#"
, die Freiräume und Hindernisse darstellen. Freie Plätze können nur einmal gekreuzt werden, und es dauert 1 Minute, um sie zu kreuzen. Ihre Ausgangsposition wird durch eine "@"
pro roguelike Tradition gekennzeichnet, und das Ziel wird durch eine dargestellt, "$"
weil Sie dort genau diese verlieren werden. Sie erhalten auch eine Ganzzahl, die angibt, wie viele Minuten Sie verschwenden müssen, bevor Sie nicht so wirken, als ob Sie eingedrungen wären. Wenn du auf dem landest"$"
. Es muss sich um die genaue Anzahl der Minuten handeln (wenn Sie also rückwärts gezählt haben, muss dies 1 auf einem benachbarten Feld und 0 auf dem Feld sein). Es ist immer möglich, das Ziel zu erreichen. Ihr Programm oder Ihre Funktion muss eine Liste mit dem kürzesten Pfad mit <,>, ^ und v zurückgeben, um die vier möglichen Richtungen darzustellen.
Beispiele
Eingang:
[[" ", " ", " ", " "],
["@", " ", " ", "$"],
[" ", " ", " ", " "],
[" ", " ", " ", " "]]
und
5
Ausgang:
[[">", ">", ">", "v"],
["^", " ", " ", "$"],
[" ", " ", " ", " "],
[" ", " ", " ", " "]]
Eingang:
[[" ", "#", " ", " ", " "],
[" ", "#", " ", " ", " "],
["@", "#", " ", "$", " "],
[" ", " ", " ", " ", " "],
[" ", "#", " ", " ", " "],
[" ", "#", " ", " ", " "]]
und
7
Ausgabe:
[[" ", "#", " ", " ", " "],
[" ", "#", ">", "v", " "],
["v", "#", "^", "$", " "],
[">", ">", "^", " ", " "],
[" ", "#", " ", " ", " "],
[" ", "#", " ", " ", " "]]
Eingang:
[[" ", "#", " ", " ", " "],
[" ", "#", " ", " ", " "],
["@", "#", " ", "$", " "],
[" ", " ", " ", " ", " "],
[" ", "#", " ", " ", " "],
[" ", "#", " ", " ", " "]]
und
17
Ausgabe:
[[" ", "#", " ", "v", "<"],
[" ", "#", " ", "v", "^"],
["v", "#", " ", "$", "^"],
[">", ">", "v", ">", "^"],
[" ", "#", "v", "^", "<"],
[" ", "#", ">", ">", "^"]]
Regeln
- Es gelten Standardlücken
- Jedes Plättchen darf nur einmal verschoben werden
- Die genaue Zeit muss an der Tafel verbracht werden
- Bei mehreren Pfaden muss nur ein Pfad angezeigt werden
- Dies ist eine Code Golf Frage, also gewinnt die kürzeste Antwort
- Gemäß der Frage von user202729 in den Kommentaren können Sie eine gültige Eingabe annehmen.
Fügen Sie einen Kommentar hinzu, wenn weitere Erläuterungen erforderlich sind
quelle
Antworten:
JavaScript (ES6), 171 Byte
Übernimmt Eingaben in der Currying-Syntax
(a)(n)
. Ausgaben durch Ändern der Eingabematrix.Probieren Sie es online!
Kommentiert
quelle
Python 2 ,
310256 BytesDanke @cairdcoinheringaahing für
except:0
-3 BytesDanke @Mnemonic für -8 Bytes
Danke @JonathanAllan für -3 Bytes
Danke @ovs für -5 Bytes
Probieren Sie es online!
Einige Erklärungen:
try-except
wird verwendet , um sicherzustellen, dass beidex
undy
in Grenzen sind Koordinaten. Eine Ausnahme wird beim Zugriff auf ausgelöstG[y][x]
. Python ist zu gut und negative Indizes sind akzeptabel, daher wird ein Häkchenx>-1<y
hinzugefügt.T=[r[:]for r in G]
wird verwendet, um eine Kopie vonG
by-Werten zu erstellen~-i/2
und~-(i^2)/2
werden verwendet, um Paare zu generieren(-1, 0), (0, 1), (0, -1), (1, 0)
, die sich früher im Gitter bewegten (es sollte noch einen kürzeren Weg geben!)R+=[G]*(0==c<'$'==G[y][x])
überprüfen Sie, ob dies'$'
in der erforderlichen Anzahl von Schritten erreicht wurde.R
wird verwendet, um dieses Ergebnis von rekursiven Funktionsaufrufen zu erhalten.for i,y in enumerate(G):"@"in y>S(y.index("@"),i,G,L,R)
Gefundenx
undy
von'@'
in Ein- und AnruffunktionS
.print R[0]
R
könnte mehr als eine Lösung enthalten, also erst ausgebenquelle
if G[y][x]=='$':
mitif'$'==G[y][x]:
.R+=(G[y][x]=='$')*(c==0)*[G]
anderes Byte ersetzt werden.if(x>-1<y)*(G[y][x]in' @'):
y+cmp(i%2,i/2)
wärey+~-(i^2)/2
; es kann durchaus noch kürzer sein.Python 2 ,
264261251249 BytesProbieren Sie es online!
quelle