Какие общие советы у вас есть для игры в гольф в Retina ? Я ищу идеи, которые могут быть применены к проблемам с гольф-кодом в целом, которые, по крайней мере, несколько специфичны для Retina (например, «удалить комментарии» - это не ответ). Пожалуйста, оставьте один совет за ответ.
Для справки, онлайн-компилятор здесь .
@ Sp3000 отметил, что есть также советы для Regex Golf . Ответы здесь должны быть направлены именно на функции Retina, а не на общие советы по игре в регулярные выражения.
Ответы:
Объедините петли, если это возможно
В нетривиальных вычислениях вы часто будете использовать несколько циклов для обработки данных:
Таким образом, это продолжается
stage1
до тех пор, пока выход не сойдется, затем,stage2
пока выход не сойдет, и затем,stage3
пока выход не сойдетОднако всегда стоит подробно изучить этапы. Иногда возможно выполнить цикл в чередующемся порядке
stage1, stage2, stage3, stage1, stage2, stage3, ...
(вместо этого многое зависит от того, что на самом деле делают этапы, но иногда они вносят полностью ортогональные изменения или работают хорошо как конвейер). В этом случае вы можете сохранить байты, поместив их в один цикл:Если
stage1
это первый этап илиstage3
последний этап программы, вы можете даже опустить эти скобки (это означает, что это может уже сохранять байты для цикла из двух этапов).Недавнее использование этой техники можно увидеть в этом ответе .
источник
Разбиение струн на куски одинаковой длины
n
Как и в большинстве "нормальных" языков TMTOWTDI (есть несколько способов сделать это). Здесь я предполагаю, что входные данные не содержат перевода строки, и что «разделение» означает разделение его на строки. Но есть две совершенно разные цели: если длина строки не кратна длине фрагмента, хотите ли вы сохранить неполный завершающий фрагмент или вы хотите отказаться от него?
Сохранение неполного завершающего фрагмента
В общем, есть три способа расколоть сетчатку. Я представляю все три подхода здесь, потому что они могут иметь большее значение, когда вы пытаетесь адаптировать их к связанной проблеме. Вы можете использовать замену и добавлять перевод строки к каждому совпадению:
Это 8 байт (или чуть меньше, если
n = 2
илиn = 3
потому что вы можете использовать..
или...
соответственно). Это один вопрос , хотя: он добавляет дополнительный перевод строки , если длина строки является кратной длиной куска.Вы также можете использовать разделенный этап и использовать тот факт, что захваты сохраняются в разделении:
_
Опция удаляет пустые строки , которые в противном случае результат будет освещать всю строку со спичками. Это 9 байт, но это не добавляет завершающий перевод строки. Дляn = 3
него 8 байтов и дляn = 2
7 байтов. Обратите внимание, что вы можете сохранить один байт в целом, если пустые строки не имеют значения (например, потому что вы будете обрабатывать только непустые строки и в любом случае позже избавляться от перевода строки): тогда вы можете удалить_
.Третий вариант - использовать совпадение. С
!
опцией мы можем напечатать все совпадения. Однако, чтобы включить конечный блок, нам нужно разрешить переменную длину соответствия:Это также 9 байтов, и также не включает в себя завершающий перевод строки. Это также становится 8 байтов для
n = 3
выполнения..?.?
. Однако обратите внимание, что он уменьшается до 6 байт,n = 2
потому что теперь нам нужно только..?
. Также обратите внимание, что этоM
может быть отброшено, если это последний этап в вашей программе, сохраняя один байт в любом случае.Отказ от незавершенного завершающего чанка
Это становится действительно длинным, если вы пытаетесь сделать это с заменой, потому что вам нужно заменить завершающий блок ничем (если он существует), а также разделением. Так что мы можем смело игнорировать их. Интересно, что в случае совпадения все наоборот: оно становится короче:
Это 7 байт или меньше для
n = 2
,n = 3
. Опять же, обратите внимание, что вы можете опустить,M
если это последний этап в коде.Если вы действительно хотите завершить перевод строки здесь, вы можете получить это, добавив
|$
к регулярному выражению.Бонус: перекрывающиеся куски
Помните, что
M
есть&
опция, которая возвращает перекрывающиеся совпадения (что обычно невозможно с регулярным выражением). Это позволяет получить все перекрывающиеся фрагменты (подстроки) строки заданной длины:источник
123456
становится123\n456
и1234567890
становится12345\n67890
??=
.