Tome una cuadrícula bidimensional y dibuje una serie de segmentos de línea en ella para representar espejos. Ahora elija un punto para colocar un láser teórico y un ángulo para definir la dirección a la que apunta. La pregunta es: si sigue la trayectoria del rayo láser durante una distancia específica, ¿en qué punto de coordenadas se encuentra?
Ejemplo:
En esta imagen, L
es la ubicación del láser, t
es Es ángulo (medido desde el eje X positivo), M1
, M2
, y M3
son todos los espejos de segmentos de línea, y E
es el punto en la trayectoria del rayo láser después de D = d1 + d2 + d3 + d4
unidades, a partir de L
.
Gol
Escribir el programa más corto (en bytes) que los resultados E
dados L
, t
, D
, y una lista de espejos.
(Use http://mothereff.in/byte-counter para contar bytes).
Formato de entrada
La entrada vendrá de stdin en el formato:
Lx Ly t D M1x1 M1y1 M1x2 M1y2 M2x1 M2y1 M2x2 M2y2 ...
- Todos los valores serán los puntos que coinciden con la expresión regular flotando:
[-+]?[0-9]*\.?[0-9]+
. - Siempre hay exactamente un espacio entre cada número.
- Requerir cotizaciones alrededor de la entrada está permitido.
t
está en grados, pero no necesariamente en el[0, 360)
rango. (Si lo prefiere, puede usar radianes en su lugar, solo dígalo en su respuesta).D
puede ser negativo, efectivamente girando el láser 180 grados.D
también puede ser 0.- Puede haber arbitrariamente muchos espejos (incluido ninguno).
- El orden de los espejos no debería importar.
- Puede suponer que la entrada vendrá en múltiplos de 4 números. por ejemplo,
Lx Ly t
oLx Ly t D M1x1
no son válidos y no serán probados. Ninguna entrada también es inválida.
El diseño anterior se puede ingresar como:
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
(Tenga en cuenta que la imagen se dibujó a mano alzada y estos valores son solo aproximaciones. Los valores de entrada de Martin Büttner
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á más colisiones aunque no coincidan con el boceto).
Formato de salida
La salida debería ir a stdout en el formato:
Ex Ey
Estos también son flotantes y pueden estar en forma exponencial.
Notas
- Los espejos pueden cruzarse entre sí.
- Ambos lados de los espejos son reflectantes.
- El rayo puede golpear el mismo espejo muchas veces.
- El rayo continúa para siempre.
Casos indefinidos
Puede suponer que los casos donde
- el láser comienza en un segmento de línea espejo
- el rayo láser golpea el punto final de un espejo
- el rayo láser golpea la intersección entre dos espejos
no están definidos y no serán probados. Su programa puede hacer cualquier cosa si esto ocurre, incluso arrojar un error.
Prima
Solo por diversión, otorgaré 200 puntos de recompensa a la presentación más votada que genere una representación gráfica del problema (incluso podría escribir un guión interactivo). No es necesario jugar golf con estos bonos y puede ser indulgente con la forma en que se manejan las entradas y salidas. Son distintos de los envíos de golf reales, pero ambos deben presentarse en la misma respuesta .
Nota: Solo enviar una respuesta extra está bien, simplemente no será la respuesta aceptada. Para ser aceptado, debe seguir exactamente las especificaciones de entrada / salida (por ejemplo, la salida solo involucra Ex Ey
, no imágenes), y ser el más corto.