sed, 367 (bytes del código fuente) + 532 (cantidad de fósforos para el código fuente) = 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
Pruébalo en línea
Versión multilínea:
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
Explicación:
La secuencia de comandos anterior lee la entrada estándar línea por línea (en el espacio del patrón, la "forma de sed" habitual) y, para cada línea, genera la cantidad de fósforos necesarios para representar todos los caracteres representables por fósforos en esa línea. Los cálculos para cada línea de entrada ocurren de la siguiente manera:
s/[^0-9a-jln-suxyz]//Ig
Primero, eliminamos todos los caracteres para los que no tenemos una representación de fósforo correspondiente (como se indica en la pregunta) del espacio del patrón. Es decir, eliminamos todos los caracteres que no son un número de "0" a "9", una letra de "a" a "j", "n" a "s", "l", "u", "x", "y" o "z". Las letras mayúsculas y minúsculas se tratan igual.
/^$/{s/.*/0/;b}
Si terminamos con un espacio de patrón vacío, imprimimos 0 (seguido automáticamente por una nueva línea, como siempre hace sed a menos que le pase una bandera especial), omitimos todas las líneas posteriores del script y pasamos al siguiente "ciclo de sed" ( es decir, lea la siguiente línea de entrada y repita el proceso nuevamente desde el primer comando hasta que no haya más líneas de entrada para procesar).
s/.+/&; %1ir %%7lnu %%%4cfhjoy %%%%235bdegpqsxz %%%%%069a %%%%%%8/
De lo contrario, si el espacio del patrón no está vacío, ahora lo dividimos en dos "subespacios" separados por un punto y coma: primero viene el espacio de entrada , que inicialmente está formado por todos los caracteres que no se eliminaron del espacio del patrón después del ejecución de la línea 1; luego viene el punto y coma, y después el espacio del mapa .
El espacio del mapa nos dice cuántas coincidencias junto a 1 se necesitan para representar cada carácter alfanumérico relevante. Si queremos saber cuántas coincidencias son necesarias para representar cualquier carácter alfanumérico en el espacio del mapa, buscamos la primera secuencia de% contiguos a la izquierda de ese carácter, y la respuesta será el número de% en esa secuencia más 1. Entonces, por ejemplo, el número de fósforos necesarios para representar una "b" es 4 + 1 = 5; para representar un "4", 3 + 1 = 4, para representar una "y", 3 + 1 = 4; y así.
:1
s/([^% ])(.+ (%+)[^ ]*\1)/%\3 \2/I
/ ;/!b1
Esto es un bucle. Ahora reemplazaremos cada carácter en el espacio de entrada por la secuencia (completa) de% 's cuyo número indica la cantidad necesaria de fósforos para representar ese carácter, y seguiremos esa secuencia por un carácter de espacio en blanco (nuevamente, las letras mayúsculas y minúsculas son dado el mismo tratamiento). El criterio para determinar si el ciclo debe finalizar es verificar si hay un carácter de espacio en blanco a la izquierda inmediata del punto y coma en el espacio del patrón: si esa condición se cumple, terminamos el ciclo y continuamos en la siguiente línea.
s/;.+//
s/^/,;/
Esas dos líneas eliminan el punto y coma y todo lo que está después del espacio del patrón y luego insertan una coma y un punto y coma en el comienzo del espacio del patrón. Ahora tenemos el espacio del patrón dividido una vez más en dos subespacios nuevos: el espacio de resultados analógico antes del punto y coma, y el espacio de entrada analógica después de él.
El espacio de entrada analógica es justo lo que anteriormente llamamos el "espacio de entrada", pero en una forma diferente: ahora contiene secuencias de% separadas por espacios en blanco. El número total de dichos% en el espacio de entrada analógica es el mismo número de coincidencias necesarias para representar la cadena de caracteres de entrada inicial, es decir, ese número es el resultado. Pero debemos imprimir ese resultado en notación decimal, no como una secuencia de signos de porcentaje. El propósito del espacio de resultados analógico es mantener una representación analógica de cada dígito del resultado mientras calculamos ese resultado sumando cada secuencia contigua de% 's en el espacio de entrada analógico, uno por uno. El siguiente ciclo realiza esa suma:
:2
s/(;[^%]*)(%+)/\2\1/
:3
s/,%{10}/%,/
s/^%/,&/
/%{10}/b3
/;.*%/b2
Primero, después de la etiqueta 2 , movemos la siguiente secuencia contigua de% 's después del punto y coma desde el espacio de entrada analógica a la izquierda inmediata del punto y coma, en el espacio de resultados analógico;
A continuación, entramos en un sub-loop (etiqueta 3 ) que realiza los siguientes cálculos:
Si hay una secuencia contigua de diez% después de una coma en el espacio de resultados analógico, eliminamos esos% y colocamos un solo% inmediatamente a la izquierda de la coma. En pocas palabras, esto indica que uno de los lugares decimales en el resultado ha adquirido más de 9 unidades, por lo que quitamos 10 unidades de ese lugar decimal y agregamos 1 unidad al siguiente lugar decimal más grande;
Si un "%" es el primer carácter en el espacio del patrón, insertamos una nueva coma inmediatamente antes. Esto indica que la suma ha alcanzado un valor cuya representación decimal tiene un lugar decimal más a la izquierda que el valor anterior;
Si todavía hay una secuencia contigua de diez% en el espacio de resultados analógico, volvemos a la etiqueta 3 y repetimos este proceso. De lo contrario, salimos de este sub-loop y pasamos a la siguiente línea.
Ahora, si todavía hay un "%" en el espacio de entrada analógica (es decir, después del punto y coma), significa que todavía hay que agregar algún número de fósforos a la suma total, por lo que volvemos a la etiqueta 2 .
Una vez que se completa la suma, entramos en el bucle final del código:
:4
s/,[;,]/,0,/
/,[;,]/b4
Aquí, verificamos cada par de caracteres formados por una coma a la izquierda y un punto y coma o una coma a la derecha. Reemplazamos todos esos pares de caracteres por un "0" dentro de dos comas.
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
El código anterior es bastante simple: reemplazamos cada secuencia contigua de% 's en el espacio de resultados analógico por un carácter de dígito decimal que corresponde al número de%' s en cada secuencia particular.
s/[^0-9]//g
Finalmente, eliminamos todos los caracteres no numéricos del espacio del patrón y lo que queda es el resultado final en la notación decimal familiar. Ese valor se imprime en la salida estándar y comienza el siguiente ciclo de sed, si hay más líneas de entrada para procesar.
|_\n|_
(minúsculast
)