Retina , 59 58 байт
+`(\D*)1(1*)
:$1<$2:$1>$2:$1_$2:
:(_|()<|(?<-2>)>)+:(?!\2)
Принимает участие в одинарных . Ввод 7 (то есть 1111111
) занимает довольно много времени, но все же завершается менее чем за минуту. Я бы не пошел намного дальше, чем это.
Попробуйте онлайн.
объяснение
Другая характеристика чисел Моцкина - это число строк трех разных символов, где два из них правильно сбалансированы (отсюда и тесная связь с каталонскими числами, которые одинаковы без третьего символа, который не зависит от балансировки).
Балансировочные группы .NET являются довольно хорошо распознают правильно подобранные строки, так что мы просто генерировать все строки длины N
( с использованием _
, <
а >
также трех символов) , а затем мы рассчитываем , сколько из них правильно сбалансированы. Например, для N = 4
правильных строк:
____
__<>
_<_>
_<>_
<__>
<_>_
<>__
<<>>
<><>
По сравнению с определением в вызове, _
соответствует (1,0)
шаг, <
к (1,1)
и >
к (1,-1)
.
Что касается фактического кода, то :
он используется в качестве разделителя между различными строками. Второе регулярное выражение - это просто стандартная форма регулярного выражения .NET для сбалансированных струн .
Следует отметить, что :
на каждом шаге между строками вставляется только одна строка, но второе регулярное выражение соответствует начальному и завершающему :
(и поскольку совпадения не могут перекрываться, это означает, что смежные строки, сгенерированные из одного шаблона на последнем шаге, не могут совпадать ). Тем не менее, это не проблема, потому что максимум один из этих трех может когда-либо совпадать:
- Если строка, заканчивающаяся на
_
совпадения, префикс без этого _
уже сбалансирован правильно, и <
или >
будет сбрасывать этот баланс.
- Если строка, заканчивающаяся на
>
совпадения, строка сбалансирована с этим >
, так что _
или <
будет сбрасывать этот баланс.
- Строки, заканчивающиеся на,
<
никогда не могут быть сбалансированы.