Nehmen Sie ein zweidimensionales Gitter und zeichnen Sie eine Reihe von Liniensegmenten darauf, um Spiegel darzustellen. Wählen Sie nun einen Punkt, um einen theoretischen Laser zu platzieren, und einen Winkel, um die Richtung zu definieren, in die er zeigt. Die Frage ist: Wenn Sie dem Laserstrahlverlauf für eine bestimmte Entfernung folgen, an welchem Koordinatenpunkt befinden Sie sich?
Beispiel:
In diesem Bild L
ist der Ort des Lasers, t
ist es der Winkel (von der positiven X - Achse gemessen) M1
, M2
und M3
sind alle Liniensegment Spiegel und E
ist der Punkt , auf dem Laser-Strahlengang nach D = d1 + d2 + d3 + d4
Einheiten, ausgehend von L
.
Tor
Schreibt das kürzeste Programm (in Bytes) , die Ausgänge E
gegeben L
, t
, D
, und eine Liste von Spiegeln.
(Verwenden Sie http://mothereff.in/byte-counter, um Bytes zu zählen.)
Eingabeformat
Die Eingabe erfolgt von stdin im Format:
Lx Ly t D M1x1 M1y1 M1x2 M1y2 M2x1 M2y1 M2x2 M2y2 ...
- Alle Werte werden Punkte schweben diese Regex übereinstimmt , gefunden
[-+]?[0-9]*\.?[0-9]+
. - Zwischen jeder Zahl steht immer genau ein Leerzeichen.
- Anführungszeichen für die Eingabe sind zulässig.
t
ist in Grad, aber nicht unbedingt im[0, 360)
Bereich. (Wenn Sie es vorziehen, können Sie stattdessen Radianten verwenden, sagen Sie dies einfach in Ihrer Antwort.)D
kann negativ sein und den Laser effektiv um 180 Grad drehen.D
kann auch 0 sein.- Es kann beliebig viele Spiegel geben (einschließlich überhaupt keiner).
- Die Reihenfolge der Spiegel sollte keine Rolle spielen.
- Sie können davon ausgehen, dass die Eingabe in Vielfachen von 4 Zahlen erfolgt. zB
Lx Ly t
oderLx Ly t D M1x1
sind ungültig und werden nicht getestet. Keine Eingabe ist auch ungültig.
Das obige Layout könnte wie folgt eingegeben werden:
1 1 430 17 4.8 6.3 6.2 5.3 1.5 4.8 3.5 6 6.3 1.8 7.1 3
(Beachten Sie, dass das Bild freihändig gezeichnet wurde und diese Werte nur Näherungswerte sind. Martin Büttners Eingabewerte von
1 1 430 17 4.8 5.3 6.2 4.3 1.5 4.8 3.5 6 6.3 1.8 7.1 3
wird mehr Kollisionen geben, obwohl sie nicht mit der Skizze übereinstimmen.)
Ausgabeformat
Die Ausgabe sollte im Format stdout erfolgen:
Ex Ey
Dies sind auch Schwimmer und können exponentiell sein.
Anmerkungen
- Spiegel können sich überschneiden.
- Beide Seiten der Spiegel reflektieren.
- Der Strahl kann mehrmals auf denselben Spiegel treffen.
- Der Strahl geht für immer weiter.
Undefinierte Fälle
Sie können davon ausgehen, dass die Fälle, in denen
- Der Laser startet auf einem Spiegelliniensegment
- Der Laserstrahl trifft auf den Endpunkt eines Spiegels
- Der Laserstrahl trifft auf den Schnittpunkt zweier Spiegel
sind undefiniert und werden nicht getestet. Ihr Programm kann in solchen Fällen alles Mögliche tun, auch einen Fehler auslösen.
Bonus
Nur zum Spaß werde ich 200 Kopfgeldpunkte für die am höchsten bewertete Einsendung vergeben, die eine grafische Darstellung des Problems ausgibt (Sie können sogar ein interaktives Skript schreiben). Diese Bonus-Einreichung muss nicht gespielt werden und kann im Hinblick auf den Umgang mit Input und Output nachlässig sein. Sie unterscheiden sich von den tatsächlichen Einsendungen, sollten jedoch beide in derselben Antwort eingereicht werden .
Hinweis: Nur die Übermittlung einer Bonusantwort ist in Ordnung. Sie werden einfach nicht als Antwort akzeptiert. Um akzeptiert zu werden, müssen Sie die Eingabe- / Ausgabespezifikation genau befolgen (z. B. Ausgabe bezieht Ex Ey
nur Bilder ein, nicht Bilder) und die kürzeste sein.