Perl 5.10, 392 384 372 235 369 (ASCII) / 234 (Unicode)
Phiên bản ASCII ngắn nhất này dài 369 ký tự:
@_=(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."
Nó bắt đầu từ chương trình cơ sở này:
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.";
Ý tưởng cốt lõi là giữ cho phần cuối của vần điệu và phần đầu của phần tiếp theo $trail
, tăng cường khi chúng ta đi cùng. Nó trở nên không tầm thường bởi sự cần thiết của trường hợp đặc biệt cho lần sử dụng đầu tiên và nỗ lực sử dụng lại biến tên động vật ngay cả trong cụm từ dành riêng cho động vật. Tối ưu hóa hơn nữa bao gồm:
- định danh một ký tự cho mọi thứ
- sử dụng barewords thay vì trích dẫn chuỗi cho danh sách động vật
- sử dụng của ắc
$_
cho $buf
để rút ngắn nhất hoạt động thay thế thậm chí nhiều hơn (sử dụng @_
là bằng vũ lực của thói quen và không giành chiến thắng bất cứ điều gì nhiều hơn bất kỳ nhân vật khác)
- bao gồm không gian trước trực tiếp bên trong biến tên động vật (ký tự khoảng trắng được lấy từ
$"
biến)
- thay thế regrec để rút ngắn các cụm từ phổ biến nhất:
' swallow'
và'iggled '
- không có khoảng cách mã nào và tất cả
\n
trong chuỗi ký tự thay thế bằng dòng mới thực tế
Tất cả trừ tối ưu hóa cuối cùng mang lại điều này:
@_ = (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.";
Ngoài ra, golf này là nạn nhân của vấn đề mã hóa chưa được xác định rõ. Vì hiện tại, vì thế mà tính toán các ký tự riêng lẻ thay vì byte trong một mã hóa được chỉ định, sẽ đạt được một lợi ích lớn bằng cách giải mã nguồn chương trình từ UCS2 trước khi bắt đầu. Kết quả cuối cùng không còn dễ đọc nữa, nhưng nó ngắn thôi. (234 ký tự, được tính là một sự khác biệt so perl -E''
với thông thường) (Tôi phải đưa dòng mới trở lại để làm cho nó hợp lệ UCS2)
$ perl -MEncode=from_to -e'$_="䁟㴨晬礬獰楤敲Ɫ楲搬捡琬摯朩㬤弽≔桥牥⁷慳渠潬搠污摹⁷桯Ⅵ搠愢㭦潲⠢∬∬桡琠睲䩡湤⁊慮搠橊楮獩摥敲∬∬ੈ潷扳畲搦∬∬浡杩湥⁴桡琦∬∬桡琠愠桯朦∩笤瀽④㬤挽␢桩晴䁟㬤琽⑰㼢卨攡敤⁴桥④⁴漠捡瑣栠瑨攤瀬ਤ琢㨢䤠摯渧琠歮潷⁷桹桥Ⅵ搠瑨慴④Ⰺ健牨慰猠獨攧汬楥⸊ਤ弢㬤弮㴢④⸊⑴∻猯☯⁴漡④⽽猯ℯ睡汬潷⽧㭳⽊⽩杧汥搠⽧㭳慹∤张桯牳攬桥楥搠潦潵牳攮∊";from_to($_,utf8,ucs2);eval'
Một điều tốt là có rất nhiều để chơi golf từ trước khi sử dụng Unicode, hoặc nó sẽ không vui lắm.
Chỉnh sửa: không thể tìm cách sao chép / dán phiên bản 234 ký tự vào trình duyệt này, vì vậy tôi sẽ bỏ phiên bản 235 ký tự. Sẽ khắc phục vào tối nay, khi tôi chạm tay vào một bảng tạm nhận dạng UTF8 thực sự. tìm cách. Bằng chứng gần đúng về ideone.