Советы по игре в гольф в Retina


10

Какие общие советы у вас есть для игры в гольф в Retina ? Я ищу идеи, которые могут быть применены к проблемам с гольф-кодом в целом, которые, по крайней мере, несколько специфичны для Retina (например, «удалить комментарии» - это не ответ). Пожалуйста, оставьте один совет за ответ.

Для справки, онлайн-компилятор здесь .

@ Sp3000 отметил, что есть также советы для Regex Golf . Ответы здесь должны быть направлены именно на функции Retina, а не на общие советы по игре в регулярные выражения.



Хммм, я не стал публиковать это, потому что Retina все еще находится в стадии разработки, и я боялся, что большинство ответов в конечном итоге приведут к простым советам по игре в регулярные выражения, не очень специфичным для Retina. Но мы могли бы также попробовать, я думаю ... :)
Мартин Эндер

@ MartinBüttner Вы и некоторые другие дали мне много хороших советов и подсказок с тех пор, как я начал смотреть на Retina, поэтому я думаю, что настало время для этого. Я добавил пояснение, что общие советы по регулярным выражениям должны идти к связанному вопросу.
Цифровая травма

1
@ MartinBüttner Здесь так же хорошо, как и у любого другого, спросить - я долго удивлялся - из любопытства, что вдохновляет имя «Retina»? Я предполагаю, что часть «Re» предназначена для регулярных выражений, но как насчет «tina»?
Цифровая травма

3
@DigitalTrauma Я пытался придумать хорошее слово, которое бы работало как аббревиатура, но не получилось. Слово «сетчатка» было довольно близко к некоторым попыткам, и мне понравилось это слово. Мне так и не удалось превратить это в аббревиатуру, и с тех пор я отказался от этого. Так что да, «re» для «регулярных выражений» и, возможно, «n» для «.NET», но, в конечном счете, это просто слово, которое звучит хорошо.
Мартин Эндер

Ответы:


3

Объедините петли, если это возможно

В нетривиальных вычислениях вы часто будете использовать несколько циклов для обработки данных:

+`stage1
+`stage2
+`stage3

Таким образом, это продолжается stage1до тех пор, пока выход не сойдется, затем, stage2пока выход не сойдет, и затем, stage3пока выход не сойдет

Однако всегда стоит подробно изучить этапы. Иногда возможно выполнить цикл в чередующемся порядке stage1, stage2, stage3, stage1, stage2, stage3, ...(вместо этого многое зависит от того, что на самом деле делают этапы, но иногда они вносят полностью ортогональные изменения или работают хорошо как конвейер). В этом случае вы можете сохранить байты, поместив их в один цикл:

{`stage1
stage2
}`stage3

Если stage1это первый этап или stage3последний этап программы, вы можете даже опустить эти скобки (это означает, что это может уже сохранять байты для цикла из двух этапов).

Недавнее использование этой техники можно увидеть в этом ответе .


2

Разбиение струн на куски одинаковой длины n

Как и в большинстве "нормальных" языков TMTOWTDI (есть несколько способов сделать это). Здесь я предполагаю, что входные данные не содержат перевода строки, и что «разделение» означает разделение его на строки. Но есть две совершенно разные цели: если длина строки не кратна длине фрагмента, хотите ли вы сохранить неполный завершающий фрагмент или вы хотите отказаться от него?

Сохранение неполного завершающего фрагмента

В общем, есть три способа расколоть сетчатку. Я представляю все три подхода здесь, потому что они могут иметь большее значение, когда вы пытаетесь адаптировать их к связанной проблеме. Вы можете использовать замену и добавлять перевод строки к каждому совпадению:

.{n}
$&¶

Это 8 байт (или чуть меньше, если n = 2или n = 3потому что вы можете использовать ..или ...соответственно). Это один вопрос , хотя: он добавляет дополнительный перевод строки , если длина строки является кратной длиной куска.

Вы также можете использовать разделенный этап и использовать тот факт, что захваты сохраняются в разделении:

S_`(.{n})

_Опция удаляет пустые строки , которые в противном случае результат будет освещать всю строку со спичками. Это 9 байт, но это не добавляет завершающий перевод строки. Для n = 3него 8 байтов и для n = 27 байтов. Обратите внимание, что вы можете сохранить один байт в целом, если пустые строки не имеют значения (например, потому что вы будете обрабатывать только непустые строки и в любом случае позже избавляться от перевода строки): тогда вы можете удалить _.

Третий вариант - использовать совпадение. С !опцией мы можем напечатать все совпадения. Однако, чтобы включить конечный блок, нам нужно разрешить переменную длину соответствия:

M!`.{1,n}

Это также 9 байтов, и также не включает в себя завершающий перевод строки. Это также становится 8 байтов для n = 3выполнения ..?.?. Однако обратите внимание, что он уменьшается до 6 байт, n = 2потому что теперь нам нужно только ..?. Также обратите внимание, что это Mможет быть отброшено, если это последний этап в вашей программе, сохраняя один байт в любом случае.

Отказ от незавершенного завершающего чанка

Это становится действительно длинным, если вы пытаетесь сделать это с заменой, потому что вам нужно заменить завершающий блок ничем (если он существует), а также разделением. Так что мы можем смело игнорировать их. Интересно, что в случае совпадения все наоборот: оно становится короче:

M!`.{n}

Это 7 байт или меньше для n = 2, n = 3. Опять же, обратите внимание, что вы можете опустить, Mесли это последний этап в коде.

Если вы действительно хотите завершить перевод строки здесь, вы можете получить это, добавив |$к регулярному выражению.

Бонус: перекрывающиеся куски

Помните, что Mесть &опция, которая возвращает перекрывающиеся совпадения (что обычно невозможно с регулярным выражением). Это позволяет получить все перекрывающиеся фрагменты (подстроки) строки заданной длины:

M!&`.{n}

Можно ли как-то разделить строку точно пополам с переменной длиной? Так 123456становится 123\n456и 1234567890становится 12345\n67890?
Кевин Круйссен

1
@KevinCruijssen Не думаю, что я добавил какую-то особую функцию для этого. Возможно, вам придется использовать группы балансировки: tio.run/##K0otycxLNPyvquGe8D/YIEHD3sZWQ09TW1PD3hbI1jW0A3JUNP//… Если вы не возражаете против конечного перевода строки, вы можете опустить ?=.
Мартин Эндер

Я смог выполнить задачу там, где я думал, что она мне нужна по-другому, но балансирование групп действительно очень полезно! Я знал, что это должно быть что-то в этом роде, но мои навыки регулярных выражений / Retina недостаточно хороши. Спасибо за ответы! :)
Кевин Круйссен,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.