Ein Raum der Spiegel

18

(Diese Herausforderung ist sehr ähnlich, aber diese aktuelle Herausforderung hat zusätzliche Komplikationen.)


Stellen Sie sich einen zweidimensionalen Raum vor, in dem die Wände mit flachen Spiegeln überzogen sind.

Plötzlich fällt ein Lichtstrahl in den Raum, in dem ein Stück Wand fehlt! Der Lichtstrahl tanzt durch den Raum, wird von den Wandspiegeln reflektiert und verlässt schließlich den Raum wieder.

Die Logik

Sie sind 5 Variablen gegeben: W, H, X, Y und Z .
Was meinen sie jetzt?

W, H ist die Größe des Raums (einschließlich der Wände), wobei W die Breite und H die Höhe ist.
X, Y ist die Koordinate, an der die Wand das Loch hat. Sie können davon ausgehen, dass sich dies immer auf einer Wandfliese befindet. Koordinaten basieren auf 0, wobei die X-Achse nach rechts und die Y-Achse nach unten zeigt.
Z ist ein einzelnes Zeichen, das die Richtung angibt, in die das Licht in den Raum fällt, entweder \oder /.

Der Raum muss aus folgenden Zeichen bestehen:

  • | für waagerechte Wände
  • - für senkrechte Wände
  • + für ecken

Beispiel: (W = 7, H = 4)

+-----+
|     |
|     |
+-----+

Nachdem wir einen Raum haben, können wir eine der Wandfliesen zerstören, sodass ein Lichtstrahl in den Raum fällt. Lichtstrahlen sind diagonale Linien, die durch \und /Zeichen dargestellt werden.

Ersetzen wir die Wandfliese bei X = 2, Y = 0 durch einen \Lichtstrahl.

+-\---+
|     |
|     |
+-----+

Das einfallende Licht wandert diagonal durch den Raum, bis es auf eine Spiegelwand trifft. Wenn eine Wand getroffen wird, kehrt sich die Richtung entlang der Achse der Wand um und der Strahl wandert weiter.

+-\---+
|\ \/\|
| \/\/|
+-----+

In diesem Beispiel erreicht der Lichtstrahl einen Punkt, an dem eine Ecke der Wand getroffen wird, was dazu führt, dass sich der Strahl vollständig umkehrt und den gesamten Rückweg zurücklegt und schließlich den Raum verlässt.

Deine Aufgabe

Schreiben Sie ein Programm, das den Raum und den gesamten Weg des Lichtstrahls druckt, bis er den Raum wieder verlässt oder sich zu einer Endlosschleife wiederholt.

Eingang

Eingaben können in jedem vernünftigen Format empfangen werden, sie müssen jedoch beispielsweise die vier Ganzzahlen W, H, X, Y und das Zeichen Z enthalten [10, 8, 0, 3, \].

Sie können davon ausgehen, dass:

  • W, H> = 3
  • X, Y befinden sich immer an einer Wand
  • Z kann nur die Werte \und enthalten /.

Ausgabe

Sie können entscheiden, ob Sie eine Zeichenfolge zurückgeben oder direkt an ausgeben stdout.
Es muss die Raumwand und den Lichtstrahl enthalten (definiert durch die obigen ASCII-Zeichen).

Regeln

  • Standard Lücken sind verboten.
  • Das ist , also gewinnt der kürzeste Code in Bytes in jeder Sprache.
  • Alle Codierungssprachen, die vor der Veröffentlichung dieser Herausforderung erstellt wurden, sind zulässig.

Beispiele

Eingang: [5, 4, 2, 0, /]

+-/-+
|/ /|
|\/ |
+---+

Eingang: [20, 3, 0, 1, \]

+------------------+
\/\/\/\/\/\/\/\/\/\|
+------------------+

Eingabe: [10, 8, 0, 3, \] (Beispiel einer Endlosschleife, die den Raum nicht wieder verlässt.)

+--------+
|/\/\/\/\|
|\/\/\/\/|
\/\/\/\/\|
|\/\/\/\/|
|/\/\/\/\|
|\/\/\/\/|
+--------+

Viel Glück!

Ian H.
quelle

Antworten:

5

Holzkohle , 55 Bytes

BNNJNNPψ↷⎇⁼δ/⎇∧⁻⁻θ¹ζIε⁷I3⎇∧IζIε⁵I1W¬℅KK«¹F³¿∧κ℅KK«↷κ¶↷κ

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Bearbeiten: Ich weiß nicht warum, aber dieser Code funktioniert gerade nicht. Hier ist stattdessen eine optimierte Version. Erklärung des Originalcodes:

BNN

Zeichnen Sie den äußeren Kasten.

JNNPψ

Bewegen Sie den Cursor zum Einstiegspunkt und bohren Sie an dieser Stelle ein Loch in das Feld, damit dies zum Hintergrund wird.

↷⎇⁼δ/⎇∧⁻⁻θ¹ζIε⁷I3⎇∧IζIε⁵I1P

Drehen Sie in die entsprechende Richtung, um das ursprüngliche Liniensegment zu drucken.

W¬℅KK«¹

Zeichnen Sie das nächste Liniensegment, während sich der Cursor über einem Loch befindet.

F³¿∧κ℅KK«↷κ¶↷κ

Suchen Sie nach einem Loch, in das das nächste Liniensegment gezeichnet werden soll. Dies funktioniert, indem derselbe Code dreimal wiederholt wird. Beim ersten Mal passiert nichts. Wenn sich der Cursor beim zweiten Mal nicht über einem Loch befindet, dreht er sich um 45 ° nach rechts, macht dann einen Schritt nach rechts und dreht sich dann um 45 ° nach rechts. Dies hat den Effekt, dass es in einer Achse reflektiert wird. Befindet sich der Cursor beim dritten Mal immer noch nicht über einem Loch, dreht er sich um 90 ° nach rechts, macht einen Schritt nach rechts und dreht sich dann um 90 ° nach rechts. Dies hat zur Folge, dass sich die Reflexion auf die andere Achse ändert. Wenn immer noch kein Loch vorhanden ist, wurde eine Ecke oder Endlosschleife erreicht, sodass die äußere Schleife anhält.

Neil
quelle
1
Damit die Leute Ihren Code testen können, ist es hilfreich, einen Link zum Golf-Code online zu haben, wobei die ausführliche Version separat ist.
Trichoplax
@ Trichoplax das war einfach
MD XF
@trichoplax Der TIO-Link zeigt tatsächlich den Golf-Code in der Ausgabe an, von der ich ihn kopiere und einfüge ...
Neil,
1
@trichoplax Wenn Sie verwenden -v -sl, wird tatsächlich der übersetzte prägnante Code wie gedruckt ausgeführt. Dies hängt natürlich davon ab, ob der Deverbosifier den richtigen prägnanten Code generiert. Andernfalls schlägt der generierte Code fehl, obwohl der ursprüngliche ausführliche Code technisch korrekt war.
Neil