Разбиение струн на куски одинаковой длины 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}