Ein 2D - Board werden die folgenden Objekte enthalten:
^
,>
,v
, Oder<
: Ein Laserstrahler nach oben, rechts, unten bzw. links. Es kann mehr als einen geben. Laser bewegen sich im leeren Raum in einer geraden Linie (leerer Raum wird mit einem Punkt dargestellt.
). Laser passieren keine Emitter.*
: Ein Ziel. Laser passieren Ziele. Es kann mehr als einen geben.
Die Tafel kann auch die folgenden Objekte enthalten:
@
: Eine feste Wand. Der Laser wird hier nicht passieren.\
: Ein nach links geneigter Reflektor. Ändert die Richtung von Lasern gemäß der folgenden Tabelle:Direction laser is travelling Direction of laser after hitting reflector Up Left Right Down Down Right Left Up
Es sollte ziemlich intuitiv sein, wie die Reflektoren funktionieren. Stellen Sie sie sich als einen echten zweiseitigen Spiegel vor und die Richtungen sollten klar sein.
/
: Ein nach rechts geneigter Reflektor. Ändert die Richtung von Lasern gemäß der folgenden Tabelle:Direction laser is travelling Direction of laser after hitting reflector Up Right Right Up Down Left Left Down
1
,2
,3
...9
: Ein Portal . Die Nummer gibt den Kanal des Portals an - es gibt genau zwei Portale desselben Kanals (zum Beispiel gibt es keine drei1
). Das Portal ändert die Position des Lasers in die Position des anderen Portals desselben Kanals. Zum Beispiel:> 1 @ 1 *
Der Laser trifft das Ziel, denn wenn er das erste trifft
1
, wird er zum zweiten1
auf der anderen Seite teleportiert . Laser behalten die gleiche Richtung bei, in der sie vorher waren.Ein Portal teleportiert den Laser nicht zu einem Portal eines anderen Kanals (dh a
1
teleportiert den Laser nicht zu a9
.
Ihr Programm erhält eine 2D-Darstellung der Karte als Eingabe. Die Tafel wird immer rechteckig sein. Die Ausgabe sollte erfolgen, True
wenn alle Ziele von Lasern durchlaufen werden, oder auf False
andere Weise.
Hier sind einige Testfälle:
Eingang
>....\ ..*... >./../ ..*...
Ausgabe
True
Eingang
>..........\ 1........../ 2..........1 3..........2 4..........3 5..........4 6..........5 7..........6 8..........7 9..........8 *..........9
Ausgabe
True
Eingang
>.@............* >..@...........* >...@..........* >....@.........* >.....@........* >...*..@........ >.......@......*
Ausgabe
False
Eingang
../\. >./**
Ausgabe
False
Eingang
/.......*.......\/3..... @..............//\.\.... *.............2\.1\/\... \..............///.....< .........*...//\\/.....\ >.............\.1.///.4. 4.......*/...\2\/3/\/..^
Ausgabe
True
Eingang
vvvvvvvvvvvvvvvvv \\\\\\\\\\\\\\\\\ ///////////////// \\\\\\\\\\\\\\\\\ ///////////////// \\\\\\\\\\\\\\\\\ ///////////////// *****************
Ausgabe (beachten Sie das Ziel ganz rechts)
False
Antworten:
Python,
310302287278277260Nicht radikal anders als der existierende Python-Post, hat aber ein oder zwei bemerkenswerte Tricks, denke ich.
Es verarbeitet auch "nicht terminierende" Eingaben, wie zEDIT : Ups! Emitter blockieren Laser.1>1
.t
Nimmt eine Liste von Strings (die Eingabezeilen) und gibt ein boolesches Ergebnis zurück.Hier ist ein nettes GIF des Codes, der abgespielt wird:
EDIT : Awsome GIF mit freundlicher Genehmigung von Will. Vielen Dank, Will!
quelle
1>1
wird beendet. Ich war nicht in der Lage, etwas zu finden, das nicht terminiert, obwohl ich nicht viel Mühe darauf verwendet habe und so gut wie angenommen habe, dass es bei meiner Implementierung nicht passiert. Ich werde natürlich überlegen, ob jemand einen vorlegen kann..find(d)
-1 zurückgegeben wird, wenn es nicht gefunden wird. Wenn Sie dieif-1<d:
Anweisung entfernen und stattdessenj+=[-1,1,w,-w,-i][d]
am oberen Rand der while-Schleife ausführen, wird aus einem nicht gefundenen -1 das letzte Element in diesem Array hinzugefügtj
, zu demj
0 wird, von dem wir wissen, dass es@
... ist.Perl, 647
Dies ist mein erster Versuch, Code-Golf zu spielen, und es ist mir ein bisschen peinlich, dass ich nicht einmal den C # Score geschlagen habe, aber ich dachte, es wäre interessant (oder lustig oder einfach nur masochistisch), das Ganze als zu tun Serie von Regex-Substitutionen. (Ich dachte auch, es würde Spaß machen, mein Perl aufzufrischen, aber am Ende bereute ich zutiefst, es nicht in Ruby oder Python implementiert zu haben.)
Ich habe nicht viel getestet, aber ich denke, es sollte jeden Fall behandeln.
Das Gitter wird über STDIN eingegeben. Die Eingabe muss mindestens eine neue Zeile enthalten (dh eine einzelne Zeile ohne neue Zeile funktioniert nicht).
Erläuterung: Der Code aktualisiert die Rasterzeichenfolge iterativ, wenn die Laser sie durchlaufen.
-
stellt einen horizontalen Laser,|
einen vertikalen Laser,+
gekreuzte Laser,K
einen\
Spiegel mit einem Laser, der von der Oberseite abprallt,k
einen/
Spiegel mit einem Laser, der von der Unterseite abprallt,Z
einen\
Spiegel mit einem Laser, der von der Unterseite abprallt, undW
einen/
Spiegel mit einem Laser, der von der Unterseite abprallt, dar die Spitze.%
ist ein/
Spiegel mit Lasern auf beiden Seiten, währendX
ein\
Spiegel mit Lasern auf beiden Seiten ist. (Hierbei wird zwischen Groß - und Kleinschreibung unterschieden. Ich habe versucht, Buchstaben auszuwählen, die angemessen aussehen, z. B.k
undK
sind etwas offensichtliche Entscheidungen - aber leider ist der Effekt wirklich nicht so hilfreich. Ich sollte diese Informationen wirklich in eine Tabelle aufnehmen, aber ich bin im Moment erschöpft.)Die gleiche Behandlung von Portalen (dh die Zuweisung eines zusätzlichen Zeichensatzes für jede Ziffer basierend auf den möglichen Eingabe- / Ausgabe-Laserpositionen) würde 144 Zeichen erfordern (einschließlich der ursprünglichen 9). Wenn also ein Laser auf ein "Eingabe" -Portal trifft, Ich füge das "Ausgabe" -Portalzeichen zu der Gruppe von Zeichen hinzu, die einen Laser in die richtige Richtung aussenden. (Dies erfordert eine Unterscheidung zwischen Eingabe- und Ausgabeportalen. Ich habe die Buchstaben
qwertyuio
dafür verwendet.)Etwas unerfreulich, mit Print-Anweisungen, damit Sie sehen können, wie die Substitutionen ablaufen (jede Substitution stellt eine "Runde" der Laser-Progression dar), und mit dem
g
Flag, das zum Main hinzugefügt wurde,s///
damit es nicht so viele Iterationen dauert:quelle
Python 338
351Meine ungekürzte Version zeichnet tatsächlich die Laserpfade auf der Platine, was hübsch ist:
quelle
C # -
515414400 BytesKomplettes C # -Programm, keine nette Ausgabe wie bei Will. Verfolgen Sie den Laserpfad für jede Emission einzeln und behalten Sie eine Reihe der Zellen bei, die wir besucht haben, damit wir überprüfen können, ob wir alle Sterne am Ende besucht haben. Bearbeiten: Striping einer großen Anzahl von Bytes, indem alles zu 1D gemacht wird und ein Zeichen anstelle eines Int zum Speichern des aktuellen Zeichens verwendet wird
w0lf erinnerte mich daran, dass ich mitten in meinem Code eine unterausgenutzte for-Schleife hatte, also dachte ich mir, ich sollte mich ein letztes Mal anstrengen und sie zum Laufen bringen, und jetzt bin ich auf das absolute Minimum an lockigen Hosenträger. Ich werde nicht so tun, als würde es mir gefallen, wenn die zweite for-Schleife zusammenbricht. Der Code ist jetzt schrecklich ungeordnet, hat aber ein paar Bytes gespart. Dabei habe ich das Portalhandling umgeschrieben. Ich habe auch eine kürzere Methode gefunden, um den "Move" mit verschachtelten statt aggregierten bedingten Operationen durchzuführen.
Golf Code:
Weniger Golf Code:
Der neue Code für die Portalbehandlung nutzt die Tatsache, dass die Funktion String.IndexOf glücklich -1 (dh Zeichen nicht gefunden) zurückgibt, wenn Sie gefragt werden, ob 1 Zeichen hinter der Zeichenfolge gesucht werden soll. Das war eine Neuigkeit für mich, war aber in diesem Fall furchtbar praktisch.
quelle
m+=(d>0?d-2:0)+(d<3?d-1:0)*W;
und schieben es in diefor
, wie folgt aus :for(char c;i-->0;m+=(d>0?d-2:0)+(d<3?d-1:0)*W)
. Auf diese Weise sparen Sie ein Zeichen, da Sie ein Semikolon verlieren.