Perl 5.10, 392 384 372 235 369 (ASCII) / 234 (Unicode)
Versi ASCII terpendek dari ini adalah 369 karakter:
@_=(fly,spider,bird,cat,dog);$_="There was an old lady who!ed a";for$P("",",
That wrJand Jand jJinside her",",
How absurd&",",
Imagine that&",",
What a hog&"){$p=$c;$c=$".shift@_;$t=$p?"She!ed the$c to catch the$p,
$t":"I don't know why she!ed that$c,
Perhaps she'll die.
$_";$_.="$c$P.
$t";s/&/ to! a$c/}s/!/ swallow/g;s/J/iggled /g;say"$_ horse,
She died of course."
Dimulai dari program dasar ini:
my @animals = qw(fly spider bird cat dog);
my $buf = "There was an old lady who swallowed a ";
for my $phrase ( "",
",\nThat wriggled and iggled and jiggled inside her",
",\nHow absurd&",
",\nImagine that&",
",\nWhat a hog&" ) {
$previous = $current;
$current = shift @animals;
$trail = $previous ? "She swallowed the $current to catch the $previous,\n$trail"
: "I don't know why she swallowed that $current,\n"
. "Perhaps she'll die.\n\n$buf";
$buf .= "$current$phrase.\n$trail";
$buf =~ s/&/ to swallow a $current/;
}
say "$buf horse,\nShe died of course.";
Gagasan intinya adalah mempertahankan akhir sajak dan awal sajak berikutnya $trail
, menambahnya seiring berjalannya waktu. Itu dibuat non-sepele oleh kebutuhan kasus khusus untuk penggunaan pertama, dan upaya untuk menggunakan kembali variabel nama hewan bahkan dalam frasa khusus hewan. Optimalisasi lebih lanjut meliputi:
- pengidentifikasi satu karakter untuk semuanya
- menggunakan barewords alih-alih string yang dikutip untuk daftar hewan
- penggunaan akumulator
$_
untuk $buf
mempersingkat sebagian besar operasi substitusi bahkan lebih (penggunaan @_
dengan kebiasaan dan tidak memenangkan apa pun lebih dari karakter lain)
- termasuk ruang sebelumnya langsung di dalam variabel nama hewan (karakter spasi diambil dari
$"
variabel)
- subtitusi regexp untuk mempersingkat frasa yang paling umum:
' swallow'
dan'iggled '
- tidak ada kode spasi apa pun dan semua
\n
dalam string literal diganti dengan baris baru yang sebenarnya
Semua kecuali optimasi terakhir menghasilkan ini:
@_ = (fly, spider, bird, cat, dog);
$_ = "There was an old lady who!ed a";
for $P ( "",
",\nThat wrJand Jand jJinside her",
",\nHow absurd&",
",\nImagine that&",
",\nWhat a hog&" ) {
$p = $c;
$c = $" . shift @_;
$t = $p ? "She!ed the$c to catch the$p,\n$t"
: "I don't know why she!ed that$c,\nPerhaps she'll die.\n\n$_";
$_ .= "$c$P.\n$t";
s/&/ to! a$c/;
}
s/!/ swallow/g;
s/J/iggled /g;
say "$_ horse,\nShe died of course.";
Selain itu, golf ini adalah korban dari masalah pengkodean yang tidak ditentukan. Seperti itu - seperti yang sekarang - menghitung karakter individu dan bukan byte dalam pengkodean yang ditentukan, ada keuntungan besar yang bisa dicapai dengan mendekode sumber program dari UCS2 sebelum memulai. Hasil akhirnya tidak lagi mudah dibaca, tetapi singkat. (234 karakter, dihitung sebagai perbedaan dari perl -E''
seperti biasanya) (Saya harus menyertakan baris belakang baru untuk membuatnya UCS2 valid)
$ perl -MEncode=from_to -e'$_="䁟㴨晬礬獰楤敲Ɫ楲搬捡琬摯朩㬤弽≔桥牥⁷慳渠潬搠污摹⁷桯Ⅵ搠愢㭦潲⠢∬∬桡琠睲䩡湤⁊慮搠橊楮獩摥敲∬∬ੈ潷扳畲搦∬∬浡杩湥⁴桡琦∬∬桡琠愠桯朦∩笤瀽④㬤挽␢桩晴䁟㬤琽⑰㼢卨攡敤⁴桥④⁴漠捡瑣栠瑨攤瀬ਤ琢㨢䤠摯渧琠歮潷⁷桹桥Ⅵ搠瑨慴④Ⰺ健牨慰猠獨攧汬楥⸊ਤ弢㬤弮㴢④⸊⑴∻猯☯⁴漡④⽽猯ℯ睡汬潷⽧㭳⽊⽩杧汥搠⽧㭳慹∤张桯牳攬桥楥搠潦潵牳攮∊";from_to($_,utf8,ucs2);eval'
Untung ada banyak golf dari sebelum beralih ke Unicode, atau itu tidak akan menyenangkan.
Sunting: tidak dapat menemukan cara untuk menyalin / menempel versi 234 karakter ke browser ini, jadi saya meninggalkan versi 235 karakter. Akan memperbaiki malam ini, ketika saya mendapatkan clipboard sadar UTF8 nyata. menemukan jalan. Bukti semu pada ideone.