Я хочу попробовать новый тип задач по регулярному выражению в гольф, в котором вас просят решать нетривиальные вычислительные задачи с помощью только замены регулярных выражений. Чтобы сделать это более возможным и менее трудоемким, вам будет разрешено применить несколько замен, одну за другой.
Соревнование
Мы начнем с простого: учитывая строку, содержащую два натуральных числа в виде десятичных чисел, разделенных ,
символом 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 sub
vs. gsub
), предположим, что единичная замена используется по умолчанию, и обрабатывайте глобальную замену как g
модификатор.
тестирование
Если выбранный вами вариант - .NET или ECMAScript, вы можете использовать Retina для проверки вашего предложения (мне говорят, это работает и на Mono). Для других вариантов вам, вероятно, придется написать небольшую программу на языке хоста, которая применяет замены по порядку. Если да, включите эту тестовую программу в свой ответ.