Sie sind in diesem 5x5 Labyrinth gefangen - jeder Raum ist mit 1 bis 25 gekennzeichnet und der Ausgang befindet sich in Raum 1.
Als Eingabe erhalten Sie den Raum, in dem Sie sich gerade befinden. Sie müssen die kürzeste Abfolge von Zügen (Nord, Ost, Süd, West) ausgeben, die erforderlich ist, um Raum 1 zu erreichen.
Bewegungen können in jedem gewünschten Format (Liste, Zeichenfolge, Array ...) ausgegeben werden, solange Sie die Zeichen verwenden n,w,e,s
.
Hier sind alle Testfälle:
1 => empty string/list
2 => w
3 => ww
4 => swwnw
5 => wswwnw
6 => seenwnw
7 => nw
8 => wnw
9 => wwnw
10 => swwnwnw
11 => eenwnw
12 => enwnw
13 => nwnw
14 => wnwnw
15 => wwnwnw
16 => enenwnw
17 => nenwnw
18 => wnenwnw
19 => nwnwnw
20 => wnwnwnw
21 => nenenwnw
22 => enwnenwnw
23 => nwnenwnw
24 => wnwnenwnw
25 => nwnwnwnw
Kürzeste Antwort in Bytes gewinnt!
code-golf
kolmogorov-complexity
Arnaud
quelle
quelle
Antworten:
Python 2 , 64 Bytes
Probieren Sie es online!
Eine Funktion, die eine Richtung pro Zeile ausgibt und mit einem Fehler endet.
Die Konstante
0x1211252b5375
codiert in der Basis 4 die Richtung, died
wir von jeder Raumnummer als Zahl 0 bis 3 zurücklegen. Die Extraktionsziffer>>2*n-4&3
ist auch so ausgelegt, dass sie beimn=1
Beenden des Codes einen negativen Verschiebungsfehler ergibt . Wir aktualisieren die Raumnummern
über einen Versatz, der aus der Richtungd
wie folgt berechnetd*3+d%2-5
wird:quelle
try
/except
), um die Ausführung nach dem Aufrufen dieser Funktion fortzusetzen.Python 2 ,
9593 BytesProbieren Sie es online!
Kann
3 bis2 Bytes einsparen, wenn eine 0-indizierte Raumbeschriftung zulässig ist.quelle
05AB1E ,
3029 Bytes-1 Byte dank eines wunderbaren Zufalls mit Primzahlen
Probieren Sie es online!
quelle
1
für die Eingabe1
anstelle einer leeren Zeichenfolge (einfache Lösung wäre das Hinzufügen eines führenden Zeichensõ?
). Ansonsten schöne Antwort!Ruby ,
7262 BytesProbieren Sie es online!
Wie?
Der Trick dabei ist, mit 2 Konstanten den nächsten Schritt für jede Zelle zu erstellen und das Problem dann rekursiv zu lösen.
Die beiden Konstanten 18139004 und 4267088 sind binäre Zeichenfolgen, die die Richtung des nächsten Zuges angeben. Durch Extrahieren eines einzelnen Bits aus beiden für jede Zelle können wir Folgendes erhalten:
Einfacher als umzuschalten und eine einzige große Binärzahl zu maskieren, IMHO.
Wenn wir die Richtung erhalten, extrahieren wir den entsprechenden Buchstaben aus der Zeichenfolge "en sw":
Und gehe rekursiv auf der Zelle vor [n + x]
quelle
JavaScript (ES7),
6258 BytesAntwort von Port of Xnor .
Probieren Sie es online!
quelle
Perl 5 (
-n
), 94 Bytes-5 Bytes dank Grimy
TIO
quelle
Perl 5 , 79 Bytes
Probieren Sie es online!
quelle
JavaScript,
807371 BytesAngepasst von Chas 'Python-Lösung , gefällt
+1
ihm das auch.Probieren Sie es online!
1 Byte gespart dank Arnauld .
quelle
Kohle ,
4340 BytesProbieren Sie es online! Link ist eine ausführliche Version des Codes. Basierend auf den Antworten von @ ChasBrown und @ xnor. Erläuterung:
Betritt den Raum.
Setzen Sie die Schleifenvariable
i
auf eins weniger als die Raumnummer und wiederholen Sie den Vorgang, solange sie nicht Null ist.Extrahieren Sie die Richtung aus der komprimierten Zeichenfolge
0113130113220112010102010
. (Der führende0
ist nur eine Füllziffer.)Drucken Sie die Richtung.
Verwenden Sie die Formel von @ xnor, um die neue Zimmernummer zu berechnen.
quelle
Gelee ,
3029 BytesProbieren Sie es online!
Eine monadische Verknüpfung, die die Startzelle übernimmt und eine Zeichenfolge mit den Anweisungen zurückgibt.
Ich liebe die Tatsache, dass Jellys Wörterbuch ein Wort wie "Kennesaw" (eine Stadt nordwestlich von Atlanta, Georgia) hat, das hier verwendet wird, weil das Indizieren darin mit "
[5, 1, -5, -1] + 1
gives"nesw
!Erläuterung
quelle
PHP , 110 Bytes
Eine Lösung, die nicht die beste Antwort von Chas Brown oder die beste Antwort von xnor ist . Ich weiß, das ist länger, aber ich wollte eine andere Lösung haben!
Probieren Sie es online!
Ich habe eine Zuordnungszeichenfolge erstellt, die 2 Zeichen für jede Zelle in der Platine enthält. Das erste Zeichen für jede Zelle ist eine Bewegung (n / e / s / w) oder
0
und der ASCII-Code des zweiten Zeichens, Mod 30, gibt eine andere Zellennummer zurück, die wir im rekursiven Modus verfolgen sollten, bis wir cell (cell < 2
) verlassen.Zum Beispiel für die Eingabe von 8:
8
sind:w%
w
und mit den Bewegungen für die Zelle von fortfahren%
%
ist 37, der Mod 30 ist 7, die nächste Zelle also7
.7
sind:n
(letztes Zeichen ist Leerzeichen, ASCII-Code = 32)n
und mit den Zügen für die Zelle von 32 mod 30 fortfahren2
.2
sind:w<
(letztes Zeichen ASCII-Code = 60)w
und mit den Zügen für die Zelle von 60 mod 30 fortfahren0
.2
, stoppt die Schleife!wnw
PHP , 75 Bytes
Diese Version wurde von Grimy geschrieben und ist 35 Bytes kürzer als meine ursprüngliche Antwort, weil er / sie schlauer ist! Grimys Kommentar: "4 * 25 <256, Sie brauchen also nur 1 Byte pro Zelle, nicht 2"
Probieren Sie es online!
PHP , 71 Bytes
Dieser Port von Arnauld's Antwort, der der Port von xnors Antwort ist , aber als Schleife statt als rekursive Funktion, da er sich in PHP als kürzer herausstellt.
Probieren Sie es online!
quelle
C (clang) , 81 Bytes
Probieren Sie es online!
Danke an @ Tommylee2k Vorschlag -8! + rekursiver Aufruf
C (clang) , 90 Bytes
Probieren Sie es online!
Ähnlich wie bei allen nicht komprimierten Lösungen.
quelle
v;f(p){for(;p-1;p+=v%5?6-v%8:v%2?5:-5)putchar(v="00wwswsnwwseenwwenwnwnenwn"[p]);}
05AB1E ,
4543 BytesPort von @ChasBrowns Python 2 Antwort .
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
Sehen Sie sich meinen Tipp 05AB1E (alle vier Abschnitte) an, um zu verstehen, warum dies so
.•DUo¢ê`Ω÷‰₂¡)R€ûK•
ist"a wwswsnwwseenwwenwnwnenwn"
.Ž₁9
ist22449
;Ž₁9₂в
ist[1,7,5,11]
; und'€Ã
ist"news"
.quelle
western
besser ist. ; pBash , 120 Bytes
Probieren Sie es online!
Ich spielte eine Weile mit dem Versuch, die Zeichenfolge als Knabbereien zu packen, aber die Dekodierung würde mehr Zeichen als die gespeicherte Zahl erfordern.
Wie es funktioniert:
Die Zeichenfolge $ S enthält ein einzelnes Zeichen (n, w, s, e) für jeden Raum, das angibt, in welche Richtung ein Raum zum Ausgang bewegt werden soll, wobei die Räume 0 und 1 übersprungen werden.
String $ N hat das Delta, das bei jedem Richtungswechsel zur aktuellen Raumnummer addiert / von dieser subtrahiert wird (n: -5, w: -1, s: +5, e: +1)
Beginnen Sie mit $ i, das der in der Befehlszeile angegebenen Raumnummer entspricht ($ 1). Weisen Sie das Zeichen am Index $ i in der Zeichenfolge $ S bis $ d zu. Rufen Sie den Delta-Wert von $ N ab, damit die Richtung zum nächsten Raum geht, und weisen Sie ihn $ j zu.
Drucken Sie die nächste Richtung, um $ d aufzunehmen.
Addiere / subtrahiere das Delta in $ j zu / von $ i.
Schleife bis wir Raum # 2 verlassen (solange $ i> 1 ist).
quelle
Stax , 31 Bytes
Führen Sie es aus und debuggen Sie es
quelle
Kotlin , 112 Bytes
Probieren Sie es online!
quelle