Предисловие
В известной песне «Двенадцать дней Рождества» рассказчику ежедневно преподносят несколько подарков. Песня является кумулятивной - в каждом стихе добавляется новый подарок, количество которого на один выше, чем подарок перед ним. Одна куропатка, две горлицы, три французские курицы и так далее.
В любом данном стихе, N , мы можем вычислить кумулятивную сумму подарков на данный момент в песне, найдя N- е тетраэдрическое число , которое дает результаты:
Verse 1: 1
Verse 2: 4
Verse 3: 10
Verse 4: 20
Verse 5: 35
Verse 6: 56
Verse 7: 84
Verse 8: 120
Verse 9: 165
Verse 10: 220
Verse 11: 286
Verse 12: 364
Например, после 4-го стиха у нас было 4 * (1 куропатка) , 3 * (2 черепахи) , 2 * (3 французских курицы) и 1 * (4 призывающих птицы) . Суммируя их, мы получаем 4(1) + 3(2) + 2(3) + 1(4) = 20
.
Соревнование
Ваша задача - написать программу или функцию, которая, учитывая положительное целое число, представляющее количество подарков 364 ≥ p ≥ 1 , определяет, какой это день (стих) Рождества.
Например, если р = 286 , мы находимся в 11-й день Рождества. Однако, если р = 287 , то начинается следующая загрузка подарков, то есть это 12-й день.
Математически это нахождение следующего тетраэдрического числа и возвращение его положения во всей последовательности тетраэдрических чисел.
Правила:
- Это код-гольф , поэтому выигрывает самое короткое решение (в байтах).
- Применяются стандартные лазейки для игры в гольф.
- Когда дело доходит до дней, ваша программа должна быть 1-проиндексирована.
- Ваша заявка должна быть полной программой или функцией, но не фрагментом.
Тестовые случаи
1 -> 1
5 -> 3
75 -> 7
100 -> 8
220 -> 10
221 -> 11
364 -> 12
источник
x=>{while(x>p)p+=r+=++i;return i}
я уверен, что это можно сделать короче на таком языке, как JavaScript.Ответы:
Желе ,
76 байт-1 байт благодаря Деннису (используйте векторизованный минимум
«
и первый индексi
)TryItOnline
Как?
Не все так эффективно - вычисляет тетраэдрические числа от 1 до n по порядку в списке и возвращает основанный на 1 индекс первого, который равен или больше.
Предыдущий 7 byters с использованием пониженного диапазона
[0,1,2,3,...,n-1]
и подсчетом tetrahedrals меньше п:Ḷ+\⁺<µS
,Ḷ+\⁺<ḅ1
,Ḷ+\⁺<ċ1
, иḶ+\⁺<¹S
источник
Python , 27 байт
Попробуйте онлайн!
Прямая формула с некоторой подгонкой кривой, такая же, как оригинальная, найденная Level River St.
Смещенное уравнение
i**3-i==n*6
близко кi**3==n*6
большомуi
. Это решает доi=(n*6)**(1/3)
. Принимая слово раундов вниз по мере необходимости, компенсируя один на один.Но есть 6 входов на границах, где ошибка принимает значение ниже целого числа, которое должно быть выше. Все это можно исправить, слегка увеличив показатель степени без дополнительных ошибок.
Python , 38 байт
Формула
n=i*(i+1)*(i+2)/6
для тетраэдрических чисел может быть более хорошо написанаi+1
какn*6=(i+1)**3-(i+1)
. Итак, мы находим самый низкийi
для которогоi**3-i<n*6
. Каждый раз, когда мы увеличиваем,i
начиная с 1, рекурсивные вызовы добавляют1
к выводу. Начиная с,i=1
а неi=0
компенсирует сдвиг.источник
**.33359
работает на один дополнительный байт.lambda n:n**.3336//.5501
сохраняет несколько байтов.J , 12 байт
Возможно, есть более удачный способ сделать это, но это прекрасная возможность использовать инверсию встроенной функции J.
Попробуйте онлайн!
Как это работает
источник
Python , 22 байта
Сильно вдохновлен ответом @ xnor на Python .
Попробуйте онлайн!
источник
Желе , 7 байт
Попробуйте онлайн!
Как это работает
источник
JavaScript (ES6), 33 байта
На основе рекурсивной формулы:
Второе выражение также можно записать как ...
... который мы используем здесь.
a(i - 1)
фактически хранится вk
переменной и передается на следующую итерацию доk >= n
.Контрольные примеры
Показать фрагмент кода
источник
Рубин, 26 байт
Изменить: альтернативная версия, еще 26 байтов
Оригинальная версия
Использует тот факт,
T(x) = x(x+1)(x+2)/6 = ((x+1)**3-(x+1))/6
что очень близко к(x+1)**3/6
.Функция просто умножает на 6, находит слегка измененную версию корня куба (да, требуется 5 десятичных знаков) и возвращает усеченный результат до целого числа.
Тестовая программа и вывод
источник
0.3336
кажется, работает на оригинальную версию. (Редактировать: неважно, Деннис указывает, что я забыл о 364.)JavaScript,
3633 байта-3 байта благодаря Люку (делая функцию карри)
Это безымянная лямбда-функция, которую можно назначать
func
и вызыватьfunc(220)()
, как описано в этом мета-посте . Моя оригинальная функция без карри выглядит так:В этом ответе используется тот факт, что x- е тетраэдрическое число можно найти с помощью следующей функции:
Подчинение работает путем рекурсивного увеличения
i
и поискаtetrahedral(i)
, пока оно не станет больше или равноn
(количество подарков).При вызове с одним аргументом, как и ожидалось
i = undefined
, и, следовательно, не больше, чемn
. Это средствоf(n,-~i)
выполняется и-~undefined
оценивает1
, что запускает рекурсию.Тестовый фрагмент:
источник
n=>g=i=>n<=i/6*++i*++i?i-2:g(~-i)
. Вы бы назвали это какf(2)()
.i=>n<=i
Красиво ;-)MATL ,
1211 байтПопробуйте онлайн!
объяснение
источник
05AB1E , 10 байтов
Попробуйте онлайн!
объяснение
источник
[N2Ý+P6÷¹Q#N>
, милый.Пайк, 11 байт
Попробуй это здесь!
источник
Mathematica, 26 байтов
Безымянная функция, принимающая неотрицательный целочисленный аргумент и возвращающая неотрицательное целое число (да, это работает и для дня
0
). Мы хотим найти наименьшее целое число,i
для которого#
максимально возможное входное значениеi(i+1)(i+2)/6
, которое является формулой для количества подарков, полученных в первыеi
дни. Через легкий алгебраический обман, неравенство# ≤ i(i+1)(i+2)/6
эквивалентно(i+1) + 6# ≤ (i+1)^3
. Таким образом, структура0//.i_/;i+6#>i^3:>i+1
начинается с0
и продолжает добавляться1
до тех пор, пока выполняется тестi+6#>i^3
; затем(...)-1&
вычитает1
в конце (вместо того, чтобы тратить байты с круглыми скобками внутри неравенства).Если мы продолжим 12 Дней Рождества, мы сможем обработать около 65536 дней до того, как встроенный предел рекурсии
//.
остановит процесс ... это примерно 4,7 * 10 ^ 13 дней, или примерно в десять раз больше возраста вселенной на данный момент. ....источник
J , 9 байт
Попробуйте онлайн!
Это более неэффективно, чем использование обратного факториала, но оказывается короче.
Например, если входное целое число равно n = 5, задайте диапазон
[2, n+1]
.Это первые 5 тетраэдрических чисел. Следующим шагом является определение, к какому интервалу (дням) относится n . Есть n + 1 = 6 интервалов.
Тогда n = 5 принадлежит интервалу 3,
(4, 10]
а результат равен 3.объяснение
источник
Python, 43 байта
Сохранено 5 байтов благодаря @FlipTack и еще 3 благодаря @xnor !
источник
f(220)=11
, что должно бытьf(220)=10
.and-~f(n,i+1)
дляand f(n,i+1)or i
. Странно, но обычно короче, когда вы рекурсивно подсчитываете переменную, чтобы не вернуть ее, а вместо этого рекурсивно увеличить вывод.Japt , 12 байт
Проверьте это онлайн! или проверить все тестовые случаи одновременно
Как это работает
Это упрощение тетраэдрической формулы, которую используют несколько других ответов:
Подставляя
x - 1
вx
, мы можем упростить это значительно:Следовательно, правильный результат на единицу меньше наименьшего целого числа,
x
такого, что(x^3 - x) / 6
больше или равно входному значению.13-байтовое решение, вдохновленное ответом @ xnor :
Еще несколько решений @ETHproductions, и я поиграл с
Проверьте это здесь .
источник
SmileBASIC, 43 байта
I
это день,R
этоi
е треугольное число иP
являетсяi
й четырехгранный число (количество подарков).Я думаю, что подобный ответ на другом языке, возможно:
x=>{while(x>p)p+=r+=++i;return i}
мог бы быть довольно хорошим.источник
?I
в конце, не так ли?Python 3,
4846 байтисточник
221
него рухнет.Mathematica,
3125 байтисточник
Haskell,
2123 байтаРедактировать: Как указал xnor, оригинальное решение (
floor.(/0.82).(**0.4)
) не работало между рождественскими днямиисточник
Пакетный, 69 байт
Вручную вычисляет числа тетраэдра.
источник
Pyth 11 байтов
Попробуйте онлайн!
в значительной степени только что перевел ответ Денниса на Pyth
источник
R, 19 символов
основанный на ответе Xnor в
Python
.источник
QBIC , 19 байт
Это крадет формулу @xnor:
Я попытался набрать разрешение до .3336, чтобы сохранить байт, но в конечном тесте это не удалось.
источник
Bash + bc, 44 байта
источник