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 -E
atau 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/g
mengubah apa saja %
ke z
dalam 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}/!d
hapus baris input dan lewati perintah berikutnya.
s/[^%]/z/g
berubah setiap karakter tapi %
untuk z
. Lalu saya memasukkan satu lingkaran. s/(z*)%/\10 z\1/
mengubah yang pertama %
menjadi 0
, menyalin nol atau lebih z
dari kiri ke kanan, dan menambahkan satu lagi z
ke kanan. Ini agar jumlah z
kehendak 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 z
dari ujung string.
Sebelas perintah berikutnya dihitung z
dengan menghapus masing z
- masing dan menghitung dari 0
. Ini penting seperti zzz0
, zz1
, z2
, 3
. Juga, 1zzzz9
menjadi z1zzz0
(lambat 23
), atau zzzz9
menjadi 1zzz0
(lambat 13
). Loop ini berlanjut hingga tidak ada lagi %
atau z
.