sed, 367 (bytes do código-fonte) + 532 (quantidade de palitos de fósforo para o código-fonte) = 899
s/[^0-9a-jln-suxyz]//Ig;/^$/{s/.*/0/;b};s/.+/&; %1ir %%7lnu %%%4cfhjoy %%%%235bdegpqsxz %%%%%069a %%%%%%8/;:1;s/([^% ])(.+ (%+)[^ ]*\1)/%\3 \2/I;/ ;/!b1;s/;.+//;s/^/,;/;:2;s/(;[^%]*)(%+)/\2\1/;:3;s/,%{10}/%,/;s/^%/,&/;/%{10}/b3;/;.*%/b2;:4;s/,[;,]/,0,/;/,[;,]/b4;s/%{9}/9/g;s/%{8}/8/g;s/%{7}/7/g;s/%{6}/6/g;s/%{5}/5/g;s/%%%%/4/g;s/%%%/3/g;s/%%/2/g;s/%/1/g;s/[^0-9]//g
Experimente Online
Versão multilinhas:
s/[^0-9a-jln-suxyz]//Ig
/^$/{s/.*/0/;b}
s/.+/&; %1ir %%7lnu %%%4cfhjoy %%%%235bdegpqsxz %%%%%069a %%%%%%8/
:1
s/([^% ])(.+ (%+)[^ ]*\1)/%\3 \2/I
/ ;/!b1
s/;.+//
s/^/,;/
:2
s/(;[^%]*)(%+)/\2\1/
:3
s/,%{10}/%,/
s/^%/,&/
/%{10}/b3
/;.*%/b2
:4
s/,[;,]/,0,/
/,[;,]/b4
s/%{9}/9/g
s/%{8}/8/g
s/%{7}/7/g
s/%{6}/6/g
s/%{5}/5/g
s/%%%%/4/g
s/%%%/3/g
s/%%/2/g
s/%/1/g
s/[^0-9]//g
Explicação:
O script acima lê a entrada padrão linha por linha (no espaço do padrão - o "modo sed" usual)) e, para cada linha, gera a quantidade de palitos de fósforo necessários para representar todos os caracteres representáveis pelo palito de fósforo nessa linha. Os cálculos para cada linha de entrada acontecem da seguinte maneira:
s/[^0-9a-jln-suxyz]//Ig
Primeiro, removemos todos os caracteres para os quais não temos uma representação de palito de fósforo correspondente (conforme fornecido na pergunta) do espaço do padrão. Ou seja, removemos todos os caracteres que não são um número de "0" a "9", uma letra de "a" a "j", "n" a "s", "l", "u", "x", "y" ou "z". Letras maiúsculas e minúsculas são tratadas da mesma forma.
/^$/{s/.*/0/;b}
Se acabarmos com um espaço de padrão vazio, imprimiremos 0 (automaticamente seguido por uma nova linha, como sed sempre faz a menos que você passe uma bandeira especial), pularemos todas as linhas posteriores do script e prosseguiremos para o próximo "ciclo sed" ( ou seja, leia a próxima linha de entrada e repita o processamento novamente desde o primeiro comando até que não haja mais linhas de entrada a serem processadas).
s/.+/&; %1ir %%7lnu %%%4cfhjoy %%%%235bdegpqsxz %%%%%069a %%%%%%8/
Caso contrário, se o espaço do padrão não estiver vazio, agora o dividimos em dois "subespaços" separados por ponto e vírgula: primeiro, o espaço de entrada , formado inicialmente por todos os caracteres que não foram removidos do espaço do padrão após o execução da linha 1; a seguir, vem o ponto-e-vírgula e, depois, o espaço do mapa .
O espaço do mapa indica quantos palitos de fósforo ao lado de 1 são necessários para representar cada caractere alfanumérico relevante. Se quisermos saber quantas palitos de fósforo são necessários para representar qualquer caractere alfanumérico no espaço do mapa, procuraremos a primeira sequência de% 's contíguos à esquerda desse caractere e a resposta será o número de%' s em essa sequência mais 1. Portanto, por exemplo, o número de palitos de fósforo necessários para representar um "b" é 4 + 1 = 5; representar um "4", 3 + 1 = 4, representar um "y", 3 + 1 = 4; e assim por diante.
:1
s/([^% ])(.+ (%+)[^ ]*\1)/%\3 \2/I
/ ;/!b1
Este é um loop. Agora, substituiremos todos os caracteres no espaço de entrada pela sequência (completa) de% s cujo número indica a quantidade necessária de palitos de fósforo para representar esse caractere e seguiremos essa sequência por um caractere de espaço em branco (novamente, letras maiúsculas e minúsculas são dado o mesmo tratamento). O critério para determinar se o loop deve terminar é verificar se há um caractere de espaço em branco na esquerda imediata do ponto e vírgula no espaço do padrão: se essa condição for válida, encerramos o loop e continuamos na próxima linha.
s/;.+//
s/^/,;/
Essas duas linhas removem o ponto e vírgula e tudo depois do espaço do padrão e, em seguida, inserem uma vírgula e um ponto e vírgula no início do espaço do padrão. Agora, temos o espaço padrão dividido novamente em dois novos subespaços: o espaço de resultado analógico antes do ponto e vírgula e o espaço de entrada analógica depois dele.
O espaço de entrada analógica é exatamente o que chamamos anteriormente de "espaço de entrada", mas de uma forma diferente: agora contém seqüências de% s separadas por espaço em branco. O número total desses% 's no espaço de entrada analógica é o mesmo número de palitos de fósforo necessários para representar a cadeia de caracteres de entrada inicial, ou seja, esse número é o resultado. Mas devemos imprimir esse resultado em notação decimal, não como uma sequência de sinais de porcentagem. O objetivo do espaço de resultados analógico é manter uma representação analógica de cada dígito do resultado enquanto calculamos esse resultado somando cada sequência contígua de% s no espaço de entrada analógica, um por um. O próximo loop executa essa soma:
:2
s/(;[^%]*)(%+)/\2\1/
:3
s/,%{10}/%,/
s/^%/,&/
/%{10}/b3
/;.*%/b2
Primeiro, após o rótulo 2 , movemos a próxima sequência contígua de% s após o ponto e vírgula do espaço de entrada analógica para a esquerda imediata do ponto e vírgula, no espaço de resultado analógico;
Em seguida, entramos em um sub-loop (rótulo 3 ) que executa os seguintes cálculos:
Se houver uma sequência contígua de dez% 's após uma vírgula no espaço de resultado analógico, removemos esses%' s e colocamos um único% imediatamente à esquerda da vírgula. Simplificando, isso indica que uma das casas decimais no resultado adquiriu mais de 9 unidades, portanto, retiramos 10 unidades dessa casa decimal e adicionamos 1 unidade à próxima casa decimal maior;
Se um "%" for o primeiro caractere no espaço do padrão, inseriremos uma nova vírgula imediatamente antes dele. Isso indica que a soma atingiu um valor cuja representação decimal tem mais uma casa decimal à esquerda que o valor anterior;
Se ainda houver uma sequência contígua de dez% no espaço de resultados analógicos, voltamos ao rótulo 3 e repetimos esse processo. Caso contrário, sairemos deste sub-loop e passaremos para a próxima linha.
Agora, se ainda houver "%" no espaço de entrada analógica (ou seja, após o ponto-e-vírgula), significa que ainda há algum número de palitos de fósforo a serem adicionados à soma total - então voltamos ao rótulo 2 .
Depois que a soma estiver concluída, entramos no loop final do código:
:4
s/,[;,]/,0,/
/,[;,]/b4
Aqui, verificamos todos os caracteres formados por uma vírgula à esquerda e um ponto-e-vírgula ou uma vírgula à direita. Substituímos todos esses pares de caracteres por um "0" dentro de duas vírgulas.
s/%{9}/9/g
s/%{8}/8/g
s/%{7}/7/g
s/%{6}/6/g
s/%{5}/5/g
s/%%%%/4/g
s/%%%/3/g
s/%%/2/g
s/%/1/g
O trecho de código acima é bastante simples: substituímos cada sequência contígua de% 's no espaço de resultados analógico por um caractere de dígito decimal que corresponde ao número de%' s em cada sequência específica.
s/[^0-9]//g
Finalmente, removemos todos os caracteres não numéricos do espaço do padrão e o que resta é o resultado final na notação decimal familiar. Esse valor é impresso na saída padrão e o próximo ciclo sed começa, se houver mais linhas de entrada a serem processadas.
|_\n|_
(em minúsculast
)