पर्ल 5.10, 392 384 372 235 369 (ASCII) / 234 (यूनिकोड)
इस का सबसे छोटा 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
, इसे बढ़ाते हुए हम साथ चलते हैं। इसे पहले उपयोग के लिए एक विशेष मामले की आवश्यकता से गैर-तुच्छ बना दिया गया है, और पशु-विशिष्ट वाक्यांश में भी पशु नाम चर को फिर से उपयोग करने का प्रयास किया गया है। आगे के अनुकूलन में शामिल हैं:
- हर चीज के लिए एक-एक चरित्र पहचानकर्ता
- पशु सूची के लिए उद्धृत स्ट्रिंग्स के बजाय नंगे पासवर्ड का उपयोग करना
- संचायक का उपयोग करने
$_
के लिए $buf
सबसे प्रतिस्थापन संचालन छोटा करने के लिए और भी अधिक (के उपयोग @_
की आदत के बल द्वारा है और किसी भी अन्य चरित्र की तुलना में अधिक कुछ भी जीत नहीं करता है)
- पशु नाम चर के अंदर सीधे पूर्ववर्ती स्थान सहित (चर से लिया गया अंतरिक्ष वर्ण
$"
)
- सबसे आम वाक्यांशों को छोटा करने के लिए regexp प्रतिस्थापन:
' swallow'
और'iggled '
- कोई कोड नहीं जो भी हो और सभी
\n
स्ट्रिंग शाब्दिक में वास्तविक newlines के साथ प्रतिस्थापित किया गया हो
सभी लेकिन अंतिम अनुकूलन इससे उपज देता है:
@_ = (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''
हमेशा की तरह एक अंतर के रूप में गिने जाते हैं ) (मुझे इसे वैध सीसीएससी बनाने के लिए पीछे नई रेखा को शामिल करना पड़ा)
$ perl -MEncode=from_to -e'$_="䁟㴨晬礬獰楤敲Ɫ楲搬捡琬摯朩㬤弽≔桥牥⁷慳渠潬搠污摹⁷桯Ⅵ搠愢㭦潲⠢∬∬桡琠睲䩡湤⁊慮搠橊楮獩摥敲∬∬ੈ潷扳畲搦∬∬浡杩湥⁴桡琦∬∬桡琠愠桯朦∩笤瀽④㬤挽␢桩晴䁟㬤琽⑰㼢卨攡敤⁴桥④⁴漠捡瑣栠瑨攤瀬ਤ琢㨢䤠摯渧琠歮潷⁷桹桥Ⅵ搠瑨慴④Ⰺ健牨慰猠獨攧汬楥⸊ਤ弢㬤弮㴢④⸊⑴∻猯☯⁴漡④⽽猯ℯ睡汬潷⽧㭳⽊⽩杧汥搠⽧㭳慹∤张桯牳攬桥楥搠潦潵牳攮∊";from_to($_,utf8,ucs2);eval'
एक अच्छी बात यह है कि यूनिकोड का सहारा लेने से पहले गोल्फ के लिए बहुत कुछ था, या यह बहुत मजेदार नहीं होगा।
संपादित करें: इस ब्राउज़र में 234-वर्ण संस्करण को कॉपी / पेस्ट करने का एक तरीका नहीं मिल सकता है, इसलिए मैं 235-चरित्र वाले को छोड़ रहा हूं। आज शाम को ठीक करूँगा, जब मैं अपने हाथों को एक वास्तविक UTF8-जागरूक क्लिपबोर्ड पर प्राप्त करूंगा। रास्ता मिल गया। विचारधारा पर अर्ध-प्रमाण।