Prenez une grille à 2 dimensions et dessinez dessus un certain nombre de segments de lignes pour représenter les miroirs. Maintenant, choisissez un point pour placer un laser théorique et un angle pour définir la direction vers laquelle il pointe. La question qui se pose est la suivante: si vous suivez le trajet du faisceau laser sur une certaine distance, à quel point de coordonnées vous trouvez-vous?
Exemple:
Dans cette image, L
est l'emplacement du laser, t
est l' angle de ce (mesuré à partir de l'axe X positif), M1
, M2
et M3
sont tous les miroirs de segment de ligne, et E
est le point situé sur le trajet du faisceau laser après D = d1 + d2 + d3 + d4
unités, à partir de L
.
Objectif
Ecrire le programme le plus court (en octets) que les résultats E
donnés L
, t
, D
et une liste de miroirs.
(Utilisez http://mothereff.in/byte-counter pour compter les octets.)
Format d'entrée
L'entrée viendra de stdin au format:
Lx Ly t D M1x1 M1y1 M1x2 M1y2 M2x1 M2y1 M2x2 M2y2 ...
- Toutes les valeurs seront flottants pour cette regex:
[-+]?[0-9]*\.?[0-9]+
. - Il y a toujours exactement un espace entre chaque numéro.
- Exiger des guillemets autour de l'entrée est autorisé.
t
est en degrés, mais pas nécessairement dans la[0, 360)
gamme. (Si vous préférez, vous pouvez utiliser des radians, dites simplement cela dans votre réponse.)D
peut être négatif, faisant effectivement pivoter le laser à 180 degrés.D
peut aussi être 0.- Il peut y avoir arbitrairement beaucoup de miroirs (dont aucun du tout).
- L'ordre des miroirs ne devrait pas avoir d'importance.
- Vous pouvez supposer que l'entrée viendra en multiples de 4 chiffres. par exemple
Lx Ly t
ouLx Ly t D M1x1
sont invalides et ne seront pas testés. Aucune entrée n'est également invalide.
La mise en page ci-dessus peut être entrée en tant que:
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
(Notez que l'image a été dessinée à main levée et que ces valeurs ne sont que des approximations. Les valeurs d'entrée 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
donnera plus de collisions bien qu'elles ne correspondent pas à l'esquisse.)
Format de sortie
La sortie devrait aller à stdout au format:
Ex Ey
Ce sont aussi des flotteurs et peuvent être sous forme exponentielle.
Remarques
- Les miroirs peuvent se croiser.
- Les deux côtés des miroirs sont réfléchissants.
- Le faisceau peut heurter plusieurs fois le même miroir.
- Le faisceau continue pour toujours.
Cas non définis
Vous pouvez supposer que les cas où
- le laser démarre sur un segment de droite en miroir
- le faisceau laser atteint l'extrémité d'un miroir
- le faisceau laser frappe l'intersection entre deux miroirs
ne sont pas définis et ne seront pas testés. Votre programme peut faire n'importe quoi si cela se produit, y compris une erreur.
Prime
Juste pour le plaisir, je vais attribuer 200 points de prime à la soumission la plus votée qui produit une représentation graphique du problème (vous pouvez même écrire un script interactif). Ces bonus ne doivent pas nécessairement être joués et peuvent être indulgents avec la manière dont les entrées et les sorties sont gérées. Ils sont distincts des soumissions golfées mais les deux doivent être soumis dans la même réponse .
Remarque: soumettre uniquement une réponse en prime suffit, vous ne serez pas la réponse acceptée. Pour être accepté, vous devez suivre exactement les spécifications d'entrée / sortie (par exemple, la sortie implique uniquement Ex Ey
, pas les images), et être le plus court.