Я хочу попробовать новый тип задач по регулярному выражению в гольф, в котором вас просят решать нетривиальные вычислительные задачи с помощью только замены регулярных выражений. Чтобы сделать это более возможным и менее трудоемким, вам будет разрешено применить несколько замен, одну за другой.
Соревнование
Мы начнем с простого: учитывая строку, содержащую два натуральных числа в виде десятичных чисел, разделенных ,
символом 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). Для других вариантов вам, вероятно, придется написать небольшую программу на языке хоста, которая применяет замены по порядку. Если да, включите эту тестовую программу в свой ответ.
источник
Ответы:
.NET аромат, оценка: 2
Я еще не удосужился поиграть в гольф, и
x
просто для игнорирования пробелов.Сначала вставьте
9876543210
в каждую позицию, затем удалите оригинальные символы и символы, которые не являются текущей цифрой суммы.Большое регулярное выражение (1346 байт без пробелов и комментариев):
Это заставило меня задуматься о конечном уровне Мануфактуры ... Но я думаю, что регулярное выражение .NET, которое, очевидно, больше не является "регулярным", может решить любые проблемы в PH. И это всего лишь алгоритм в L.
источник
Оценка: 24
Я думаю, что это работает ...
Я еще не проводил много времени в гольфе на отдельных регулярных выражениях. Я постараюсь опубликовать объяснение в ближайшее время, но сейчас уже поздно. А пока вот результат между каждым шагом:
Полная программа Perl:
источник
Любое регулярное выражение, 41
Давайте попробуем унарный.
d
служит для разделителя порядкового номера,x
сохраняет значение. Сначала мы сжимаем каждую цифру, затем сжимаем множители x10 влево, затем отбрасываем все разделители, затем вставляем обратно множители, а затем преобразуем каждый ордер обратно в цифры.источник
.NET Regex, 14
Не так хорошо, как решение пользователя 23013, но это было весело. Ни одна из замен не имеет модификаторов.
Причина .NET регулярных выражений не в том, что на этот раз балансировка групп - я только что протестировал Retina , которая использует .NET, и обнаружил, что lookbehinds переменной длины очень помогли.
Замена 1 (повтор = нет)
Regex:
замена
Поменяйте местами два числа, добавив одинаковое количество ведущих нулей.
Замена 2 (повтор = нет)
Regex:
Замена:
Добавьте пробел перед каждым номером
Замена 3 (повтор = нет)
Замена:
Добавьте бит для переноса (
&0
) и гигантский справочный стол<c> <a> <b> <carry of a+b+c> <last digit of a+b+c>
.Замена 4 (повтор = да)
Regex:
Замена:
Продолжайте брать последние цифры каждого номера и найдите их (сумма, перенос). Поместите сумму в начале строки и замените перенос.
Замена 5 (повтор = нет)
Regex:
Замена:
Убирайся
Пример запуска
(Комбинируя несколько шагов, я могу получить 12, но, поскольку это становится довольно грязным и не выиграет в любом случае, я думаю, что я оставлю эту более элегантную версию вместо этого.)
источник
Оценка:
50403121Спасибо за этот отличный вызов. Это решение не очень изящно, но, учитывая ограничения, я не мог найти никакого способа для обработки общей цифры в выводе.
Это решение имеет группы захвата, которые иногда не совпадают, и полагается, что они будут пустыми, когда это происходит. Это работает в Perl, хотя обычно выдает предупреждение.
Полный пример кода Perl с объяснением и печатью промежуточных результатов:
Обновление: я смог объединить два регулярных выражения, сохранив 10.
Обновление 2: мне удалось взломать преобразование входных цифр с помощью одного регулярного выражения.
Обновление 3: я сократил до регулярного регулярного выражения.
источник
${1}
от$1
? Кроме того, вы можете включить количество байтов в случае связей.\1
, и т. Д., Вместо того, чтобы сохранить несколько символов.