Dividindo cordas em pedaços de igual comprimento n
Como na maioria dos idiomas "normais" do TMTOWTDI (há mais de uma maneira de fazer isso). Estou assumindo aqui que a entrada não contém feeds de linha e que "dividir" significa dividi-la em linhas. Mas existem dois objetivos bem diferentes: se o comprimento da corda não for um múltiplo do tamanho do pedaço, você deseja manter o pedaço incompleto à direita ou deseja descartá-lo?
Mantendo um pedaço incompleto à direita
Em geral, existem três maneiras de dividir a Retina. Estou apresentando as três abordagens aqui, porque elas podem fazer uma diferença maior quando você tenta adaptá-las a um problema relacionado. Você pode usar uma substituição e anexar um avanço de linha a cada correspondência:
.{n}
$&¶
São 8 bytes (ou um pouco menos, se n = 2
ou n = 3
porque você pode usar ..
ou ...
respectivamente). Porém, isso tem um problema: acrescenta um avanço de linha adicional se o comprimento da string for um múltiplo do comprimento do pedaço.
Você também pode usar um estágio dividido e fazer uso do fato de que as capturas são mantidas na divisão:
S_`(.{n})
A _
opção remove as linhas vazias que de outra forma resultariam da cobertura de toda a sequência com correspondências. São 9 bytes, mas não adiciona um avanço de linha à direita. Por n = 3
8 bytes e n = 2
7 bytes. Observe que você pode salvar um byte no geral, se as linhas vazias não importarem (por exemplo, porque você processará apenas linhas não vazias e se livrará dos feeds de linha posteriormente): você poderá remover o _
.
A terceira opção é usar uma correspondência. Com a !
opção, podemos imprimir todas as correspondências. No entanto, para incluir o pedaço à direita, precisamos permitir um comprimento de correspondência variável:
M!`.{1,n}
Isso também tem 9 bytes e também não inclui um avanço de linha à direita. Isso também se torna 8 bytes para n = 3
fazer ..?.?
. No entanto, note que ele reduz para 6 bytes n = 2
porque agora precisamos apenas ..?
. Observe também que M
pode ser descartado se este for o último estágio do seu programa, economizando um byte em qualquer caso.
Descartando um pedaço incompleto à direita
Isso fica muito longo se você tentar fazer isso com uma substituição, porque você precisará substituir o bloco à direita por nada (se existir) e também por uma divisão. Para que possamos ignorá-los com segurança. Curiosamente, para a abordagem de partida, é o oposto: fica mais curto:
M!`.{n}
São 7 bytes, ou menos n = 2
, para n = 3
. Novamente, observe que você pode omitir M
se este é o último estágio do código.
Se você deseja um feed de linha à direita aqui, pode obtê-lo anexando |$
à regex.
Bônus: pedaços sobrepostos
Lembre-se de que M
tem a &
opção que retorna correspondências sobrepostas (o que normalmente não é possível com a expressão regular). Isso permite que você obtenha todos os pedaços sobrepostos (substrings) de uma sequência de um determinado comprimento:
M!&`.{n}