Візьміть двовимірну сітку і намалюйте на ній ряд сегментів ліній, щоб зобразити дзеркала. Тепер виберіть точку, щоб розмістити теоретичний лазер і кут, щоб визначити напрямок, на який він вказує. Питання: якщо ви слідуєте шляху лазерного променя на деяку задану відстань, в якій точці координат ви знаходитесь?
Приклад:
На цьому зображенні, L
є розташування лазера, t
є його кут (вимірюється від позитивної осі X), M1
, M2
, і M3
всі сегменти лінії дзеркала, і E
є точкою на шляху лазерного променя після того, як D = d1 + d2 + d3 + d4
блоків, починаючи з L
.
Мета
Написати найкоротшу програму (в байтах) , який виводить E
дані L
, t
, D
і список дзеркал.
(Використовуйте http://mothereff.in/byte-counter для підрахунку байтів.)
Формат введення
Введення надходить зі stdin у форматі:
Lx Ly t D M1x1 M1y1 M1x2 M1y2 M2x1 M2y1 M2x2 M2y2 ...
- Всі значення будуть плаваючою точку , що відповідає це регулярний вираз:
[-+]?[0-9]*\.?[0-9]+
. - Між кожним числом завжди рівно один пробіл.
- Потрібні лапки навколо введення дозволені.
t
знаходиться в градусах, але не обов'язково в[0, 360)
діапазоні. (Якщо ви віддаєте перевагу, можете замість цього використовувати радіани, просто скажіть це у своїй відповіді.)D
може бути негативним, ефективно обертаючи лазер на 180 градусів.D
також може бути 0.- Дзеркал може бути довільно багато (у тому числі взагалі жодне).
- Порядок дзеркал не повинен мати значення.
- Ви можете припустити, що вхід буде надходити кратним 4 числам. наприклад,
Lx Ly t
абоLx Ly t D M1x1
є недійсними і не перевіряються. Вхід взагалі також недійсний.
Макет вище може вводитися як:
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
(Зверніть увагу, що зображення було намальовано від руки і ці значення є лише наближеннями. Вхідні значення Мартіна Бюттнера
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
дасть більше зіткнень, хоча вони не відповідають ескізу.)
Формат виводу
Вихід повинен переходити до stdout у форматі:
Ex Ey
Це також поплавці і можуть знаходитися в експоненціальній формі.
Примітки
- Дзеркала можуть перетинатися між собою.
- Обидві сторони дзеркал відображають.
- Промінь може потрапляти в одне дзеркало багато разів.
- Промінь йде назавжди.
Невизначені випадки
Можна припустити, що випадки, коли
- лазер запускається на відрізку дзеркальної лінії
- лазерний промінь потрапляє в кінцеву точку дзеркала
- лазерний промінь потрапляє в перетин між двома дзеркалами
не визначені і не будуть перевірені. Ваша програма може зробити що завгодно, якщо вони трапляться, включаючи помилку кидання.
Бонус
Для розваги я присуджую 200 бантових балів за найвищу кількість голосів, що голосує, що дає графічне зображення проблеми (ви навіть можете написати інтерактивний сценарій). Ці бонусні подання не потребують гольфу, і вони можуть бути поблажливішими щодо того, як обробляють вхід та вихід. Вони відрізняються від фактичних заявок на гольф, але обидва повинні бути подані в одній відповіді .
Примітка. Лише подання бонусної відповіді чудово, ви просто не отримаєте відповідь. Щоб прийняти, ви повинні точно дотримуватися специфікації введення / виводу (наприклад, вихід включає лише Ex Ey
зображення, а не зображення), і бути найкоротшим.