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 -Eou 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/gchange tout %à zla 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}/!dsupprime la ligne de saisie et ignore les commandes suivantes.
s/[^%]/z/gchange 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 zde gauche à droite et ajoute un de plus zà droite. C'est ainsi que le nombre de zsera é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 zde la fin de la chaîne.
Les onze prochaines commandes comptent zen supprimant chacune d’elles zet en comptant à partir de 0. Il compte comme zzz0, zz1, z2, 3. En outre, 1zzzz9devient z1zzz0(plus tard 23) ou zzzz9devient 1zzz0(plus tard 13). Cette boucle continue jusqu'à ce qu'il n'y en ait plus %ou z.