Розщеплення струн на шматки однакової довжини n
Як і в більшості "звичайних" мов TMTOWTDI (існує кілька способів зробити це). Я припускаю, що вхід не містить стрічкових каналів, і що "розділення" означає розділення його на рядки. Але є дві досить різні цілі: якщо довжина струни не кратна довжині відрізка, чи хочете ви зберегти неповний проміжок часу або ви хочете його відкинути?
Зберігання незавершеного шматка
Загалом, існують три шляхи розщеплення сітківки. Я представляю тут усі три підходи, оскільки вони можуть змінити більше, коли ви спробуєте адаптувати їх до пов'язаної проблеми. Ви можете використовувати заміну та додавати стрічковий канал до кожного матчу:
.{n}
$&¶
Це 8 байт (або трохи менше, якщо n = 2
або n = 3
тому, що ви можете використовувати ..
або ...
відповідно). Це одне питання , хоча: він додає додатковий новий рядок , якщо довжина рядка є кратною довжиною шматка.
Ви також можете використовувати роздільну стадію та скористатися тим, що в розщепленні зберігаються захоплення:
S_`(.{n})
_
Опція видаляє порожні рядки , які в іншому випадку результат буде висвітлювати всю рядок з сірниками. Це 9 байт, але це не додає зворотного каналу. Бо n = 3
це 8 байт і для n = 2
7 байт. Зауважте, що ви можете зберегти один байт у цілому, якщо порожні рядки не мають значення (наприклад, тому що ви будете обробляти лише порожні рядки і позбуватися позбавлення від каналів ліній згодом): тоді ви можете видалити _
.
Третій варіант - використовувати сірник. За допомогою !
опції ми можемо надрукувати всі сірники. Однак, щоб включити кінцевий фрагмент, нам потрібно дозволити змінну довжину відповідності:
M!`.{1,n}
Це також 9 байт, і він також не буде включати в себе зворотний рядок. Це також стає 8 байтів для n = 3
виконання ..?.?
. Однак зауважте, що він зменшується до 6 байт, n = 2
тому що зараз нам це потрібно лише ..?
. Також зауважте, що цей параметр M
можна скинути, якщо це останній етап у вашій програмі, зберігаючи один байт у будь-якому випадку.
Відкидання незавершеного шматка
Це стає дуже довгим, якщо ви спробуєте зробити це із заміною, оскільки вам потрібно замінити кінцевий шматок нічим (якщо він існує), а також розщепленням. Тож ми можемо сміливо ігнорувати це. Цікаво, що для підходу до матчу - навпаки: він стає коротшим:
M!`.{n}
Це 7 байт або менше для n = 2
, n = 3
. Ще раз зауважте, що ви можете опустити, M
якщо це останній етап у коді.
Якщо ви хочете, щоб тут було встановлено зворотний канал, ви можете отримати це, додавши |$
до регулярного виразу.
Бонус: шматки, що перекриваються
Пам’ятайте, що M
є &
опція, яка повертає збіги, що перекриваються (що, як правило, неможливо з регулярним виразом). Це дозволяє отримати всі фрагменти, що перекриваються (підрядки) рядка заданої довжини:
M!&`.{n}