Поради щодо гольфу в Retina


10

Які загальні поради щодо гольфу в Retina ? Я шукаю ідеї, які можна застосувати до коду проблем із гольфом взагалі, які принаймні дещо характерні для Retina (наприклад, "видалити коментарі" - це не відповідь). Будь ласка, опублікуйте одну пораду на відповідь.

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

@ Sp3000 зазначив, що також є поради для Regex Golf . Відповіді тут повинні зосереджуватися конкретно на особливостях Retina, а не на загальних підказках щодо гольфу для регулярних викидів.



Гммм, я відклав повідомлення про це, тому що Retina все ще багато в розвитку, і я побоювався, що більшість відповідей в кінцевому підсумку стануть простими підказками для гольфу, не дуже характерними для Retina. Але, можливо, ми можемо також перейти, я думаю ... :)
Мартін Ендер

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

1
@ MartinBüttner Тут є таке гарне місце, як і будь-яке запитання, - я цікавився деякий час - з цікавості, що таке натхнення для назви "Retina"? Я припускаю, що частина "Re" призначена для регулярного вираження, а як щодо "tina"?
Digital Trauma

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//… Якщо ви не заперечуєте за тим, що протікає lineline , ви можете опустити це ?=.
Мартін Ендер

Мені вдалося виконати виклик там, де я вважав, що мені це потрібно по-іншому, але балансуючі групи справді дуже корисні! Я знав, що це повинно бути чимось у цьому напрямку, але мої навички регексу / сітківки майже не дуже хороші. Дякуємо за відповідь! :)
Кевін Круїйсен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.