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