В этом коде гольф вам нужно будет определить направление самого короткого выстрела, который попадает ровно на n подушек, прежде чем попасть в карман.
Бильярдный стол представляет собой 6-ти карманный бильярдный стол со следующими характеристиками:
- Размеры переменные ( а х б )
- Без трения: мяч будет катиться вечно, пока не упадет в карман
- Карманы и размеры мяча практически равны нулю. Это означает, что мяч попадет в карман только в том случае, если они имеют одинаковое положение.
- Мяч помещается в нижнее левое отверстие в начале (но не падает в него)
Создайте полную программу или функцию, которая принимает размеры ( a , b ) таблицы и количество подушек для попадания n в качестве входных данных и возвращает угол в градусах кратчайшего пути, ударяя ровно по n подушкам, прежде чем попасть в карман.
- а > 0
- б > 0
- 0 <= n <10000000
- Точность 0 < альфа <90 (в градусах): не менее 10 ^ -6
Примеры :
при a = 2, b = 1, n = 1 возможны три пути: (1) (2) (3) на следующем рисунке. число (1) самое короткое, поэтому на выходе должно быть atan (2) = 63,43494882292201 градусов
Решение для a = 2, b = 1, n = 4 - это atan (4/3) = 53.13010235415598 градусов
тестовые образцы:
a = 2, b = 1, n = 1, -> alpha = 63.43494882292201
a = 2, b = 1, n = 2, -> alpha = 71.56505117707799
a = 2, b = 1, n = 3, -> alpha = 75.96375653207353
a = 2, b = 1, n = 4, -> alpha = 53.13010235415598
a = 2, b = 1, n = 5, -> alpha = 59.03624346792648
a = 2, b = 1, n = 6, -> alpha = 81.86989764584403
a = 4.76, b = 3.64, n = 27, -> alpha = 48.503531644784466
a = 2, b = 1, n = 6, -> alpha = 81.86989764584403
a = 8, b = 3, n = 33, -> alpha = 73.24425107080101
a = 43, b = 21, n = 10005, -> alpha = 63.97789961246943
Это код / бильярдный гольф: выигрывает самый короткий код!
n
подушки или хотя бы вn
подушки?Ответы:
Python 2,7,
352344281 байтОбъяснение: вместо того, чтобы вычислять попадания подушек, я добавляю n таблиц и принимаю новые дыры как действительные: черная рамка / дыры - это оригинал, зеленая рамка / дыры - это значение для n = 1, красная граница / дыры - для n = 2 и так далее. Затем я удаляю недопустимые отверстия (например, синяя стрелка для n = 1). У меня будет список действительных отверстий и их координат, затем я вычисляю их расстояние от начальной точки, а затем угол меньшего расстояния.
Примечания:
a = 4,76, b = 3,64, n = 27 - дают 52,66286, пытаясь выяснить, почемуисправлено, и сохранили 8 байтов в процессе = Da = 43, b = 21, n = 10005 - занимает ~ 80 секунд ( но дает правильный угол)
читаемая версия:
источник
: degrees
b < a
. Это можно легко исправить, получив минимум / максимумa
иb
хотя.Haskell,
133117 байтЭто моя реализация:
С таблицей 2x1 путь попадет ровно на n подушек, прежде чем идти в карман, если: (x-1) / 2 + (y-1) == n и x, y - взаимно простые числа. где x, y - расстояние мяча по горизонтальной / вертикальной осям.
Пути одинаковы с произвольным размером таблицы, поэтому нам просто нужно обновить длину и углы с помощью (a, b) и оставить наименьшее значение. Длина пути равна sqrt ((x * a / 2) ^ 2 + (y * b) ^ 2), а угол равен atan ((y * b) / (x * a / 2))
источник