Erstellen Sie ein Programm, das anhand einer Eingabe des Pfads festlegt, ob Mario das Ende erreichen kann, das E
von Anfang an mit gekennzeichnet ist S
.
Ein Pfad sieht ungefähr so aus:
S = E
=====
In einem Pfad sind die verschiedenen Symbole und was sie darstellen:
=
: Wand / Boden / Decke. Mario kann nicht durch eine Wand gehen und kann nicht über einen Boden fallen oder über eine Decke springen (er würde sich auf den Kopf schlagen)S
: Luft, außer zu zeigen, wo Mario beginnt. Dies wird immer in der äußersten linken Spalte des Eingangs in Bodennähe angezeigt.E
: Luft, außer zu zeigen, wo Mario bekommen will. Dies wird immer in der äußersten rechten Spalte des Eingangs in Bodennähe angezeigt.
Die Eingabe wird an jeder Stelle Leerzeichen enthalten, an der Mario laufen könnte.
Mario kann sich nur vorwärts bewegen; In diesem Beispiel kann Mario das Ziel nicht erreichen
S
===
===
E
====
noch kann er in diesem
E
==
==
#==
==
==
==
S ==
======
Er kann jedoch den mit gekennzeichneten Bereich erreichen #
(der in der Eingabe nicht angezeigt wird), da er bis zu vier Zellen hoch springen kann. Mario ist übermenschlich. Ein weiteres Beispiel für seine Übermenschlichkeit:
S
=
=
=
=
=
= #
= =
=
=
=
= E
=======
Mario kann das erreichen, E
indem er die große Distanz verliert, überlebt und ruhig dahin läuft E
. Beachten Sie, dass er das nicht erreichen kann #
, da Mario gerade nach unten fällt.
Mario kann sehr hoch springen , aber im Vergleich nicht sehr weit nach vorne.
S E
== ==
= =
Mario mag versuchen, die Lücke zu überspringen, aber er wird scheitern und direkt hineinfallen. Er kann das Ende nicht erreichen.
Mario kann das Ziel in all diesen Beispielen erreichen:
E
=
=
=
S=
==
=
= E
S= =
== =
= =
=====
S
=
= E
====
Dies ist Codegolf, so dass nur wenige Bytes gewinnen!
quelle
#
, weil Mario gerade nach unten fällt." Wenn ich das richtig ansehe, fällt er dann nicht direkt auf das#
? Sind Sprünge auch als maximal 4 Leerzeichen und maximal 1 Leerzeichen definiert?#
. Zur zweiten Frage: Ich bin nicht OP, aber ich vermute, Sie haben recht. (das habe ich in meiner Lösung angenommen)E
nicht in der Spalte ganz rechts angezeigt, da sich das Bodenniveau vom Rest der Karte aus um eins nach rechts erstreckt.Mario cannot walk through wall , and cannot fall past a floor, or jump past a ceiling
Antworten:
Unterhose ,
382725 BytesErfordert, dass die Eingabe in ein Rechteck aufgefüllt wird, sodass in jeder Zelle Leerzeichen vorhanden sind, die Mario durchlaufen muss (möglicherweise mit einer führenden Zeile voller Leerzeichen). Druck entweder eine Zeichenfolge , die den gültigen Pfad (das schließt
S
,E
und alles=
ging auf mit Ausnahme der letzten) oder nichts , wenn kein Pfad vorhanden ist .Teste es hier.
Erläuterung
Slip war Sp3000's Einstieg in unsere 2D-Pattern-Matching-Sprachdesign-Herausforderung. Es ist ein bisschen wie eine 2D-Erweiterung von Regex, bei der Sie dem Motorcursor Anweisungen geben können, wann er nach links oder rechts abbiegen darf oder muss. Es hat auch eine praktische Funktion, mit der Sie das Vorrücken des Cursors verhindern können, sodass Sie eine einzelne Position zweimal hintereinander (mit unterschiedlichen Mustern) abgleichen können.
Slip hat nichts Vergleichbares wie Lookarounds in Regex, aber da Sie mehrmals über eine beliebige Position fahren können, können Sie den Zustand einfach testen und dann zurückkehren. Wir verwenden dies, um sicherzustellen, dass wir nur auf dem Boden springen, indem wir uns nach jedem Schritt in das Bodenplättchen bewegen.
quelle
Java
234 230 221 216 208 207 205179 BytesSchau, ich habe C und Python besiegt? Ich habe wahre Transzendenz unter Sterblichen erreicht! Abgesehen von allen Witzen war dies eine lustige Herausforderung. Die folgende Funktion nimmt Eingaben als Array von Spaltenzeichenfolgen mit jeweils derselben Länge entgegen. Wenn dies gegen die Regeln verstößt, lass es mich bitte wissen. Es gibt 1 aus, was einen erfolgreichen Mario-Lauf bedeutet, und jeden anderen Wert, der einen fehlgeschlagenen Mario-Lauf impliziert.
Hier ist die ältere Logik (die der aktuellen Version ähnelt) mit Beispielgebrauch und Ausgabe. Plus einige Kommentare zur Erklärung der Logik
quelle
Python,
260,239,222,215209206 Bytes,versuche es auf ideone (mit testfällen)
anrufen wie:
f([' S=', ' E='])
Klebenotizzettel:
Angenommen, die Eingabe besteht, wie bei einigen anderen Lösungen, aus einer Reihe von Spaltenzeichenfolgen, die jeweils mit einem "" beginnen.
Wrapper für altes Eingabeformular:
g=lambda x:f(map("".join,zip(*([" "*x.index("\n")]+x.split("\n")))))
Außerdem habe ich einen Fehler behoben, durch den Mario durch Blöcke über ihm springen konnte.
ungolfed version mit erklärungen:
f
ruft sich rekursiv in alle Richtungen auf, in die sich Mario bewegen kanny,x
. Es kehrt zurück,True
wenn es das erreicht"E"nd
, das dann alle Funktionsaufrufe durchläuft, bis esg
schließlich zurückkehrtTrue
.quelle
else
vor dem letztenreturn
?Schnecken ,
413729 BytesDanke an feersum für die Hilfe, um überlappende Pfade zu vermeiden und 4 Bytes zu sparen.
Erfordert, dass die Eingabe in ein Rechteck aufgefüllt wird, sodass in jeder Zelle Leerzeichen vorhanden sind, die Mario durchlaufen muss (möglicherweise mit einer führenden Zeile voller Leerzeichen).
Probieren Sie es online!
Erläuterung
Snails war feersums Einstieg in unsere 2D-Pattern-Matching-Sprachdesign-Herausforderung. Wie Slip ähnelt es auch Regex, aber der Hauptunterschied besteht darin, dass a) dieses Assertions (Lookarounds) unterstützt und b) abgesehen von diesen Assertions keine Zelle im Raster zweimal durchlaufen werden kann. Das macht dieses Problem etwas knifflig, da es Fälle gibt, in denen Mario in ein Loch fallen und wieder herausspringen muss, zB:
Abgesehen von diesen Unterschieden unterscheidet sich auch die Syntax der beiden Sprachen erheblich.
Um das Problem zu umgehen, dass wir eine Zelle nicht zweimal durchlaufen können, wechseln wir immer einen horizontalen Schritt mit einem vertikalen Schritt. Dies bedeutet jedoch, dass wir einen Sturz bewältigen müssen, bevor wir über den Sims treten. Stürze werden also technisch gesehen durch Bodenplatten verlaufen, aber wir werden sicherstellen, dass sie nur in der Nähe von Freiflächen auftreten.
quelle
C
256236213197 Bytes20 Bytes gespeichert durch "Dies wird immer in der Spalte ganz links der Eingabe angezeigt "
23 Bytes gespeichert dank @ RohanJhunjhunwalas spaltenbasiertem System
Probiere es auf ideone mit Testfällen ...
Verwendung:
Ungolfed mit Erklärung:
quelle
PHP,
399338284265251 BytesErwartet Eingaben als Befehlszeilenargument mit Zeilenumbrüchen und nachgestellten Leerzeichen in jeder Zeile im Unix-Stil und gibt den Exit-Code
1
für Erfolg und0
Misserfolg zurückAufschlüsselung nach Funktion
Tests (auf Funktion m)
quelle
Ruby,
153147 BytesSorry, Java ... dein Platz als beste Nicht-Golf-Sprache für den Job wird übernommen!
Die Eingabe ist eine Liste von Spaltenzeichenfolgen, denen ein einzelnes Leerzeichen vorangestellt ist. Dies entspricht der Art, wie die Slip- und Snails-Lösungen erfordern, dass ihre Eingaben mit einem leeren Rechteck aufgefüllt werden.
Probieren Sie es online!
quelle
Schmutz, 46 Bytes (nicht konkurrierend)
Ich habe Grime mehrmals aktualisiert, nachdem diese Herausforderung veröffentlicht wurde, sodass diese Antwort nicht zum Gewinnen berechtigt ist. Einige der Änderungen sind so neu, dass ich sie nicht in TIO integrieren konnte, aber sobald ich sie vorgenommen habe, können Sie das Programm ausprobieren . In jedem Fall enthält mein Repository eine Version, die diesen Code korrekt verarbeitet.
Das Programm gibt aus,
1
ob Mario das Ziel erreichen kann und0
wenn nicht. Die Eingabe muss Leerzeichen an allen Stellen enthalten, die Mario besuchen muss. Für allgemeine Eingaben habe ich die folgende 57-Byte- Lösung:Erläuterung
Die allgemeine Erklärung ist, dass das
A
in der ersten Zeile definierte Nicht-Terminal mit einem 1 × 1- Teilrechteck der Eingabe übereinstimmt, in dem Mario das Ziel erreichen kann.A
wird entweder als das LiteralE
(Mario ist bereits am Ziel) oder als ein 1 × 1- Muster definiert, das sich in der linken Spalte eines 2 × n- Rechtecks befindet und einen gültigen Mario-Sprung zu einer anderen ÜbereinstimmungA
in der rechten Spalte enthält. Die zweite Zeile zählt die Anzahl der ÜbereinstimmungenA
, die auch das Startzeichen enthaltenS
, und gibt dieses aus.Hier ist eine Aufschlüsselung des Codes:
Die Idee ist, dass der
\ {,-4}
Teil links dem Raum entspricht, durch den Mario nach oben springt, und der\ /*
Teil rechts dem Raum, durch den er dann fällt. Wir verlangen, dass er in einem Match landet, dasA
(da wir das Ziel erreichen wollen) über einem liegt=
. Die vertikalen Stapel unter beiden Spalten garantieren einfach, dass die Spalten die gleiche Höhe haben, sodass wir sie verketten können (das ist, was der einzelne Raum in der Mitte tut). Hier ist ein ASCII-Grafikdiagramm eines Beispielsprungs, unterteilt in die oben genannten Rechtecke und mit Leerzeichen, die durch*
s ersetzt werden :In der zweiten Zeile
n
löst die Option die Zählung aller Übereinstimmungen aus, anstatt die erste Übereinstimmung zu finden. In der allgemeinen Lösung können die Leerzeichen auch Sonderzeichen ohne Eingabe seinb
bewirkt dass die Eingabe mit Eingabe aufgefüllt wird.Ich hoffe das alles macht Sinn!
quelle