Perl 5.10, 392 384 372 235 369 (ASCII) / 234 (Unicode)
La versión ASCII más corta de esto tiene 369 caracteres de longitud:
@_=(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."
Comenzó desde este programa base:
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.";
La idea central es mantener el final de la rima y el comienzo de la siguiente $trail, aumentando a medida que avanzamos. No es trivial por la necesidad de un caso especial para el primer uso, y el intento de reutilizar la variable del nombre del animal incluso en la frase específica del animal. Otras optimizaciones incluyen:
- identificadores de un carácter para todo
- usando palabras simples en lugar de cadenas citadas para la lista de animales
- uso del acumulador
$_para $bufacortar aún más la mayoría de las operaciones de sustitución (el uso @_es por la fuerza del hábito y no gana nada más que cualquier otro personaje)
- incluido el espacio anterior directamente dentro de la variable de nombre animal (el carácter de espacio tomado de la
$"variable)
- sustitución de expresiones regulares para acortar las frases más comunes:
' swallow'y'iggled '
- sin espaciado de código y todos
\nen literales de cadena reemplazados por líneas nuevas reales
Todos menos la última optimización producen esto:
@_ = (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.";
Además, este golf es víctima del problema de codificación no especificado. A medida que, a partir de ahora, cuenta caracteres individuales en lugar de bytes en una codificación específica, se puede lograr una gran ganancia decodificando la fuente del programa desde UCS2 antes de comenzar. El resultado final ya no es muy legible, pero es corto, de acuerdo. (234 caracteres, contados como una diferencia de perl -E''lo habitual) (tuve que incluir la nueva línea final para que sea válida UCS2)
$ perl -MEncode=from_to -e'$_="䁟㴨晬礬獰楤敲Ɫ楲搬捡琬摯朩㬤弽≔桥牥⁷慳渠潬搠污摹⁷桯Ⅵ搠愢㭦潲⠢∬∬桡琠睲䩡湤⁊慮搠橊楮獩摥敲∬∬ੈ潷扳畲搦∬∬浡杩湥⁴桡琦∬∬桡琠愠桯朦∩笤瀽④㬤挽␢桩晴䁟㬤琽⑰㼢卨攡敤⁴桥④⁴漠捡瑣栠瑨攤瀬ਤ琢㨢䤠摯渧琠歮潷⁷桹桥Ⅵ搠瑨慴④Ⰺ健牨慰猠獨攧汬楥⸊ਤ弢㬤弮㴢④⸊⑴∻猯☯⁴漡④⽽猯ℯ睡汬潷⽧㭳⽊⽩杧汥搠⽧㭳慹∤张桯牳攬桥楥搠潦潵牳攮∊";from_to($_,utf8,ucs2);eval'
Una buena cosa era mucho golf antes de recurrir a Unicode, o no sería muy divertido.
Editar: no puedo encontrar una manera de copiar / pegar la versión de 234 caracteres en este navegador, así que dejo la versión de 235 caracteres. Arreglará esta noche, cuando tenga en mis manos un portapapeles real compatible con UTF8. encontre una forma. Casi a prueba de ideonas.