Вы капитан линкора. В этом году инженерный отдел занимался разработкой дизайна, поэтому корабль, на котором вы находитесь, принимает форму простого треугольника.
Вы выходите на палубу и наслаждаетесь морским бризом ... хотя и ненадолго. Враг выстрелил в тебя! - но ударит ли выстрел?
вход
Вы можете написать либо функцию, либо полную программу для этой задачи.
Ваша программа будет принимать 11 целых чисел, десять из которых являются парными:
Первые три пары целых чисел (x 1 , y 1 ), (x 2 , y 2 ), (x 3 , y 3 ) будут указывать вершины вашего корабля. Сформированный треугольник будет иметь ненулевую площадь.
Следующая пара целых чисел (e x , e y ) указывает местоположение вражеской пушки. Вражеская пушка никогда не будет лежать или находиться в пределах границ вашего корабля. *
Пара (a x , a y ) после этого указывает, куда направлен противник. Это будет отличаться от (e x , e y ).
Последнее положительное целое число R указывает дальность выстрела противника
* Ты был бы ужасным капитаном, если бы даже не заметил этого!
Выход
Вы должны напечатать / вернуть истинное значение (например, true, 1), если линкор будет сбит, иначе ложное значение (например, false, 0).
Что такое хит?
Выстрел противника представляет собой отрезок прямой длины R от (e x , e y ) в направлении (a x , a y ). Если этот отрезок линии перекрывает любую часть внутренней части вашего треугольного линкора, то это считается ударом. В противном случае это не хит.
Выстрелы, которые пасутся вдоль или достигают границы треугольника, не считаются попаданием.
Примеры
0 0 0 1 1 0
1 1
0 0
2
Хит: Враг выстрелил прямо через центр вашего корабля!
2 0 0 2 4 4
0 0
1 1
1
Без удара: враг слишком мал, так что вы в безопасности.
0 0 1 2 3 0
-4 0
0 0
8
Без удара: враг задевает сторону вашего корабля, поэтому это не считается ударом. Счастливый!
0 0 -1 3 4 -1
-3 -4
3 4
5
Без удара: вражеский выстрел просто останавливается рядом с кораблем, так что вы в безопасности. Если бы у вражеской пушки была даже чуть лучшая дальность, то вы были бы поражены! Уф!
-2 -3 -3 6 7 -2
-6 2
1 -4
7
Хит: Даже если выстрел не проникает на другую сторону, это все равно удар.
-3 2 2 -4 7 -3
-3 -4
-3 0
10
Без хита: для протокола, это еще один близкий промах.
Дополнительные тестовые случаи
0 0 6 0 6 8
-6 -8
6 8
20
Без удара: это еще один скот, но под углом.
0 0 -2 -5 5 3
-3 4
0 0
6
Хит: выстрел, введенный через вершину корабля.
счет
Это код-гольф , поэтому выигрывает самый короткий код в байтах. Применяются стандартные лазейки .
0 0 -1 3 4 -1 -3 -4 3 4 6
.Ответы:
Python 3, 252 байта
Это, безусловно, самые переменные, которые я когда-либо использовал в коде гольф. : ^ P
Слегка разгромленный, с комментариями:
Как это устроено:
Образцы прогонов:
источник
Python 2,7, 235 байт
Вычисляет перекрестное произведение
AB x AP
между углами A, B и точкой P. Если все три имеют один и тот же знак, то точка находится внутри треугольника.Ungolfed:
тесты:
источник
C 247 байт
Определенно еще не совсем гольф.
В настоящее время для этого используется подход, аналогичный решению DLosc, т.е. перебирает все возможные координаты на отрезке, чтобы определить, пересекается ли он с треугольником. (Таким образом, произойдет сбой, если диапазон превышает 1000). Однако он использует формулу из http://mathworld.wolfram.com/TriangleInterior.html, чтобы определить, находится ли точка внутри треугольника. Это позволяет избежать множества тригонометрических функций.
Пример проверки, следует напечатать
1 0 0 0 1 0
.источник
JavaScript (ES6) 320
448 522 627(Можно ли еще играть в гольф?)
шаги:
Ссылка:
пересечение сегмента.
Точка внутри треугольника.
Точка в сегменте с заданным расстоянием.
Тест в Firefox
Ungolfed
источник