Возьмите 2-мерную сетку и нарисуйте на ней несколько отрезков, чтобы представить зеркала. Теперь выберите точку для размещения теоретического лазера и угол, чтобы определить направление, на которое он указывает. Вопрос в следующем: если вы следуете по пути лазерного луча на определенном расстоянии, в какой точке координат вы находитесь?
Пример:
На этом изображении, L
является расположение лазера, t
является его угол (измеряется от положительной оси X), M1
, M2
, и M3
все сегменты линии зеркала, и E
является точкой на пути лазерного луча после того, как D = d1 + d2 + d3 + d4
блоков, начиная с L
.
Цель
Написать кратчайшую программу (в байтах) , который выводит E
данные L
, t
, D
и список зеркал.
(Используйте http://mothereff.in/byte-counter для подсчета байтов.)
Формат ввода
Вход будет поступать со стандартного ввода в формате:
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
даст больше столкновений, хотя они не соответствуют эскизу.)
Выходной формат
Вывод должен идти в стандартный вывод в формате:
Ex Ey
Они также являются поплавками и могут быть в экспоненциальной форме.
Заметки
- Зеркала могут пересекаться друг с другом.
- Обе стороны зеркал являются отражающими.
- Луч может попасть в одно и то же зеркало много раз.
- Луч продолжается вечно.
Неопределенные случаи
Вы можете предположить, что случаи, когда
- лазер запускается на отрезке зеркальной линии
- лазерный луч достигает конечной точки зеркала
- лазерный луч попадает на пересечение между двумя зеркалами
не определены и не будут проверены. Ваша программа может сделать что угодно, если это произойдет, в том числе выдать ошибку.
бонус
Просто ради интереса, я буду награждать 200 баллов за наивысшую оценку, которая выводит графическое представление проблемы (вы даже можете написать интерактивный сценарий). Эти бонусные представления не требуют участия в игре и могут быть снисходительны к тому, как обрабатываются ввод и вывод. Они отличаются от фактических представлений о гольфе, но оба должны быть представлены в одном и том же ответе .
Примечание: хорошо подать только бонусный ответ, вы просто не будете принятым ответом. Чтобы быть принятым, вы должны точно следовать спецификации ввода / вывода (например, вывод включает только Ex Ey
изображения, а не изображения) и быть самым коротким.