sed, 367 (byte del codice sorgente) + 532 (quantità di fiammiferi per il codice sorgente) = 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
Provalo online
Versione multilinea:
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
Spiegazione:
Lo script sopra legge l'input standard riga per riga (nello spazio del modello - il solito "modo sed") e, per ogni riga, genera la quantità di fiammiferi necessari per rappresentare tutti i caratteri rappresentabili del fiammifero in quella linea. I calcoli per ciascuna riga di input avvengono come segue:
s/[^0-9a-jln-suxyz]//Ig
Innanzitutto, rimuoviamo tutti i personaggi per i quali non abbiamo una corrispondente rappresentazione del fiammifero (come indicato nella domanda) dallo spazio del motivo. Ovvero, rimuoviamo ogni carattere che non sia un numero compreso tra "0" e "9", una lettera da "a" a "j", "n" a "s", "l", "u", "x", "y" o "z". Le lettere maiuscole e minuscole sono trattate allo stesso modo.
/^$/{s/.*/0/;b}
Se finiamo con uno spazio modello vuoto, stampiamo 0 (seguito automaticamente da una nuova riga, come sed fa sempre a meno che non ci passi una bandiera speciale), saltiamo tutte le linee posteriori dello script e procediamo al successivo "ciclo sed" ( cioè, leggere la riga successiva di input e ripetere nuovamente l'elaborazione dal primo comando fino a quando non ci sono più righe di input da elaborare).
s/.+/&; %1ir %%7lnu %%%4cfhjoy %%%%235bdegpqsxz %%%%%069a %%%%%%8/
Altrimenti, se lo spazio del modello non è vuoto, ora lo dividiamo in due "spazi secondari" separati da un punto e virgola: prima arriva lo spazio di input , che inizialmente è formato da tutti i caratteri che non sono stati rimossi dallo spazio del modello dopo il esecuzione della linea 1; poi arriva il punto e virgola, e successivamente lo spazio della mappa .
Lo spazio della mappa ci dice quanti fiammiferi accanto a 1 sono necessari per rappresentare ciascun carattere alfanumerico rilevante. Se vogliamo sapere quanti fiammiferi sono necessari per rappresentare qualsiasi carattere alfanumerico nello spazio della mappa, cerchiamo la prima sequenza di% contigue sulla sinistra di quel carattere e la risposta sarà il numero di% in quella sequenza più 1. Quindi, ad esempio, il numero di fiammiferi necessari per rappresentare una "b" è 4 + 1 = 5; per rappresentare un "4", 3 + 1 = 4, per rappresentare un "y", 3 + 1 = 4; e così via.
:1
s/([^% ])(.+ (%+)[^ ]*\1)/%\3 \2/I
/ ;/!b1
Questo è un ciclo. Ora sostituiremo ogni carattere nello spazio di input con la sequenza (completa) di% 'il cui numero indica la quantità necessaria di fiammiferi per rappresentare quel carattere, e seguiremo quella sequenza con un carattere di spazio bianco (di nuovo, le lettere maiuscole e minuscole sono dato lo stesso trattamento). Il criterio per determinare se il ciclo deve terminare è verificare se c'è un carattere di spazio bianco nell'immediata sinistra del punto e virgola nello spazio modello: se tale condizione è valida, terminiamo il ciclo e proseguiamo con la riga successiva.
s/;.+//
s/^/,;/
Queste due righe rimuovono il punto e virgola e tutto il resto dallo spazio del motivo e quindi inseriscono una virgola e un punto e virgola all'inizio dello spazio del motivo. Ora abbiamo di nuovo lo spazio del motivo diviso in due nuovi spazi secondari: lo spazio del risultato analogico prima del punto e virgola e lo spazio di input analogico dopo di esso.
Lo spazio di input analogico è proprio quello che in precedenza abbiamo chiamato "spazio di input", ma in una forma diversa: ora contiene sequenze di% 's separate da spazio bianco. Il numero totale di tali% nello spazio di input analogico è lo stesso numero di fiammiferi necessari per rappresentare la stringa di caratteri di input iniziale, ovvero quel numero è il risultato. Ma dobbiamo stampare quel risultato in notazione decimale, non come una sequenza di segni di percentuale. Lo scopo dello spazio del risultato analogico è di contenere una rappresentazione analogica di ogni cifra del risultato mentre calcoliamo quel risultato sommando una per una ogni sequenza contigua di% nello spazio di input analogico. Il ciclo successivo esegue quella somma:
:2
s/(;[^%]*)(%+)/\2\1/
:3
s/,%{10}/%,/
s/^%/,&/
/%{10}/b3
/;.*%/b2
Innanzitutto, dopo l'etichetta 2 , spostiamo la successiva sequenza contigua di% 's dopo il punto e virgola dallo spazio di input analogico nell'immediata sinistra del punto e virgola, nello spazio del risultato analogico;
Successivamente, entriamo in un sotto-ciclo (etichetta 3 ) che esegue i seguenti calcoli:
Se esiste una sequenza contigua di dieci% dopo una virgola nello spazio dei risultati analogici, rimuoviamo tali% e inseriamo immediatamente una singola% a sinistra della virgola. Per dirla semplicemente, questo indica che una delle posizioni decimali nel risultato ha acquisito più di 9 unità, quindi prendiamo 10 unità di distanza da quella posizione decimale e aggiungiamo 1 unità alla successiva posizione decimale più grande;
Se "%" è il primo carattere nello spazio del motivo, inseriamo una nuova virgola immediatamente prima di essa. Ciò indica che la somma ha raggiunto un valore la cui rappresentazione decimale ha una posizione decimale in più a sinistra rispetto al valore precedente;
Se esiste ancora una sequenza contigua di dieci% nello spazio dei risultati analogici, torniamo all'etichetta 3 e ripetiamo questo processo. Altrimenti, usciamo da questo sotto-ciclo e passiamo alla riga successiva.
Ora, se c'è ancora un "%" nello spazio di input analogico (cioè dopo il punto e virgola), significa che c'è ancora un certo numero di matchstick da aggiungere alla somma totale - quindi torniamo all'etichetta 2 .
Una volta che la somma è completa, entriamo nel ciclo finale del codice:
:4
s/,[;,]/,0,/
/,[;,]/b4
Qui, controlliamo ogni coppia di caratteri formata da una virgola a sinistra e un punto e virgola o una virgola a destra. Sostituiamo tutte queste coppie di caratteri con uno "0" all'interno di due virgole.
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
Il codice sopra riportato è abbastanza semplice: sostituiamo ogni sequenza contigua di% 's nello spazio del risultato analogico con un carattere decimale che corrisponde al numero di%' s in ciascuna sequenza particolare.
s/[^0-9]//g
Infine, rimuoviamo ogni carattere non numerico dallo spazio del motivo e ciò che rimane è il risultato finale nella notazione decimale familiare. Tale valore viene stampato sull'output standard e inizia il successivo ciclo sed, se ci sono altre linee di input da elaborare.
|_\n|_(minuscolot)