Perl 5.10, 392 384 372 235 369 (ASCII) / 234 (Unicode)
Die kürzeste ASCII-Version ist 369 Zeichen lang:
@_=(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."
Es begann mit diesem Basisprogramm:
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.";
Die Kernidee ist es, das Ende des Reims und den Anfang des nächsten Reims beizubehalten und es im weiteren Verlauf zu $trail
erweitern. Die Notwendigkeit eines speziellen Falls für die erste Verwendung und der Versuch, die Variable für den Tiernamen auch in der tierspezifischen Phrase wiederzuverwenden, machen sie nicht trivial. Weitere Optimierungen umfassen:
- Ein-Zeichen-IDs für alles
- Verwenden von Barewords anstelle von Anführungszeichen für die Tierliste
- Verwendung des Speichers
$_
für die $buf
meisten Substitutionsoperationen noch mehr zu verkürzen (Verwendung @_
ist durch die Macht der Gewohnheit und gewinnen nichts mehr als jedes andere Zeichen)
- Einfügen des vorangegangenen Leerzeichens direkt in die Tiernamenvariable (das Leerzeichen aus der
$"
Variablen)
- Regexp-Substitution zur Verkürzung der gebräuchlichsten Ausdrücke:
' swallow'
und'iggled '
\n
Keinerlei Code-Abstände und alles in String-Literalen, die durch aktuelle Zeilenumbrüche ersetzt wurden
Alle außer der letzten Optimierung ergeben dies:
@_ = (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.";
Darüber hinaus ist dieser Golf ein Opfer des Problems der unterbestimmten Codierung. Da in einer bestimmten Codierung ab sofort einzelne Zeichen anstelle von Bytes gezählt werden, ist ein großer Gewinn zu erzielen, wenn die Programmquelle vor dem Start von UCS2 decodiert wird. Das Endergebnis ist nicht mehr gut lesbar, aber es ist in Ordnung, kurz. (234 Zeichen, gezählt als Unterschied zu perl -E''
wie üblich)
$ perl -MEncode=from_to -e'$_="䁟㴨晬礬獰楤敲Ɫ楲搬捡琬摯朩㬤弽≔桥牥⁷慳渠潬搠污摹⁷桯Ⅵ搠愢㭦潲⠢∬∬桡琠睲䩡湤⁊慮搠橊楮獩摥敲∬∬ੈ潷扳畲搦∬∬浡杩湥⁴桡琦∬∬桡琠愠桯朦∩笤瀽④㬤挽␢桩晴䁟㬤琽⑰㼢卨攡敤⁴桥④⁴漠捡瑣栠瑨攤瀬ਤ琢㨢䤠摯渧琠歮潷⁷桹桥Ⅵ搠瑨慴④Ⰺ健牨慰猠獨攧汬楥⸊ਤ弢㬤弮㴢④⸊⑴∻猯☯⁴漡④⽽猯ℯ睡汬潷⽧㭳⽊⽩杧汥搠⽧㭳慹∤张桯牳攬桥楥搠潦潵牳攮∊";from_to($_,utf8,ucs2);eval'
Zum Golfen gab es schon viel, bevor man auf Unicode zurückgegriffen hat, sonst würde es nicht viel Spaß machen.
Bearbeiten: Es kann keine Möglichkeit zum Kopieren / Einfügen der 234-Zeichen-Version in diesen Browser gefunden werden. Ich lasse die 235-Zeichen-Version. Wird heute Abend behoben, wenn ich eine echte UTF8-fähige Zwischenablage in die Hände bekomme. einen Weg gefunden. Quasi Proof auf Ideone.