Фонтан является расположение монет в строках , так что каждая монета касается двух монет в строке ниже ее, или находится в нижнем ряду, а нижний ряд соединен. Вот фонтан из 21 монеты:
Ваша задача состоит в том, чтобы подсчитать, сколько разных фонтанов можно сделать с заданным количеством монет.
В качестве входных данных вы получите положительное целое число n
. Вы должны вывести количество различных n
фонтанов-монет, которые существуют.
Стандартные правила ввода / вывода, стандартные лазейки запрещены. Решения должны быть в состоянии рассчитать n = 10
в течение минуты.
Желаемый вывод для n = 1 ... 10
:
1, 1, 2, 3, 5, 9, 15, 26, 45, 78
Эта последовательность OEIS A005169 .
Это код гольф. Побеждает несколько байтов.
code-golf
sequence
combinatorics
isaacg
источник
источник
n
для чего программа должна быть гарантированно работать? (то есть после чего он может сломаться)n
, вплоть до ограничений типа данных, аппаратного обеспечения и т. д.Ответы:
Python, 57 байт
Как отмечалось в OEIS , если вы сдвигаете каждую строку на полшага относительно строки под ней, размеры столбцов образуют последовательность натуральных чисел с максимальным шагом вверх 1.
Функция
f(n,i)
считает последовательности с суммойn
и последним числомi
. Они могут быть рекурсивно суммированы для каждого выбора следующего размера столбца от1
доi+1
, то естьrange(1,i+2)
. Усечение доrange(1,i+2)[:n]
препятствует тому, чтобы столбцы использовали больше монет, чем осталось, избегая необходимости говорить, что отрицательныйn
дает0
. Более того, он избегает явного базового случая, поскольку пустая сумма0
рекурсивна, а не рекурсивна, но вместо этого ееf(0)
необходимо установить1
, для чегоor 1
достаточно (как было бы+0**n
).источник
M|sgL-Gd<ShHG1gQ0
Mathematica, 59 байт
Основано на программе Mathematica по OEIS Жана-Франсуа Альковера.
источник
1/(1-x/(1-x^2/(1-x^3/(1-x^4/(1-x^5/(...))))))
.Haskell,
6048 байтовСпасибо @nimi за более короткое решение!
Старая версия.
Функция вычисления значения:
s
реализация рекурсивной формулы, найденная здесь: https://oeis.org/A005169источник
t (n-p) q
. Игра в гольф советы: используйте оператор инфиксную дляt
смените охранников и использоватьmap
вместо списка понимания:n#p|p>n=0|p<n=sum$map((n-p)#)[1..p+1]|1<2=1
.s
становитсяs=(#1)
, но вам не нужно вообще давать имя главной функции, так(#1)
что этого достаточно. 48 байтов.#
и$
здесь, во-первых =)#
это определенный пользователь функция инфикса так же , как+
,*
и т.д. функции инфиксных предопределена.$
это другой способ настроить приоритет (кроме скобок)f (g (h x))
->f$g$h x
или в нашем случаеsum(map(...)[...])
->sum$map(...)[...]
.Haskell, 43 байта
Смотрите Python ответ для объяснения.
Та же самая длина с
min
чемtake
:источник
Pyth,
2120 байтПопробуйте онлайн. Тестирование.
Это прямая реализация рекурсивной формулы на странице OEIS , как и ответ Matlab .
источник
Matlab,
115105 байтРеализация рекурсивной формулы найдена здесь: https://oeis.org/A005169
источник
Юлия,
4443 байтаЭто использует рекурсивную формулу на OEIS.
объяснение
Кто-нибудь еще заметил, что удар через 44 - это обычный 44 ??
источник
Python 3, 88 байт
источник
JavaScript (ES6), 63
Реализация рекурсивной формулы на странице OEIS
источник