Я хочу спробувати новий тип виклику гольфу на регулярній вигулі, який просить вас вирішити нетривіальні обчислювальні задачі, окрім заміни гегекс. Щоб зробити це більш можливим і менше займатися, вам буде дозволено застосовувати кілька замін, одна за одною.
Змагання
Почнемо з простого: заданий рядок, що містить два натуральних числа, у вигляді десяткових чисел, розділених а ,
, виробляє рядок, що містить їх суму, також у вигляді десяткового числа. Отже, дуже просто
47,987
має перетворитися на
1034
Ваша відповідь має працювати для довільних натуральних чисел.
Формат
Кожна відповідь повинна бути послідовністю етапів заміни, кожен етап складається з регулярного вираження та рядка заміни. Необов'язково, для кожного з цих кроків у послідовності ви можете повторити заміну, поки рядок не перестане змінюватися. Ось приклад подання (який не вирішує вищевказану проблему):
Regex Modifiers Replacement Repeat?
\b(\d) g |$1 No
|\d <none> 1| Yes
\D g <empty> No
З огляду на введення 123,456
, це подання обробляє введення таким чином: перша заміна застосовується один раз і дає результат:
|123,|456
Тепер друга заміна застосовується в циклі, поки рядок не перестане змінюватися:
1|23,|456
11|3,|456
111|,|456
111|,1|56
111|,11|6
111|,111|
І нарешті, третя заміна застосовується один раз:
111111
Зауважте, що критерієм завершення циклів є те, чи змінюється рядок, а не те, чи знайшов регулярний вираз. (Тобто це може також припинитися, якщо ви знайдете відповідність, але заміна ідентична відповідності.)
Оцінка балів
Вашим основним балом буде кількість етапів заміни у вашій заяві. Кожна повторна заміна буде рахуватися за 10 кроків. Отже, вищенаведений приклад міг би оцінити 1 + 10 + 1 = 12
.
У (не надто маловірогідному) випадку равенства вторинна оцінка - це сума розмірів усіх кроків. Для кожного кроку додайте регулярний вираз ( без роздільників), модифікатори та рядок заміни. Для наведеного вище прикладу це було б (6 + 1 + 3) + (3 + 0 + 2) + (2 + 1 + 0) = 18
.
Різні правила
Ви можете використовувати будь-який аромат регексу (який слід вказати), але всі кроки повинні використовувати той самий аромат. Крім того, ви не повинні використовувати будь-які функції мови хосту flavour, як, наприклад, зворотні дзвінки заміни або e
модифікатор Perl , який оцінює код Perl. Всі маніпуляції повинні відбуватися виключно за допомогою підстановки регулярних виразів.
Зауважте, що від вашого смаку та модифікаторів залежить, чи замінює кожна подія всі події або лише одну. Наприклад, якщо ви вибрали аромат ECMAScript, один крок за замовчуванням замінить лише одне явище, якщо ви не використовуєте g
модифікатор. З іншого боку, якщо ви використовуєте аромат .NET, кожен крок завжди замінить усі події.
Для мов, які мають різні способи заміни для одиночної та глобальної заміни (наприклад, Ruby's sub
vs. gsub
), припустимо, що одна заміна є типовою за замовчуванням, і глобальну заміну слід розглядати як g
модифікатор.
Тестування
Якщо обраний вами аромат є .NET або ECMAScript, ви можете використовувати Retina для перевірки подання (мені кажуть, він працює і на Mono). Для інших ароматів вам, ймовірно, доведеться написати невелику програму на мові хоста, яка застосовує заміни в порядку. Якщо ви це зробите, будь ласка, включіть цю програму тестування у свою відповідь.