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