sed, 299 + 1
Oui, Sed peut trouver un lama. Non, Sed ne peut pas faire de maths. C’est la réponse la plus longue à ce jour, avec 299 + 1 caractères, car j’ai dû apprendre à sed à compter.
Cette réponse nécessite un sed avec des expressions régulières étendues ( sed -E
ou sed -r
). J'ai utilisé OpenBSD sed (1) . L'entrée est une chaîne par ligne. (Par conséquent, la chaîne ne peut pas contenir de nouvelle ligne.) La sortie est une ligne de chiffres ou rien.
Utilisation (+1 caractère pour -r
):
$ echo 'All arms on all shoulders may ache.' | sed -rf llama.sed
1 2 12 26 30
Code source (299 caractères):
s/%/z/g
s/(.*)[Aa]/\1%/
s/(.*)[Mm](.*%)/\1%\2/
s/(.*)[Aa]((.*%){2})/\1%\2/
s/(.*)[Ll]((.*%){3})/\1%\2/
s/(.*)[Ll]((.*%){4})/\1%\2/
/(.*%){5}/!d
s/[^%]/z/g
:w
s/(z*)%/\10 z\1/
s/z*$//
s/z0/1/
s/z1/2/
s/z2/3/
s/z3/4/
s/z4/5/
s/z5/6/
s/z6/7/
s/z7/8/
s/z8/9/
s/([0-9]z*)z9/z\10/g
s/(z*)z9/1\10/
/[%z]/bw
Le programme remplace d'abord le lama par cinq %
. (Tout %
dans ce programme sont littéral.) La première commande s/%/z/g
change tout %
à z
la ligne d'entrée. Les cinq prochains ordres trouvent le lama, de sorte que tous les bras sur les épaules peuvent faire mal. devient A %% bras sur% ll épaules% ay% che. Parce que chacun .*
est gourmand, je trouve toujours le lama sur la droite: lama lama deviendrait lama %%%%% . Si je ne peux pas en obtenir cinq %
, /(.*%){5}/!d
supprime la ligne de saisie et ignore les commandes suivantes.
s/[^%]/z/g
change tous les caractères , mais %
à z
. Puis j'entre dans une boucle. s/(z*)%/\10 z\1/
change le premier %
en 0
, copie zéro ou plus z
de gauche à droite et ajoute un de plus z
à droite. C'est ainsi que le nombre de z
sera égal à l'indice. Par exemple, zz%zzz%...
devient zz0 zzzzzzzz%...
parce que le premier %
était à l'index 2 et le suivant %
est à l'index 8. s/z*$//
supprime extra z
de la fin de la chaîne.
Les onze prochaines commandes comptent z
en supprimant chacune d’elles z
et en comptant à partir de 0
. Il compte comme zzz0
, zz1
, z2
, 3
. En outre, 1zzzz9
devient z1zzz0
(plus tard 23
) ou zzzz9
devient 1zzz0
(plus tard 13
). Cette boucle continue jusqu'à ce qu'il n'y en ait plus %
ou z
.