Сегодня вам нужно решить очень практическую задачу: сколько петель нужно, чтобы на рулон туалетной бумаги было определенное количество листов? Давайте посмотрим на некоторые факты:
- Диаметр пустого цилиндра туалетной бумаги составляет 3,8 см
- Длина одного листа туалетной бумаги 10см.
- Толщина одного листа туалетной бумаги составляет 1 мм.
Прежде чем вы обернетесь вокруг цилиндра в первый раз, он имеет окружность в см 3,8 * пи. Каждый раз, когда вы обматываете лист вокруг цилиндра, его радиус увеличивается на 0,1, поэтому его окружность увеличивается на 0,2 * PI. Используйте эту информацию, чтобы узнать, сколько петель требуется для размещения n листов туалетной бумаги. (Примечание: используйте приближение числа Пи, которое по крайней мере столь же точно, как и 3.14159).
Тестовые случаи :
n = 1 :
- 10 / (3,8 * пи) = 0,838 петель
n = 2 :
- (Сколько полных циклов мы можем сделать?) 1 полный цикл = 3,8 * пи = 11,938.
- (Сколько у нас осталось после 1-го цикла?) 20 - 11,938 = 8,062
- (Какую часть второго цикла выполняет оставшаяся часть?) 8.062 / (4 * pi) = .642 цикла
- Ответ: 1.642 петли
n = 3 :
- 1-й полный цикл = 3,8 * пи = 11,938, 2-й полный цикл = 4 * пи = 12,566
- 30 - 11,938 - 12,566 = 5,496
- 5,496 / (4,2 * пи) = 0,417
- Ответ: 2.417 петель
n = 100 => 40,874
nloops = sqrt(n+11.34)*0.0564189 - 0.19
100
->40.874
Ответы:
Pyth,
2723 байтаПопробуйте онлайн. Тестирование.
объяснение
источник
Haskell,
594644 байтаПрименяется масштабный коэффициент 5 / пи, так что бумажный цилиндр имеет окружность 19,20,21 ... см, а лист 50 / пи см.
Благодаря xnor удалось сохранить 2 байта, используя неназванную функцию.
источник
(19!).(50/pi*)
.Желе ,
292726 байтПопробуйте онлайн!
источник
Haskell, 97 байт
Возможно, удастся сыграть в него дальше, переместив фильтрацию от
&
оператора вtakeWhile
утверждение, но, учитывая, что это не язык игры в гольф, это кажется относительно конкурентоспособным.объяснение
Поток длин туалетной бумаги, который содержит полные петли, сначала рассчитывается как
scanl (+) 0 (map (* pi) [0.38, 0.4 ..]]
. Мы заархивируем их числом полных оборотов, что такжеDouble
неявно определит тип . Мы передаем это&
текущему номеру, который мы хотим вычислить, позвонимp
.&
обрабатывает список(Double, Double)
пар справа от него (а), пропуская вперед до тех пор, пока неsnd . head . tail
станет больше, чемp
, в этот моментsnd . head
меньше, чемp
.Чтобы получить долю этой строки, которая заполнена, она затем вычисляет
(p - x)/(y - x),
и добавляет ее к общему количеству циклов, которые были сделаны до сих пор.источник
C ++, 72 байта
Я использовал C ++ здесь, потому что он поддерживает аргументы функции по умолчанию, необходимые здесь для инициализации радиуса.
Кажется, что рекурсия производит более короткий код, чем использование
for
-loop. Такжеauto
вместоfloat
- на 1 байт меньше!источник
d
дляr
adius ...Луа, 82 байта
Неплохо для языка общего назначения, но, конечно, не очень конкурентоспособен по отношению к выделенным языкам гольфа. Константы предварительно умножаются на пи с заданной точностью.
источник
n
, но все остальное работало бы как есть (как было?). В любом случае, теперь это происходитn
из командной строки; например, для 3 листов запустите его какlua tp.lua 3
.JavaScript, 77 байт
Показать фрагмент кода
источник
w=(s,d=3.8,c=d*3.14159)=>c>s*10?s*10/c:1+w(s-c/10,d+.2)
C 87 байтов
Использует явную формулу для числа целых циклов:
Я заменил
100 / pi
на31.831
, и заменитьfloor
сround
, поворачивая досадное число-18.5
к чистому-19
.Длина этих петель
После вычитания этой длины из всей длины код делит остаток на соответствующую окружность.
Просто чтобы прояснить - это решение имеет сложность
O(1)
, в отличие от многих (всех?) Других решений. Так что это немного длиннее, чем цикл или рекурсия.источник
C #, 113 байт
Ungolfed:
Полученные результаты:
источник
PHP, 101 байт
Ungolfed
Я чувствую, что это можно сделать немного короче, но у меня закончились идеи.
источник
Python 3,
11410999 байтЭта функция отслеживает окружность каждого слоя, пока сумма окружностей не станет больше, чем длина количества листов. Как только это произойдет, ответ:
Обновить
источник
JavaScript, 44 байта
Я использовал идею Анатолия и перевел код на JavaScript.
источник
> <>,
4644 байтаОжидается, что количество листов будет присутствовать в стеке при запуске программы.
При этом используется приближение числа Пи
355/113 = 3.14159292...
, сохраняемоеpi/5
в регистре. Окружность текущей итерации живет в стеке иpi/5
добавляется к каждой итерации.Изменить: Рефакторинг для непосредственного сохранения окружности - предыдущая версия сохраняла
pi/10
и начинала диаметр как38
, который был на 2 байта длиннее.источник
PHP, 79 байт
Запустить код в песочнице
Я почти полностью перевел ответ Росса Брэдбери о JavaScript в функцию PHP, которая также является рекурсивной.
источник