sed, 367 (octets de code source) + 532 (quantité d'allumettes pour le code source) = 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
Essayez-le en ligne
Version multiligne:
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
Explication:
Le script ci-dessus lit l'entrée ligne par ligne standard (dans l'espace de motif - la "voie sed" habituelle) et, pour chaque ligne, il génère le nombre d'allumettes nécessaires pour représenter tous les caractères représentables par les allumettes de cette ligne. Les calculs pour chaque ligne d'entrée se produisent comme suit:
s/[^0-9a-jln-suxyz]//Ig
Tout d'abord, nous supprimons tous les caractères pour lesquels nous n'avons pas de représentation de matchstick correspondante (comme indiqué sur la question) de l'espace de motif. Autrement dit, nous supprimons chaque caractère qui n'est pas non plus un chiffre de "0" à "9", une lettre de "a" à "j", "n" à "s", "l", "u", "x", "y" ou "z". Les lettres majuscules et minuscules sont traitées de la même manière.
/^$/{s/.*/0/;b}
Si nous nous retrouvons avec un espace de motif vide, nous imprimons 0 (automatiquement suivi d'une nouvelle ligne, comme sed le fait toujours sauf si vous lui passez un drapeau spécial), sautez toutes les lignes postérieures du script et passez au prochain "cycle sed" ( c'est-à-dire, lisez la ligne d'entrée suivante et répétez le traitement à nouveau depuis la première commande jusqu'à ce qu'il n'y ait plus de lignes d'entrée à traiter).
s/.+/&; %1ir %%7lnu %%%4cfhjoy %%%%235bdegpqsxz %%%%%069a %%%%%%8/
Sinon, si l'espace de motif n'est pas vide, nous le divisons maintenant en deux "sous-espaces" séparés par un point-virgule: vient d'abord l' espace d'entrée , qui est initialement formé par tous les caractères qui n'ont pas été supprimés de l'espace de motif après la exécution de la ligne 1; vient ensuite le point-virgule, puis l' espace de carte .
L'espace de la carte nous indique combien d'allumettes à côté de 1 sont nécessaires pour représenter chaque caractère alphanumérique pertinent. Si nous voulons savoir combien d'allumettes sont nécessaires pour représenter un caractère alphanumérique dans l'espace de la carte, nous recherchons la première séquence de% contigus à gauche de ce caractère, et la réponse sera le nombre de% dans cette séquence plus 1. Ainsi, par exemple, le nombre d'allumettes nécessaires pour représenter un "b" est 4 + 1 = 5; pour représenter un "4", 3 + 1 = 4, pour représenter un "y", 3 + 1 = 4; etc.
:1
s/([^% ])(.+ (%+)[^ ]*\1)/%\3 \2/I
/ ;/!b1
Ceci est une boucle. Maintenant, nous allons remplacer chaque caractère dans l'espace d'entrée par la séquence (complète) de% dont le nombre indique la quantité nécessaire de correspondances pour représenter ce caractère, et suivre cette séquence par un caractère d'espace blanc (encore une fois, les lettres majuscules et minuscules sont le même traitement). Le critère pour déterminer si la boucle doit se terminer est de vérifier s'il y a un caractère d'espace blanc immédiatement à gauche du point-virgule dans l'espace de motif: si cette condition est remplie, nous terminons la boucle et continuons dans la ligne suivante.
s/;.+//
s/^/,;/
Ces deux lignes suppriment le point-virgule et tout ce qui se trouve après de l'espace de motif, puis insèrent une virgule et un point-virgule au début de l'espace de motif. Nous avons maintenant l'espace de motif divisé à nouveau en deux nouveaux sous-espaces: l' espace de résultat analogique avant le point-virgule et l' espace d'entrée analogique après celui-ci.
L'espace d'entrée analogique est exactement ce que nous avons appelé précédemment «l'espace d'entrée», mais sous une forme différente: il contient maintenant des séquences de% séparées par un espace blanc. Le nombre total de ces% dans l'espace d'entrée analogique est le même nombre d'allumettes nécessaires pour représenter la chaîne de caractères d'entrée initiale, c'est-à-dire que ce nombre est le résultat. Mais nous devons imprimer ce résultat en notation décimale, pas comme une séquence de signes de pourcentage. Le but de l' espace de résultat analogique est de contenir une représentation analogique de chaque chiffre du résultat pendant que nous calculons ce résultat en sommant une à une chaque séquence contiguë de% dans l'espace d'entrée analogique. La boucle suivante effectue cette somme:
:2
s/(;[^%]*)(%+)/\2\1/
:3
s/,%{10}/%,/
s/^%/,&/
/%{10}/b3
/;.*%/b2
Tout d'abord, après l'étiquette 2 , nous déplaçons la prochaine séquence contiguë de% après le point-virgule de l'espace d'entrée analogique vers la gauche immédiate du point-virgule, dans l'espace de résultat analogique;
Ensuite, nous entrons dans une sous-boucle (étiquette 3 ) qui effectue les calculs suivants:
S'il y a une séquence contiguë de dix% après une virgule dans l'espace de résultat analogique, nous supprimons ces% et mettons un seul% immédiatement à gauche de la virgule. Pour dire les choses simplement, cela indique que l'une des décimales dans le résultat a acquis plus de 9 unités, donc nous enlevons 10 unités de cette décimale et ajoutons 1 unité à la décimale suivante la plus grande;
Si un "%" est le premier caractère de l'espace de motif, nous insérons une nouvelle virgule juste avant. Cela indique que la somme a atteint une valeur dont la représentation décimale a une décimale de plus à gauche que la valeur précédente;
S'il y a encore une séquence contiguë de dix% dans l'espace de résultat analogique, nous revenons à l'étiquette 3 et répétons ce processus. Sinon, nous quittons cette sous-boucle et passons à la ligne suivante.
Maintenant, s'il y a encore un "%" dans l'espace d'entrée analogique (c'est-à-dire après le point-virgule), cela signifie qu'il y a encore un certain nombre d'allumettes à ajouter à la somme totale - nous revenons donc à l'étiquette 2 .
Une fois la somme terminée, nous entrons dans la boucle finale du code:
:4
s/,[;,]/,0,/
/,[;,]/b4
Ici, nous vérifions chaque paire de caractères formée d'une virgule à gauche et d'un point-virgule ou d'une virgule à droite. Nous remplaçons toutes ces paires de caractères par un "0" à l'intérieur de deux virgules.
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
Le morceau de code ci-dessus est assez simple: nous remplaçons chaque séquence contiguë de% dans l'espace de résultat analogique par un caractère décimal qui correspond au nombre de% dans chaque séquence particulière.
s/[^0-9]//g
Enfin, nous supprimons tous les caractères non numériques de l'espace de motif et ce qui reste est le résultat final dans la notation décimale familière. Cette valeur est imprimée sur la sortie standard et le cycle sed suivant commence, s'il reste d'autres lignes d'entrée à traiter.
|_\n|_
(en minusculest
)