N-е число Моцкина - это число путей от (0, 0) до (n, 0), где каждый шаг имеет форму (1, -1), (1, 0) или (1, 1) и путь никогда не опускается ниже у = 0.
Вот иллюстрация этих путей для n = 1, 2, 3, 4 из ссылки выше:
Желаемая последовательность OEIS A001006 . OEIS имеет некоторые другие характеристики последовательности.
Вам будет дано положительное целое число n в качестве входных данных. Вы должны вывести n-ое число Моцкина.
Вот числа Моцкина с 1 по 10:
1, 2, 4, 9, 21, 51, 127, 323, 835, 2188
Все стандартные методы ввода и вывода разрешены. Применяются стандартные лазейки .
Это код гольф. Побеждает несколько байтов.
Ответы:
MATL , 13
14байтовПример:
РЕДАКТИРОВАТЬ (16 июня 2017 г.): вы можете попробовать это онлайн! Также обратите внимание, что в современных версиях языка (после этой проблемы) они
i
могут быть удалены.объяснение
Довольно просто, используя эквивалентность (см. Уравнение (10)) с гипергеометрической функцией :
Из определения гипергеометрической функции
Понятно, что порядок первых двух аргументов можно поменять местами, что экономит один байт.
источник
Retina ,
5958 байтПринимает участие в одинарных . Ввод 7 (то есть
1111111
) занимает довольно много времени, но все же завершается менее чем за минуту. Я бы не пошел намного дальше, чем это.Попробуйте онлайн.
объяснение
Другая характеристика чисел Моцкина - это число строк трех разных символов, где два из них правильно сбалансированы (отсюда и тесная связь с каталонскими числами, которые одинаковы без третьего символа, который не зависит от балансировки).
Балансировочные группы .NET являются довольно хорошо распознают правильно подобранные строки, так что мы просто генерировать все строки длины
N
( с использованием_
,<
а>
также трех символов) , а затем мы рассчитываем , сколько из них правильно сбалансированы. Например, дляN = 4
правильных строк:По сравнению с определением в вызове,
_
соответствует(1,0)
шаг,<
к(1,1)
и>
к(1,-1)
.Что касается фактического кода, то
:
он используется в качестве разделителя между различными строками. Второе регулярное выражение - это просто стандартная форма регулярного выражения .NET для сбалансированных струн .Следует отметить, что
:
на каждом шаге между строками вставляется только одна строка, но второе регулярное выражение соответствует начальному и завершающему:
(и поскольку совпадения не могут перекрываться, это означает, что смежные строки, сгенерированные из одного шаблона на последнем шаге, не могут совпадать ). Тем не менее, это не проблема, потому что максимум один из этих трех может когда-либо совпадать:_
совпадения, префикс без этого_
уже сбалансирован правильно, и<
или>
будет сбрасывать этот баланс.>
совпадения, строка сбалансирована с этим>
, так что_
или<
будет сбрасывать этот баланс.<
никогда не могут быть сбалансированы.источник
Python 2, 51 байт
Использует формулу из Mathworld
Сохраняет символы, помещая
M[n-1]
термин в сумму какk=n-1
, что даетM[-1]*M[n-1]
,M[-1]=1
как часть начального условия.Изменить: на один символ короче написание суммы рекурсивно:
Другие подходы, которые оказались дольше:
источник
Pyth, 15 байт
Это определяет функцию
y
. Попробуйте онлайн: демонстрацияОбъяснение:
Позвольте
y[n]
быть-числоn
Моцкина. Я рассчитываюy[n]
по формулеОбратите внимание, что первый вектор больше, чем второй (кроме случаев расчета
y[0]
). В этом случае Pyth автоматически игнорирует 1 в конце первого вектора, так что оба вектора имеют одинаковую длину.Эта формула является разновидностью одной из формул, перечисленных в OEIS. Это может быть немного глупо. Из-за 1 в конце первого вектора (что делает длины неравными), мне фактически не нужно давать рекурсию базовый случай. И я надеялся, что эти двое
+...1
могут быть как-то в гольфе. Оказывается, я не могу.Вы можете определить аналогичную рекурсию с точечным произведением векторов равной длины и определить базовый случай
y[0] = 1
с тем же количеством байтов.источник
CJam (20 байтов)
Онлайн демо
Как было отмечено Mego в комментариях по этому вопросу, это очень тесно связано с числами каталонских: изменить
.5
к1
и смещение индекса на единицу (или просто удалить.5
полностью и оставить индекс без изменений) , чтобы получить номера каталонской.Повторение используется
со страницы OEIS. Соответствующее повторение каталонских чисел указано как
источник
Серьезно, 21 байт
Занимает некоторый код из решения Quintopia Catalan Numbers , в частности, улучшение, которое я сделал в комментариях.
Я использую следующую формулу:
Поскольку
nCk
0 дляk > n
, я суммирую всю дорогу доn-1
, так как все эти значения будут 0 и, следовательно, не влияют на сумму.Попробуйте онлайн
Объяснение:
источник
C(n, 2*k)
что делает сейчас?C(n,k) = nCk
, или количество комбинацийk
элементов из пулаn
элементов.R, 64 байта
Использует также формулу Mathworld для ответа @ xnor's python . Благодаря правилам приоритета,
2:n-2
эквивалентно0:(n-2)
.Тестовые случаи:
источник
Mathematica,
3130 байтДля развлечения вот 37-байтовая версия
и 52-байтовая версия
источник
Желе ,
171413 байтПри этом используется рекуррентное отношение из ответа @ PeterTaylor . Попробуйте онлайн!
Как это работает
источник
Mathematica,
444234 байта35-байтовая версия:
источник
Пари / ГП ,
383626 байтПопробуйте онлайн!
Используя уравнение (11) из MathWorld :
источник
);;7 2D$ⁿ$)╡$÷
. Я не буду публиковать его как ответ, потому что язык новее, чем вопрос.05AB1E ,
1312 байтПопробуйте онлайн!
Хотя в большинстве ответов используется формула или рекуррентное отношение, это простой метод подсчета.
Каждый возможный путь через сетку представлен списком его координат y. Для n сегментов имеется всего (n + 1) точек, но первая и последняя обязательно равны 0, так что оставляется (n-1) точек для указания.
Теперь у нас есть список путей (не включая начальный и конечный 0). По построению, ни один из них никогда не опускается ниже 0. Однако некоторые из них имеют недопустимые уклоны (например, скачок от 0 до 2), поэтому нам нужно отфильтровать их.
Ÿ
это колеблющийся диапазон встроенный. Если есть какая-либо пара несмежных чисел, она заполнит пропущенные числа (например, [0, 2] становится [0, 1, 2]). Только законные пути останутся без изменений.Возможно, более интуитивно понятным способом проверки недопустимых уклонов будет
üαà
(утверждение, что максимум парных абсолютных разностей равен 1). Однако при этом пропускается плоский путь [0, 0, ... 0], который стоит одного дополнительного байта для исправления.Наконец, обратите внимание, что реальный код используется
.ø
там, где используется это объяснение0.ø
. Вместо того, чтобы окружать путь нулями, он окружает неявный ввод двумя копиями пути. Это переворачивает систему координат вверх ногами и наизнанку, но в остальном эквивалентно.источник
Stax , 12 байт
Запустите и отладьте его
Я не знаю, как делать необычные математические наборы, но это, по сути, зависит от конструкции динамического программирования.
источник
Рубин, 50
прямая реализация рекуррентного отношения.
источник
Brain-Flak , 90 байт
Попробуйте онлайн!
источник
ES6, 44 байта
Прямой порт рекурсивного решения Python @ xnor. Необходимо,
n<1?1:
потомуn<1||
что сделаетf(0)
возвратtrue
.источник
Haskell , 55 байтов
Простая реализация рекурсии.
Попробуйте онлайн!
источник