Prendi una griglia bidimensionale e disegna un numero di segmenti di linea su di essa per rappresentare gli specchi. Ora scegli un punto per posizionare un laser teorico e un angolo per definire la direzione verso cui punta. La domanda è: se segui il percorso del raggio laser per una determinata distanza, a che punto delle coordinate sei?
Esempio:

In questa immagine, Lè la posizione del laser, tè esso di angolo (misurato dall'asse X positivo), M1, M2e M3sono tutti specchi segmento di linea, ed Eè il punto sul percorso del raggio laser dopo D = d1 + d2 + d3 + d4unità, a partire dal L.
Obbiettivo
Scrivere il programma più breve (in byte) uscite Edati L, t, D, e un elenco di specchi.
(Utilizzare http://mothereff.in/byte-counter per contare i byte.)
Formato di input
L'input verrà dallo stdin nel formato:
Lx Ly t D M1x1 M1y1 M1x2 M1y2 M2x1 M2y1 M2x2 M2y2 ...
- Tutti i valori saranno punti corrispondenti a questa regex galleggianti:
[-+]?[0-9]*\.?[0-9]+. - C'è sempre esattamente uno spazio tra ogni numero.
- Sono richieste virgolette intorno all'input.
tè in gradi, ma non necessariamente[0, 360)nell'intervallo. (Se preferisci puoi usare invece i radianti, dillo nella tua risposta.)Dpuò essere negativo, ruotando efficacemente il laser di 180 gradi.Dpuò anche essere 0.- Potrebbero esserci arbitrariamente molti mirror (incluso nessuno).
- L'ordine degli specchi non dovrebbe avere importanza.
- Si può presumere che l'ingresso arriverà in multipli di 4 numeri. ad esempio
Lx Ly toLx Ly t D M1x1non sono validi e non verranno testati. Nessun input è inoltre non valido.
Il layout sopra potrebbe essere inserito come:
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
(Si noti che l'immagine è stata disegnata a mano libera e questi valori sono solo approssimazioni. I valori di input di Martin Büttner di
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
darà più collisioni anche se non corrispondono allo schizzo.)
Formato di output
L'output dovrebbe andare su stdout nel formato:
Ex Ey
Anche questi sono float e possono essere in forma esponenziale.
Gli appunti
- Gli specchi possono intersecarsi.
- Entrambi i lati degli specchi sono riflettenti.
- Il raggio può colpire più volte lo stesso specchio.
- Il raggio continua per sempre.
Casi indefiniti
Si può presumere che i casi in cui
- il laser inizia su un segmento di linea speculare
- il raggio laser colpisce il punto finale di uno specchio
- il raggio laser colpisce l'intersezione tra due specchi
non sono definiti e non saranno testati. Il tuo programma può fare qualsiasi cosa se si verificano, incluso lanciare un errore.
indennità
Solo per divertimento, assegnerò 200 punti bounty alla presentazione più votata che fornisce una rappresentazione grafica del problema (potresti persino scrivere una sceneggiatura interattiva). Questi invii di bonus non hanno bisogno di essere giocati a golf e possono essere indulgenti con il modo in cui vengono gestiti input e output. Sono distinti dagli attuali invii golfizzati, ma entrambi devono essere inviati nella stessa risposta .
Nota: solo l'invio di una risposta bonus va bene, non sarai la risposta accettata. Per essere accettato devi seguire esattamente le specifiche di input / output (ad es. Output coinvolge solo Ex Ey, non immagini) ed essere il più breve.








