Введение
Напишите программу или функцию, которая, учитывая координаты того, где дротик приземляется на мишени, возвращает результат этого дротика. Координаты дротика даны в виде двух целых чисел, x,y
измеренных от центра мишени с точностью до миллиметра.
Как забить дротик
Дартс - игра, в которую играют в метание дротика на круглой доске. Дротик разделен на 20 одинаковых по размеру «клиньев». Начиная сверху и по часовой стрелке, секции имеют значения 20,1,18,4,13,6,10,15,2,17,3,19,7,16,8,11,14,9,12 , 5. Если ваш дротик приземляется в черных или белых частях любого из клиньев, вы получаете значение, указанное на внешней стороне этого клина.
,
Однако, если ваш дротик приземляется во внешнее зеленое / красное кольцо дартс, вы удваиваете очки, указанные на внешней стороне клина, в который вы попали. Аналогично, ударяя по внутреннему зеленому / красному кольцу (то, которое находится между двумя белыми / черными секциями), вы получаете тройное число, указанное на внешней стороне клина. Если ваш дротик попадает в самый внутренний круг (красный бычий глаз), вы вместо этого набираете 50 очков и, наконец, если ваш дротик попадает во второй самый внутренний круг (зеленое кольцо вокруг бычьего глаза), вы получаете 25 очков.
Размеры колец, измеренные от центра мишени, следующие:
Bullseye (50): [0mm-6mm)
25: [6mm-16mm)
Inner Single: [16mm-99mm)
Triple: [99mm-107mm)
Outer Single: [107mm-162mm)
Double: [162mm-170mm)
Miss (0): 170mm+
Примечание 1: Изображения предоставлены только для иллюстрации и не в масштабе.
Примечание 2: Данные измерения являются приблизительными и могут быть неточными для реального дартс.
Примечание 3: Все измерения даны [inclusive-exclusive)
. В рамках этой задачи мы не будем беспокоиться о том, что дротики могут ударить по проволоке и отскочить. Если дротик приземляется «на проволоке» с одной из радиальных линий, то ответчик должен решить, сломать ли галстук по часовой стрелке или против часовой стрелки. Направление обрыва связи должно быть последовательным и указанным.
Примечание 4: Дартс подвешен стандартным способом, середина 20-й секции находится прямо над яблочком, а 3-я секция - прямо под яблочком.
вход
Два целых числа, представляющие x,y
координаты места приземления дротика, измеренные в миллиметрах, относительно центра дротика.
Выход
Одно целое число для количества очков, которое будет присуждено дротику, который приземлился в заданных координатах.
Образец
0,0 -> 50
2,101 -> 60
-163,-1 -> 22
6,18 -> 1
-6,18 -> 5
45,-169 -> 0
22, 22 -> 4 (if tie-broken clock-wise)
18(if tie-broken counter-clockwise)
-150,0 -> 11
-150,-1 -> 11
счет
код-гольф . Побеждает меньшее количество байтов в вашем исходном коде.
-150,-1
и-150,0
которые должны давать11
и могут быть крайним случаем в некоторых реализациях, так как это переход между тета, сходящимся к -pi, и тета = + pi в полярных координатах. (Мой первоначальный ответ не состоялся 2-го.)Ответы:
JavaScript (ES7), 137 байт
Принимает координаты в синтаксисе карри
(x)(y)
. Использует против часовой стрелки тай-брейк.Попробуйте онлайн!
Как?
Мы переводим входные декартовы координаты в полярные координаты с помощью:( х , у) ( r , θ )
Мы используем чтобы определить, находится ли дротик над « яблочком» , 25 , внутренний одиночный , тройной , внешний одиночный , двойной, или же если выстрел был мисс .р
Если мы расположены над одноместным , двухместный или тройкой , мы используем , чтобы определить , в каком секторе мы с:θ s
Для области нам нужно 4 десятичных знака чтобы получить достаточную точность, что дает:340 × 340 10 / π
Базовые оценки сохраняются против часовой стрелки в закодированной в base-36 строке из 21 записи, начиная и заканчивая :11
Нам нужно повторить потому что половина этого сектора принадлежит первому срезу (где близко к ), а другая половина принадлежит последнему срезу (где близко к ).θ - π θ + π11 θ - π θ + π
Графический вывод
Следующий фрагмент кода ES6 рисует дротик, используя ту же логику, что и в коде для игры в гольф.
Показать фрагмент кода
источник
JavaScript (ES6) + SVG (HTML5),
53 + 52351 +519507 =576570558 байтВвод осуществляется с помощью щелчка мыши, вывод через
alert
. Редактировать: Сохранено 12 байтов, используя немного более приблизительные цвета, как предложено @Arnauld.источник
b33
и474
для красного и зеленого. :-)b33
этоbb3333
такb22
(он жеbb3322
) находится ближе к оригиналуbe3628
.Intel 8086/8087 в сборе,
180144142138 байтовПри этом используется математический сопроцессор 8087 для всех арифметических операций с триггерами и с плавающей запятой. Все вычисления выполняются аппаратно с 80-битной точностью с плавающей точкой.
Записывается как MASM MACRO (в основном функция), принимает координаты X и Y и возвращает вычисленный счет в AX. Галстук разорван по часовой стрелке.
Пример тестовой программы для ПК DOS. Загрузите его здесь DARTTEST.COM .
Выход
Пример использования вышеуказанной тестовой программы . Требуется настоящий IBM PC с 8087, DOSBox или вашим любимым эмулятором.
* Изменения:
источник
Желе , 56 байт
Монадическая ссылка, принимающая пару в виде списка,
[x,y]
который дает оценку.Использует разрыв связи по часовой стрелке.
Попробуйте онлайн! Или посмотрите набор тестов
NB диадическая версия также 56 байтов
Как?
источник
TI-Basic (TI-84 Plus CE),
147146 байтЗапросы для X и Y в отдельных строках.
Тай-брейки против часовой стрелки.
TI-Basic - это токенизированный язык ; все токены, используемые здесь, являются одним байтом.
Объяснение:
Использует тот факт, что булевы сравнения TI-Basic возвращают 0 или 1, складывая их и умножая на значения точек.
источник
T-SQL,
392 374366 байтРазрывы строк предназначены для удобства чтения. Первоначальный
UPDATE
заботятся оx=y=0
проблеме , которая в противном случае выдаст ошибку сATN2()
, но не меняет рейтинг.Ввод берется с помощью уже существующей таблицы т , согласно нашим правилам ввода - вывода . Благодаря использованию
TOP 1
, эта таблица должна содержать только одну строку.В основном я объединяю 3 таблицы:
ROUND()
, который был немного короче, но это дало противоречивый прерыватель связи.)TOP 1
. Значение f является либо фиксированной оценкой (для «бычьего глаза»), либо множителем для оценки клина.РЕДАКТИРОВАТЬ : Удалил
ORDER BY
, кажется, работает без него, по крайней мере, на SQL 2017. Я также сбросилAND y=0
условие обновления; Я проверил для всех целочисленныхy
значений, изменяя,x=0
чтобыx=1
никогда не меняет счет.РЕДАКТИРОВАТЬ 2 : удалил столбец g из таблицы d , заменил его
IIF()
оператором, который либо возвращаетf
напрямую (для «бычьего глаза»), либоf*b
сохранил 8 байтов. Также убрал пробел послеTOP 1
.источник
Haskell , 198 байт
Галстук разрывается против часовой стрелки.
(#)
это функция поиска. Полярный угол используется для индексации из списка чисел, начиная сatan2
точки отсечения в 11. Расстояние используется для индексации из списка функций,[const 50, const 25, id, (*3), id, (*2), const 0]
и, наконец, эта функция применяется к ранее полученному числу.Попробуйте онлайн!
источник
Perl 5
-MMath::Trig':pi' -MMath::Trig':radial' -apl
, 166 байтПопробуйте онлайн!
Занимает пространство двух координат, разделенных на STDIN. Разрыв связи против часовой стрелки.
источник