G |`
HHeelllloo,, WWoorrlldd!!
$_&
(.)\1t?
$1
Experimente online!
Posições ímpares:
G|
Hello, World!
_
()1?$
Experimente online!
Posições pares:
`
Hello, World!$&
.\t
1
Experimente online!
Explicação
O programa completo:
G |`
Isso não faz nada. A |
opção não é uma configuração existente. O G
torna esta uma fase grep, mas não há realmente nada a ser grepped ea regex é esvaziar qualquer, então isso não faz nada. O objetivo desse estágio é ter dois feeds de linha na frente do "Olá, mundo!" linha para que um deles sempre sobreviva à redução. A razão para fazer disso um grep stag é que precisamos compensar a paridade das linhas, e os estágios grep requerem apenas uma única linha.
HHeelllloo,, WWoorrlldd!!
Isso transforma a sequência de trabalho (vazia) na saída necessária, com cada caractere dobrado.
$_&
Isso não faz nada. As tentativas de regex para corresponder a um _
e um &
após o final da cadeia que é obviamente impossível. No entanto, precisaremos desses caracteres na versão reduzida, novamente para lidar com os desaparecimentos de linha.
(.)\1t?
$1
Finalmente, removemos os caracteres duplicados substituindo (.)\1
por $1
. O t?
nunca é usado, mas será novamente necessário nas versões reduzidas.
O programa ímpar:
G|
Hello, World!
O G
não pode corresponder à entrada vazia, mas é por isso que temos |
que permitir uma correspondência vazia alternativa. Isso transforma a cadeia de trabalho vazia na saída desejada.
_
()1?$
Isso substitui os sublinhados por ()1?$
, mas não há sublinhados na sequência, portanto, isso não faz nada.
O programa par:
`
Hello, World!$&
O `
just denota uma string de configuração vazia, então usamos novamente o regex vazio para substituir a string de trabalho pela saída. Desta vez, também inserimos, $&
mas essa é a correspondência em si, que está vazia, é claro, para que não faça nada.
.\t
1
Isso substituiria qualquer caractere seguido por uma guia por a 1
, mas não temos nenhuma guia , portanto, isso também é um não-op.