sed, 299 +1
Ya, sed dapat menemukan llama. Tidak, saya tidak bisa menghitung. Ini adalah jawaban terpanjang sejauh ini, pada 299 +1 karakter, karena saya harus mengajar sed untuk menghitung.
Jawaban ini membutuhkan sed dengan ekspresi reguler yang diperluas ( sed -Eatau sed -r). Saya menggunakan OpenBSD sed (1) . Input adalah satu string per baris. (Oleh karena itu, string mungkin tidak mengandung baris baru.) Output adalah garis angka, atau tidak sama sekali.
Penggunaan (karakter +1 untuk -r):
$ echo 'All arms on all shoulders may ache.' | sed -rf llama.sed
1 2 12 26 30
Kode sumber (299 karakter):
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
Program pertama menggantikan llama dengan lima %. (Semua %dalam program ini literal.) Perintah pertama s/%/z/gmengubah apa saja %ke zdalam baris input. Lima perintah berikutnya menemukan llama, sehingga semua lengan di atas bahu mungkin sakit. menjadi A %% lengan di atas bahu% ll% ay% che. Karena masing .*- masing serakah, saya selalu menemukan llama di sebelah kanan: llama llama akan menjadi llama %%%%% . Jika saya tidak bisa mendapatkan lima% , maka /(.*%){5}/!dhapus baris input dan lewati perintah berikutnya.
s/[^%]/z/gberubah setiap karakter tapi %untuk z. Lalu saya memasukkan satu lingkaran. s/(z*)%/\10 z\1/mengubah yang pertama %menjadi 0, menyalin nol atau lebih zdari kiri ke kanan, dan menambahkan satu lagi zke kanan. Ini agar jumlah zkehendak sama dengan indeks. Misalnya, zz%zzz%...menjadi zz0 zzzzzzzz%...karena yang pertama %berada di indeks 2, dan yang berikutnya %adalah di indeks 8. s/z*$//menghapus tambahan zdari ujung string.
Sebelas perintah berikutnya dihitung zdengan menghapus masing z- masing dan menghitung dari 0. Ini penting seperti zzz0, zz1, z2, 3. Juga, 1zzzz9menjadi z1zzz0(lambat 23), atau zzzz9menjadi 1zzz0(lambat 13). Loop ini berlanjut hingga tidak ada lagi %atau z.