Я хочу попробовать новый тип задач по регулярному выражению в гольф, в котором вас просят решать нетривиальные вычислительные задачи с помощью только замены регулярных выражений. Чтобы сделать это более возможным и менее трудоемким, вам будет разрешено применить несколько замен, одну за другой.
Соревнование
Мы начнем с простого: учитывая строку, содержащую два натуральных числа в виде десятичных чисел, разделенных ,символом a , получим строку, содержащую их сумму, также в виде десятичного числа. Итак, очень просто
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.
Разные правила
Вы можете использовать любой аромат regex (который вы должны указать), но все шаги должны использовать один и тот же аромат. Кроме того, вы не должны использовать какие-либо функции основного языка флейвора, такие как замена обратных вызовов или eмодификатор Perl , который оценивает код Perl. Все манипуляции должны происходить исключительно посредством замены регулярных выражений.
Обратите внимание, что от вашего вкуса и модификаторов зависит, заменяет ли каждая отдельная замена все вхождения или только один. Например, если вы выберете вариант ECMAScript, один шаг по умолчанию заменит только одно вхождение, если вы не используете gмодификатор. С другой стороны, если вы используете разновидность .NET, каждый шаг всегда заменяет все вхождения.
Для языков, которые имеют разные методы замещения для одиночной и глобальной замены (например, Ruby's subvs. gsub), предположим, что единичная замена используется по умолчанию, и обрабатывайте глобальную замену как gмодификатор.
тестирование
Если выбранный вами вариант - .NET или ECMAScript, вы можете использовать Retina для проверки вашего предложения (мне говорят, это работает и на Mono). Для других вариантов вам, вероятно, придется написать небольшую программу на языке хоста, которая применяет замены по порядку. Если да, включите эту тестовую программу в свой ответ.