Que dicas gerais você tem para jogar golfe em Retina ? Estou procurando idéias que possam ser aplicadas para codificar problemas de golfe em geral que sejam pelo menos um pouco específicos da Retina (por exemplo, "remover comentários" não é uma resposta). Poste uma dica por resposta.
Para referência, o compilador online está aqui .
@ Sp3000 apontou que também há dicas para o Regex Golf . As respostas aqui devem se concentrar especificamente nos recursos do Retina e não nas dicas gerais de golfe regex.
Respostas:
Combine loops, se possível
Em cálculos não triviais, muitas vezes você se encontra usando vários loops para processar dados:
Portanto, isso é executado
stage1
até a saída convergir, depoisstage2
até a saída convergir e depoisstage3
até a saída convergir.No entanto, sempre vale a pena examinar as etapas em detalhes. Às vezes é possível executar o loop de maneira intercalada
stage1, stage2, stage3, stage1, stage2, stage3, ...
(isso depende muito do que os estágios realmente fazem, mas às vezes eles fazem mudanças completamente ortogonais ou funcionam bem como um pipeline). Nesse caso, você pode salvar bytes envolvendo-os em um único loop:Se
stage1
for o primeiro estágio oustage3
o último estágio do programa, você também pode omitir esses parênteses (o que significa que isso já pode salvar bytes para um loop de dois estágios).Um uso recente dessa técnica pode ser visto nesta resposta .
fonte
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:
São 8 bytes (ou um pouco menos, se
n = 2
oun = 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:
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. Porn = 3
8 bytes en = 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: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 bytesn = 2
porque agora precisamos apenas..?
. Observe também queM
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:
São 7 bytes, ou menos
n = 2
, paran = 3
. Novamente, observe que você pode omitirM
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:fonte
123456
se torna123\n456
e1234567890
se torna12345\n67890
??=
.