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