В гонках, в которых гонщики проходят хотя бы один поворот изогнутой трассы, стартовые позиции для каждого гонщика смещены, так что каждый гонщик проходит одинаковое расстояние вокруг трассы (в противном случае гонщик во внутренней полосе движения имел бы огромное преимущество ).
Учитывая длину главной и вспомогательной осей (или полу-большой и полу-минорный, если вы предпочитаете) эллиптической дорожки и количество дорожек в дорожке, выведите расстояния от начальной точки самой внутренней полосы, по которой каждая дорожка должен быть в шахматном порядке.
Характеристики
- Каждая полоса представляет собой эллипс с полуголовыми осями на 5 единиц длиннее, чем следующая, самая короткая полоса. Для простоты предположим, что дорожки имеют ширину 0.
- Самая внутренняя полоса движения всегда начинается с 0, а каждая другая начальная точка является положительным целым числом, большим или равным предыдущей начальной точке.
- Ввод и вывод могут быть в любом удобном и разумном формате.
- Входные данные всегда будут целыми числами.
- Вы должны рассчитать окружность дорожки с точностью до 0,01 единицы от фактического значения.
- Выходы должны быть округлены до ближайшего целого числа (с плавающей точкой).
- Финишная черта является отправной точкой для самого внутреннего гонщика. В гонке только один круг.
- Длина осей измеряется с использованием самой внутренней полосы дорожки.
- Вывод 0 для смещения самой внутренней полосы не является обязательным.
Тестовые случаи
Формат: a, b, n -> <list of offsets, excluding innermost lane>
20, 10, 5 -> 30, 61, 92, 124
5, 5, 2 -> 31
15, 40, 7 -> 29, 60, 91, 121, 152, 183
35, 40, 4 -> 31, 62, 94
Эти тестовые случаи были сгенерированы с помощью следующего скрипта Python 3, который использует аппроксимацию окружности эллипса, разработанного Рамануджаном:
#!/usr/bin/env python3
import math
a = 35 # semi-major axis
b = 40 # semi-minor axis
n = 4 # number of lanes
w = 5 # spacing between lanes (constant)
h = lambda a,b:(a-b)**2/(a+b)**2
lane_lengths = [math.pi*(a+b+w*i*2)*(1+3*h(a+w*i,b+w*i)/(10+math.sqrt(4-3*h(a+w*i,b+w*i)))) for i in range(n)]
print("{}, {}, {} -> {}".format(a, b, n, ', '.join([str(int(x-lane_lengths[0])) for x in lane_lengths[1:]])))
Используемое приближение:
Наконец, вот полезная диаграмма для понимания расчетов смещений:
h**5
, который значительно ниже0.01
для широкого диапазона значений.Ответы:
05AB1E , 43 байта
объяснение
Попробуйте онлайн!
источник
Haskell,
10398 байтисточник
Python 3,
168164 байтаСпасибо @ Adám и @Mego за -2 байта каждый
Функция,
f
которая принимает ввод через аргумент и возвращает список смещений полосы, в том числе0
для самой внутренней полосы.Как это устроено
Это использует приближение Рамануджана. Мы просто определяем функции
h
иC
для расчета параметра и окружности, а затем вычитаем длину самой внутренней полосы из длины текущей полосы и пола для всех полос.Попробуйте это на Ideone
источник
sqrt(4-3*h(a,b))
короче(4-3*h(a,b))**.5
, иfloor
может быть заменен наint
. Выполнение этих двух действий означает, что вам не нужно импортироватьmath
.3*
вh
, вы должны сохранить два байта.pi
Возможно, вы сможете закодировать его с достаточной точностью. И да, первые два имеют одинаковую длину - я имел в виду без импорта, конечно! : PDyalog APL , 45 байт
Запросы на п , то для в б . Требуется
⎕IO←0
по умолчанию во многих системах.⍳⎕
запросить n , затем дать {0, 1, 2, ..., n − 1)5×
умножить на пять , чтобы получить {0, 5, 10, ..., 5 п -5}⎕∘.+
запрос на и б , а затем произвести сложение таблицу: , +5 +10 ... +5 п -5 б , б +5, б +10 ... б +5 п -5(
...)⌿
применить функцию в скобках к каждой вертикальной паре, т.е.f ( a , b ), f ( a +5, b +5), f ( a +10, b +10), ..., f ( a + 5 п -5, б +5 п -5) ,
где F ( х , у ) является *
(⊢-⊃)
на результат функции, примененной к каждой паре, вычтите значение первого результата1↓
удалить первый (ноль)⌊
округлитьПопробуй APL онлайн!
* На процедурном языке:
-÷+
найти долю разницы между и суммой х и у2*⍨
возвести в квадрат эту дробь3×
умножьте эту площадь на триh←
назначить этот продукт ч4-
вычесть этот продукт из четырех.5*⍨
взять квадратный корень из этой разницы10+
добавить десять к этому квадратному корнюh÷
разделить h на эту сумму1+
добавить один к этой фракции+×
умножьте эту сумму на сумму х и у○
умножить этот продукт на пиисточник