Perl 5.10, 392 384 372 235 369 (ASCII) / 234 (Unicode)
ASCII เวอร์ชันที่สั้นที่สุดคือ 369 ตัวอักษร:
@_=(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."
มันเริ่มจากโปรแกรมพื้นฐานนี้:
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.";
แนวคิดหลักคือการทำให้จุดจบของบทกวีและจุดเริ่มต้นของจุดต่อไปในการ$trail
เพิ่มมันในขณะที่เราไปตาม มันไม่ทำให้เกิดความรำคาญโดยความต้องการของกรณีพิเศษสำหรับการใช้งานครั้งแรกและความพยายามที่จะใช้ตัวแปรชื่อสัตว์อีกครั้งแม้ในวลีเฉพาะของสัตว์ การเพิ่มประสิทธิภาพเพิ่มเติมรวมถึง:
- ตัวระบุหนึ่งตัวสำหรับทุกสิ่ง
- ใช้ barewords แทนสตริงที่ยกมาสำหรับรายการสัตว์
- ใช้ของสะสม
$_
สำหรับ$buf
การร่นระยะการดำเนินงานทดแทนมากที่สุดมากยิ่งขึ้น (ใช้@_
โดยแรงนิสัยและไม่ชนะอะไรมากไปกว่าตัวละครอื่น ๆ )
- รวมถึงช่องว่างก่อนหน้านี้โดยตรงภายในตัวแปรชื่อสัตว์ (อักขระช่องว่างที่นำมาจาก
$"
ตัวแปร)
- การทดแทน regexp เพื่อย่อวลีที่พบบ่อยที่สุด:
' swallow'
และ'iggled '
- ไม่มีการเว้นวรรคโค้ดใด ๆ และทั้งหมด
\n
ในตัวอักษรสตริงถูกแทนที่ด้วยบรรทัดใหม่จริง
ทั้งหมดยกเว้นการปรับให้เหมาะสมล่าสุดให้ผลดังนี้:
@_ = (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.";
นอกจากนี้กอล์ฟนี้ยังตกเป็นเหยื่อของปัญหาการเข้ารหัสที่ไม่ได้ระบุ เนื่องจากในตอนนี้ - นับจำนวนตัวอักษรแต่ละตัวแทนที่จะเป็นไบต์ในการเข้ารหัสที่ระบุจึงได้ประโยชน์อย่างมากจากการถอดรหัสแหล่งโปรแกรมจาก UCS2 ก่อนเริ่ม ผลลัพธ์สุดท้ายนั้นไม่สามารถอ่านได้มากอีกต่อไป แต่มันสั้นทั้งหมด (234 ตัวอักษรนับเป็นความแตกต่างจากperl -E''
ปกติ) (ฉันต้องรวมการขึ้นบรรทัดใหม่ย้อนกลับเพื่อให้เป็น UCS2 ที่ถูกต้อง)
$ perl -MEncode=from_to -e'$_="䁟㴨晬礬獰楤敲Ɫ楲搬捡琬摯朩㬤弽≔桥牥⁷慳渠潬搠污摹⁷桯Ⅵ搠愢㭦潲⠢∬∬桡琠睲䩡湤⁊慮搠橊楮獩摥敲∬∬ੈ潷扳畲搦∬∬浡杩湥⁴桡琦∬∬桡琠愠桯朦∩笤瀽④㬤挽␢桩晴䁟㬤琽⑰㼢卨攡敤⁴桥④⁴漠捡瑣栠瑨攤瀬ਤ琢㨢䤠摯渧琠歮潷⁷桹桥Ⅵ搠瑨慴④Ⰺ健牨慰猠獨攧汬楥⸊ਤ弢㬤弮㴢④⸊⑴∻猯☯⁴漡④⽽猯ℯ睡汬潷⽧㭳⽊⽩杧汥搠⽧㭳慹∤张桯牳攬桥楥搠潦潵牳攮∊";from_to($_,utf8,ucs2);eval'
สิ่งที่ดีมีการเล่นกอล์ฟมากมายก่อนที่จะหันมาใช้ Unicode หรือไม่สนุกมาก
แก้ไข: ไม่สามารถหาวิธีคัดลอก / วางเวอร์ชัน 234 อักขระไปยังเบราว์เซอร์นี้ได้ดังนั้นฉันจึงเหลือ 235 อักขระหนึ่งตัว จะแก้ไขในเย็นวันนี้เมื่อฉันจับมือกับคลิปบอร์ด UTF8 ที่แท้จริง พบวิธี เสมือนพิสูจน์บน ideone