A contagem de bytes assume a codificação ISO 8859-1.
S_`
%{2`
$`
}T01`p`_p
..
Mm`.¶.|^¶$
^0
Saídas 1
para verdade e0
falsidade.
Experimente online!(A primeira linha ativa um conjunto de testes separado por avanço de linha.)
Explicação
Inspirado por uma resposta de mbomb007, desenvolvi recentemente uma ord()
implementação razoavelmente curta na Retina. Isso é amplamente baseado nisso, embora eu tenha sido capaz de fazer algumas simplificações, já que não preciso de um resultado decimal, pois só preciso oferecer suporte a ASCII imprimível (e só me preocupo com a paridade do resultado, terminando com um deslocamento arbitrário também é bom).
Etapa 1: Divisão
S_`
Isso simplesmente divide a entrada em seus caracteres individuais, dividindo-a em torno da correspondência vazia e eliminando os resultados vazios no início e no final _
.
Etapa 2: substituir
%{2`
$`
o %{
diz à Retina a) que esse estágio e o próximo devem ser executados em um loop até que a string pare de mudar por uma iteração completa e que esses dois estágios sejam aplicados a cada linha (ou seja, cada caractere) da entrada separadamente.
O próprio palco é a técnica padrão para duplicar o primeiro caractere da entrada. Combinamos a string vazia (mas apenas observamos as duas primeiras correspondências) e inserimos o prefixo dessa correspondência. O prefixo da primeira correspondência (no início da string) está vazio, portanto, isso não faz nada, e o prefixo da segunda correspondência é o primeiro caractere, portanto, é duplicado.
Etapa 3: Transliterar
}T01`p`_o
}
indica o fim do loop. O palco em si é uma transliteração. 01
indica que ele deve ser aplicado apenas ao primeiro caractere da sequência. p
é uma abreviação de todos os caracteres ASCII imprimíveis e _
significa "excluir". Portanto, se expandirmos isso, a transliteração fará a seguinte transformação:
from: !"#$%...
to: _ !"#$...
Portanto, os espaços são excluídos e todos os outros caracteres são diminuídos. Isso significa que esses dois estágios juntos criarão um intervalo de caracteres do espaço ao caractere especificado (porque eles duplicam e decrementam repetidamente o primeiro caractere até que se torne um espaço no qual a duplicação e a exclusão são canceladas).
O comprimento desse intervalo pode ser usado para determinar a paridade do personagem.
Etapa 4: substituir
..
Simplesmente descartamos todos os pares de caracteres. Isso limpa as linhas de comprimento par e reduz as linhas de comprimento ímpar a um único caractere (o caractere de entrada, de fato, mas isso realmente não importa).
Etapa 5: partida
Mm`.¶.|^¶$
É mais fácil encontrar entradas que não são uniformes, por isso contamos o número de correspondências de duas linhas vazias sucessivas ou duas linhas não vazias sucessivas. Deveríamos obter 0
entradas pares e algo diferente de zero, caso contrário.
Etapa 6: partida
^0
Tudo o que resta é inverter o resultado, o que fazemos contando o número de correspondências desse regex, que verifica se a entrada começa com a 0
. Isso só é possível se o resultado da primeira etapa foi 0
.