12 días de Navidad

17

Pensé que este sería un desafío divertido para todos y tengo curiosidad por ver las soluciones que se les ocurren.

Imprimir la letra de "12 Days Of Christmas"

On the first day of Christmas, 
my true love gave to me,
A partridge in a pear tree. 

On the second day of Christmas, 
my true love gave to me,
Two turtle doves, 
And a partridge in a pear tree. 

...

On the twelfth day of Christmas,
My true love gave to me,
Twelve drummers drumming,
Eleven pipers piping,
Ten lords-a-leaping,
Nine ladies dancing,
Eight maids-a-milking,
Seven swans-a-swimming,
Six geese-a-laying,
Five golden rings,
Four calling birds,
Three french hens,
Two turtle doves,
And a partridge in a pear tree.

Reglas

  • No tiene que preocuparse por la capitalización; todo el texto puede ser insensible a mayúsculas y minúsculas
  • Puede ignorar sensatamente cualquier puntuación: los guiones pueden ser espacios, y las comas y los puntos pueden ignorarse
  • Debe haber una línea en blanco entre cada verso
  • Debe ordenar sus números: " primer día de Navidad", " Cuatro pájaros voladores ", etc.
macek
fuente
3
¿Puede proporcionar la versión completa de cada línea? Estoy acostumbrado a "mi verdadero amor me dio " y el uso de diferentes versiones podría afectar las soluciones.
Matthew leyó el
Letras completas actualizadas.
macek
¿Es un "no se pueden colocar mayúsculas de las oraciones" o un "todo el texto no distingue entre mayúsculas y minúsculas" para no preocuparse por las mayúsculas?
JB
Además, en la línea de ignorar la puntuación, ¿podemos intercambiar la puntuación por espacios en blanco (y recíprocamente)?
JB
1
@macek: mejor, pero el lado latente de mi pregunta fue: ¿puedo imprimir guiones en lugar de espacios también?
JB

Respuestas:

23

Brainfuck - 2,974

Estoy bastante orgulloso de este. Eso suena como un número bastante grande, pero tenga en cuenta que no utilicé ninguna biblioteca de compresión externa, y ninguno de los textos originales está en mi programa en ninguna parte. Ninguna de las otras presentaciones puede decir eso. Todo esto está codificado a mano. Los generadores de texto más ingenuos dan más de 39k para este texto, por lo que diría que esta es una mejora significativa.

>--[<->+++++]<---[>+>+>+>+>+<<<<<-]++++++++++>>[+++++>]<<<[+++++>]<<[+
++++>]<+++++>>++++[<++++++++>-]++++++++++++>+>+>>>>>>>>>>>>>+<<<<<<<<<
<<<<<<[<<<<++.-.->>>.<<++.--<<.<++.-->>>>>.>>>>>>>>>>>>>>[<<<<<<<<<<<<
<<<<++.>.<<<<++.-->>-.+<--.++>>.--<<.>>>>.>>>>>>>>>>>>>>-]<[<<<<<<<<<<
<<<<<<<<++.>>-.<<.>>>>-.+<<<<.-->>++.>++.--<<.>->>>.>>>>>>>>>>>>>>+<-]
<[<<<<<<<<<<<<<<++.<<<++.-->>+.->.--<<.>>>>.>>>>>>>>>>>>>+<-]<[<<<<<<<
<<<<<<<+.<+.>.->++.--<<-.>>>>.>>>>>>>>>>>>+<-]<[<<<<<<<<<<<<<<<++.-->+
.--.+.>>++.--<<.>>>>.>>>>>>>>>>>+<-]<[<<<<<<<<<<<+.<<<++.>>>>-.+<<<<.-
->>+.->+.--<<.>>>>.>>>>>>>>>>+<-]<[<<<<<<<<<<+.<<+.>>>+.-<+.--<<-.>>>>
.>>>>>>>>>+<-]<[<<<<<<<<<<<--.+++.---.>>++.--<<++.>>>>.>>>>>>>>+<-]<[<
<<<<<<<<<--.>++.-->>--.++<.++.--<<++.>>>>.>>>>>>>+<-]<[<<<<<<<++.<<.+.
->>--.<<<+.->>>>>.>>>>>>+<-]<[<<<<<<+.-<<<++.--.>>++.-.-<<+.->>>>>.>>>
>>+<-]<[<<<<<<<--.+++.->>.+.+.-->>.>>>>+<-]<<<<<<<<+.---.>>>>++.>.<<<+
+.<--.>>>>.<<<<<++.>++.>>.<<+.>>+.+.<--.<<--.>>>-.>>.<<<.>>.>.<<+.--.>
----.<<<<++++.>>>>>.<<<-.+++.>>+.<<<<.>>>>>.<<<<--.<----.>>>>.<<<<++++
.>>>>>.<<++.<.>>>.<<<--.<<.>>>>>.<<<<<-->+>>-->+>>>>>>>>>>>>>>>>>>>>>>
>>>>>>[<<<<<<<<<<<<<<<<<<<<<<<<<<<<<++.>.<<<<++.>>-.>>-.<<<<.->>>>>.<<
<<<.>>>--.>-.<<+..<<+.>>>.+.>>.<<<<<-.->>>-.>.<<..<+.>+.-<--.+>>>++>.>
>>>>>>>>>>>>>>>>>>>>>>>>>>-]<[<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<++.>>-.<<
.>>>>-.+<<<<.>>++.>>>.<<--.<<+.>>.<<<.-->>>++.+.>>.<<---.<<.>>.++<<.>.
-<--.+>>>>.>>>>>>>>>>>>>>>>>>>>>>>>>>-]<[<<<<<<<<<<<<<<<<<<<<<<<<<<<++
.<<<++.>>+.>>>.<<<--.+++.>--.<<<-.>>>+.>>.<<<<<---.>>>>>.<<<---.<<++++
.----.++>>>---.++<<+.>++.-<--.+>>>>.>>>>>>>>>>>>>>>>>>>>>>>>>-]<[<<<<<
<<<<<<<<<<<<<<<<<<<<<<+.<+.>.<<++.>>>>>.<<<--.<<----.+++.>.<+.>>>+.->>
.<<<<<-.---.>>++.<<++.>.>.-<--.+>>>>.>>>>>>>>>>>>>>>>>>>>>>>>-]<[<<<<<
<<<<<<<<<<<<<<<<<<<<<<<++.>+.--.+.>>++.>>.<<<.<<----.>+.<+++.>>>-.->>.
<<<<<---.++>>>>>.<<<.<.>-.-.<.>+++.-<--.+>>>>.>>>>>>>>>>>>>>>>>>>>>>>-
]<[<<<<<<<<<<<<<<<<<<<<<<<<+.<<<++.>>>>-.<<<<.>>+.>>>.<<.>+.<<<<----.>
>.>.>>.<<<<<.++>>>>>.<<.->.<<<+.>-..<.>+.-<--.+>>>>.>>>>>>>>>>>>>>>>>>
>>>>-]<[<<<<<<<<<<<<<<<<<<<<<<<+.<<+.>>>+.>.<<<<--.<++..>>>.-<<<.>>>>>
.<<<<<----.>>>>>.<<<-.<<.++>>>>+.--<<<++.>++.-<--.+>>>>.>>>>>>>>>>>>>>
>>>>>>>-]<[<<<<<<<<<<<<<<<<<<<<<<<<--.+++.>>>-.+<<<<++.>>>>>.<<<<--.>+
+.---.<<-.+.-->>++.>>>.<<.<<++.>.-<--.+>>+.->>.>>>>>>>>>>>>>>>>>>>>-]<
[<<<<<<<<<<<<<<<<<<<<<<<--.>++.>>--.++<.>>.<<<<<.--.>>---..<+++.>++.-<
--.>>>>.<<<<<+.>++.->>.<<<++.->>>+.->>.>>>>>>>>>>>>>>>>>>>-]<[<<<<<<<<
<<<<<<<<<<<<++.<<.>>--.<<<++..>>>>>.<<<<--.>>.<<<.>>+.<<--.>++.>>>>.<<
<<.<++.-->>.->+.->>.>>>>>>>>>>>>>>>>>>-]<[<<<<<<<<<<<<<<<<<<<++.>.<<++
.>>>.<<.>--.<--.++.<---.<<++.>>>>>.<<<<<-.>>+++.>>+.<<<<+.>>>-.>>.<<<<
<----.>>-.-<<+++.->>>->+>.>>>>>>>>>>>>>>>>>-]<[<<<<<<<<<<<<<<<<<<<<<--
.>>>>>.<<--.<<<.>>>++.++.--.<<+.<+++.>--.<+.>>>>>.<<<<++.>+.>>>.<<<<<-
---.>>>>>.<<<++.<<++++.----.>>>.>>.<<++.--.<<<++++..>>>>>.<<<<<-->->--
->>>>>>>>>>>>>>>>>>>-]<<<<<<<<<<<<<<<<<<<<<<..>>>>>>>->+[>+>>>>>>>>>>>
>>[>]+[<]<<<<<<<<<<<<<-]>[<+>-]<<]

Desafortunadamente, esto es aproximadamente 600 caracteres más largo que su propia salida, pero lo que sea. Mantiene los caracteres c, h, m, r, w en una matriz y los usa para imprimir todo el texto. Dos matrices a la derecha de doce espacios cada una registran en qué día estamos para el recuento y qué elementos podemos generar. Es posible que pueda optimizarlo un poco reorganizando el mapa de memoria para colocar los caracteres de impresión entre las dos matrices de conteo para evitar cadenas tan largas de <<<<<<<y >>>>>>, pero eso sería mucho trabajo en este momento. Probablemente también podría elegir algunos mejores caracteres semilla con análisis de frecuencia para minimizar el incremento / decremento, pero lo que sea.

Esto depende de que las celdas de ajuste de 8 bits funcionen correctamente.

Sin golf:

>--[<->+++++]<---

[>+>+>+>+>+<<<<<-]++++++++++
>>[+++++>]<<<[+++++>]<<[+++++>]<+++++>>
++++[<++++++++>-]
++++++++++++>+>+>>>>>>>>>>>>>+<<<<<<<<<<<<<<<
[ 
   <<<<++o.-n.->>>.<<++t.--<<h.<++e.-->>>>>.    
   >>>>>>>>>>>>>>
   12[<<<<<<<<<<<<<<<<++t.>w.<<<<++e.-->>-l.+<--f.++>>t.--<<h.>>>>.>>>>>>>>>>>>>>-]
   11<[<<<<<<<<<<<<<<<<<<++e.>>-l.<<e.>>>>-v.+<<<<e.-->>++n.>++t.--<<h.>->>>.>>>>>>>>>>>>>>+<-]
   10<[<<<<<<<<<<<<<<++t.<<<++e.-->>+n.->t.--<<h.>>>>.>>>>>>>>>>>>>+<-]
   9<[<<<<<<<<<<<< <<+n.<+i.>n.->++t.--<<-h.>>>> . >>>>>>>>>>>>+<-]
   8<[<<<<<<<<<<< <<<<++e.-->+i.--g.+h.>>++t.--<<h.>>>> . >>>>>>>>>>>+<-]
   7<[<<<<<<<<<< <+s.<<<++e.>>>>-v.+<<<<e.-->>+n.->+t.--<<h.>>>> . >>>>>>>>>>+<-]
   6<[<<<<<<<<< <+s.<<+i.>>>+x.-<+t.--<<-h.>>>> . >>>>>>>>>+<-]
   5<[<<<<<<<< <<<--f.+++i.---f.>>++t.--<<++h.>>>>. >>>>>>>>+<-]
   4<[<<<<<<< <<<--f.>++o.-->>--u.++<r.++t.--<<++h.>>>> . >>>>>>>+<-]
   3<[<<<<<< <++t.<<h.+i.->>--r.<<<+d.->>>>>.>>>>>>+<-]
   2<[<<<<<<+s.-<<<++e.--c.>>++o.-n.-<<+d.->>>>>.>>>>>+<-]
   1<[<<<<<<<--f.+++i.->>r.+s.+t.-->>.>>>>+<-]
   <<<<<<<<+d.---a.>>>>++y.>_.<<<++o.<--f.>>>>_.<<<<<++c.>++h.>>r.<<+i.>>+s.+t.
   <--m.<<--a.>>>-s.>>_.<<<m.>>y.>_.<<+t.--r.>----u.<<<<++++e.>>>>>_.
   <<<-l.+++o.>>+v.<<<<e.>>>>>_.   
   <<<<--g.<----a.>>>>v.<<<<++++e.>>>>>.
   <<++t.<o.>>>.
   <<<--m.<<e.>>>>>.
   <<<<<-->+>>-->+
   >>>>>>>>>>>>>>>>>>>>>>>>>>>>
   12[<<<<<<<<<<<<<<<<<<<<<<<<<<<<<++t.>w.<<<<++e.>>-l.>>-v.<<<<e.->>>>>.
   <<<<<d.>>>--r.>-u.<<+m.m.<<+e.>>>r.+s.>>.<<<<<-d.->>>-r.>u.<<m.m.<+i.>+n.-<--g.+>>>++>.
   >>>>>>>>>>>>>>>>>>>>>>>>>>>-]
   11<[<<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<++e.>>-l.<<e.>>>>-v.+<<<<e.>>++n.>>>.
   <<--p.<<+i.>>p.<<<e.-->>>++r.+s.>>.<<---p.<<i.>>p.++<<i.>n.-<--g.+>>>>.>>>>>>>>>>>>>>>>>>>>>>>>>>-]
   10<[<<<<<<<<<<<<<<<<<<<<<<<<<< <++t.<<<++e.>>+n.>>> .<<<--
   .+++o.>--r.<<<-d.>>>+s.>>.<<<<<---a.>>>>>.<<<---l.<<++++e.----a.++>>>---p.++<<+
   i.>++n.-<--g.+>>>> .    >>>>>>>>>>>>>>>>>>>>>>>>>-]
   9< [<<<<<<<<<<<<<<<<<<<<<<<<< <<+n.<+i.>n.<<++e.>>>>> .<<<--l.<<----a.+++d.>
   i.<+e.>>>+s.->> .<<<<<-d.---a.>>++n.<<++c.>i.>n.-<--g.+>>>> . >>>>>>>>>>>>>>>>>>>>>>>>-]
   8< [<<<<<<<<<<<<<<<<<<<<<<<< <<<<++e.>+i.--g.+h.>>++t.>> .<<<m.<<----a.>+
   i.<+++d.>>>-s.->> .<<<<<---a.++>>>>> .<<<m.<i.>-l.-k.<i.>+++n.-<--g.+>>>> . >>>>>>>>>>>>>>>>>>>>>>>-]
   7< [<<<<<<<<<<<<<<<<<<<<<<< <+s.<<<++e.>>>>-v.<<<<e.>>+n.>>> .<<s.>+w.<<<<
   ----a.>>n.>s.>> .<<<<<a.++>>>>> .<<s.->w.<<<+i.>-m.m.<i.>+n.-<--g.+>>>>.  >>>>>>>>>>>>>>>>>>>>>>-]
   6< [<<<<<<<<<<<<<<<<<<<<<< <+s.<<+i.>>>+x.> .<<<<--g.<++e.e.>>>s.-<<<e.>>>>> 
   .<<<<<----a.>>>>> .<<<-l.<<a.++>>>>+y.--<<<++i.>++n.-<--g.+>>>> .  >>>>>>>>>>>>>>>>>>>>>-]
   5< [<<<<<<<<<<<<<<<<<<<<< <<<--f.+++i.>>>-v.+<<<<++e.>>>>> .<<<<--g.>++o.---
   l.<<-d.+e.-->>++n.>>> .<<r.<<++i.>n.-<--g.+>>+s.->> .   >>>>>>>>>>>>>>>>>>>>-]
   4< [<<<<<<<<<<<<<<<<<<<< <<<--f.>++o.>>--u.++<r.>> .<<<<<c.--a.>>---l.l.<+++
   i.>++n.-<--g.>>>> .<<<<<+b.>++i.->>r.<<<++d.->>>+s.->> .  >>>>>>>>>>>>>>>>>>>-]
   3< [<<<<<<<<<<<<<<<<<<< <++t.<<h.>>--r.<<<++e.e.>>>>> .<<<<--f.>>r.<<<e.>>+
   n.<<--c.>++h.>>>> .<<<<h.<++e.-->>n.->+s.->> .    >>>>>>>>>>>>>>>>>>-]
   2< [<<<<<<<<<<<<<<<<<<<++t.>w.<<++o.>>>.<<t.>--u.<--r.++t.<---l.<<++e.>>>>>.
   <<<<<-d.>>+++0.>>+v.<<<<+e.>>>-s.>>.<<<<<----a.>>-n.-<<+++d.->>>->+>.
   >>>>>>>>>>>>>>>>>-] 
   1<[<<<<<<<<<<<<<<<<<<<<<--a.>>>>>.<<p--.<<<a.>>>++r.++t.--r.<<+i.<+++d.>--g.<+
   e.>>>>>.<<<<++i.>+n.>>>.<<<<<----a.>>>>>.<<<++p.<<++++e.----a.>>>r.>>.<<++
   t.--r.<<<++++e..>>>>>.<<<<<-->->--->>>>>>>>>>>>>>>>>>>-]
   <<<<<<<<<<<<<<<<<<<<<<..>>>>>>>->+
   [>+>>>>>>>>>>>>>[>]+[<]<<<<<<<<<<<<<-]>[<+>-]<<
]
captncraig
fuente
1
Yo toleraría comentarios en línea sobre envíos de ese tamaño (sin contar para el puntaje de golf). Hice +1 de todos modos.
JB
Cosa segura. Se agregó una versión sin golf. Para los números de día, solo se establece un bit de doce, y después de la salida se establece el bit de los días siguientes. Para los elementos, la siguiente línea de la última establece n bits en una fila alta y todos los activos obtienen salida.
captncraig
10

Perl, 438 291 caracteres

Inspirado por el uso de Jeff Burdges de la compresión DEFLATE , el código rubí comprimido de Ventero y el uso de JB de Lingua :: EN :: Numbers , logré comprimir mi entrada a 291 caracteres (bueno, bytes) incluyendo el código de descompresión. Como el programa contiene algunos caracteres no imprimibles, lo he proporcionado en formato MIME Base64 :

dXNlIENvbXByZXNzOjpabGliO2V2YWwgdW5jb21wcmVzcyAneNolkMFqAkEMhu8+RVgELdaIXmXB
S2/FFyhF4k7cHTqTsclMZd++M3pJvo+QH5JiDJ9exkKrj/PqXOKV1bod77qj9b2UeGBZ7w/bpd9s
3rCDruf3uWtwS3qS/vfROy0xsho+oWbB3d+b19YsJHWGhIHp5eQ8GzqSoWkk/xxHH36a24OkuT38
K21kNm77ND81BceCWtlgoBAq4NWrM7gpyzDhxGKQi+bA6NIfG5K4/mg0d0kgTwwdvi67JHVeKKyX
l3acoxnSDYZJveVIBnGGrIUh1BQYqZacIDKc5Gvpt1vEk3wT3EmzejcyeIGqTApZmRftR7BH3B8W
/5Aze7In

Para descodificar el programa, puede usar el siguiente script de Perl auxiliar:

use MIME::Base64;
print decode_base64 $_ while <>;

Guarde la salida en un archivo llamado 12days.ply ejecútelo perl -M5.01 12days.pl. Como se señaló, debe tener el módulo Lingua :: EN :: Numbers instalado para que el código funcione.

En caso de que se pregunte, la parte legible del código simplemente se ve así:

use Compress::Zlib;eval uncompress '...'

donde ...representa 254 bytes de código Perl comprimido RFC 1950 . Sin comprimir, el código tiene 361 caracteres de longitud y se ve así:

use Lingua'EN'Numbers"/e/";s==num2en(12-$i++)." "=e,y"." "for@n=qw=drummers.drumming pipers.piping lords.a.leaping ladies.dancing maids.a.milking swans.a.swimming geese.a.laying golden.rings calling.birds french.hens turtle.doves.and=;say"on the ".num2en_ordinal($_)." day of christmas my true love gave to me @n[$i--..@n]a partridge in a pear tree
"for 1..12

Escribir este código fue un tipo extraño de ejercicio de golf: resulta que maximizar la repetición y minimizar el número de caracteres distintos utilizados es mucho más importante que minimizar el recuento de caracteres sin procesar cuando la métrica relevante es el tamaño después de la compresión .

Para exprimir los últimos caracteres, escribí un programa simple para probar pequeñas variaciones de este código para encontrar el que mejor se comprime. Para la compresión, utilicé la utilidad KZIP de Ken Silverman , que generalmente produce mejores raciones de compresión (a costa de la velocidad) que el Zlib estándar, incluso con la configuración de compresión máxima. Por supuesto, dado que KZIP solo crea archivos ZIP, luego tuve que extraer el flujo DEFLATE sin procesar del archivo y envolverlo en un encabezado y suma de verificación RFC 1950. Aquí está el código que usé para eso:

use Compress::Zlib;
use 5.010;

@c = qw(e i n s);
@q = qw( " );
@p = qw( = @ ; , );
@n = ('\n',"\n");

$best = 999;

for$A(qw(e n .)){ for$B(@q){ for$C(@q,@p){ for$D(@p){ for$E(@q,@p){ for$F(qw(- _ . N E)){ for$G("-","-"eq$F?():$F){ for$H(@c){ for$I(@c,@p){ for$N(@n){ for$X(11,"\@$I"){ for$Y('$"','" "',$F=~/\w/?$F:()){ for$Z('".num2en_ordinal($_)."'){
    $M="Lingua'EN'Numbers";
    $code = q!use MB/A/B;sDDnum2en(12-$H++).YDe,yCFC Cfor@I=qwEdrummersFdrumming pipersFpiping lordsGaGleaping ladiesFdancing maidsGaGmilking swansGaGswimming geeseGaGlaying goldenFrings callingFbirds frenchFhens turtleFdovesFandE;say"on the Z day of christmas my true love gave to me @I[$H--..X]a partridge in a pear treeN"for 1..12!.$/;
    $code =~ s/[A-Z]/${$&}/g;

    open PL, ">12days.pl" and print PL $code and close PL or die $!;
    $output = `kzipmix-20091108-linux/kzip -b0 -y 12days.pl.zip 12days.pl`;
    ($len) = ($output =~ /KSflating\s+(\d\d\d)/) or die $output;

    open ZIP, "<12days.pl.zip" and $zip = join("", <ZIP>) and close ZIP or die $!;
    ($dfl) = ($zip =~ /12days\.pl(.{$len})/s) or die "Z $len: $code";

    $dfl = "x\xDA$dfl" . pack N, adler32($code);
    $dfl =~ s/\\(?=[\\'])|'/\\$&/g;

    next if $best <= length $dfl;
    $best = length $dfl;
    $bestcode = $code;
    warn "$A$B$C$D$E$F$G$H$I $X $Y $best: $bestcode\n";

    open PL, ">12days_best.pl" and print PL "use Compress::Zlib;eval uncompress '$dfl'" and close PL or die $!;

}}}}}}
    print STDERR "$A$B$C$D$E$F\r";
}}}}}}}

Si esto parece un horrible kluge, es porque eso es exactamente lo que es.


Por interés histórico, aquí está mi solución original de 438 caracteres, que genera una salida más agradable, incluidos los saltos de línea y la puntuación:

y/_/ /,s/G/ing/for@l=qw(twelve_drummers_drummG eleven_pipers_pipG ten_lords-a-leapG nine_ladies_dancG eight_maids-a-milkG seven_swans-a-swimmG six_geese-a-layG five_golden_rGs four_callG_birds three_french_hens two_turtle_doves);s/e?t? .*/th/,s/vt/ft/for@n=@l;@n[9..11]=qw(third second first);say map("\u$_,\n","\nOn the $n[11-$_] day of Christmas,\nMy true love gave to me",@l[-$_..-1]),$_?"And a":A," partridge in a pear tree."for 0..11

Lo más destacado de esta versión es el par de expresiones regulares s/e?t? .*/th/,s/vt/ft/, que construyen los ordinales para 4 a 12 a partir de los cardenales al comienzo de las líneas de regalo.

Este código, por supuesto, también se puede comprimir usando el truco de Zlib descrito anteriormente, pero resulta que simplemente comprimir la salida es más eficiente, produciendo el siguiente programa de 338 bytes (en formato Base64, nuevamente):

dXNlIENvbXByZXNzOjpabGliO3NheSB1bmNvbXByZXNzICd42uWTwU7DMAyG730KP8DGOyA0bsCB
vYBp3MYicSo7W9e3xx3ijCIQDHZIUjn683+/k3ZPAjUSDKxWIeACZYC7qGw1o226hwWqHghSORKM
6FMtkGnT3cKEWpXDSMACCBOhQlWim+7jUKO+SGg5dT8XqAetiSD4nrmPBMDPvXywtllF18OgJH2E
SGJfcR+Ky2KL/b0roMeUWEZ4cXb7biQeGol4LZQUSECdyn4A0vjUBvnMXCcYiYy2uE24ONcvgdOR
pBF9lYDNKObwNnPOTnc5kYjH2JZotyogI4c1Ueb06myXH1S48eYeWbyKgclcJr2D/dnwtfXZ7km8
qOeUiXBysP/VEUrt//LurIGJXCdSWxeHu4JW1ZnS0Ph8XOKloIecSe39w/murYdvbRU+Qyc=

También tengo un archivo gzip de 312 bytes de la letra, construido a partir de la misma secuencia DEFLATE. Supongo que podrías llamarlo un "script zcat". :)

Ilmari Karonen
fuente
Parece que se puede sustituir ringscon rGsal ahorro 2 caracteres
Macek
@macek: en mi versión original no pude, porque estaba reemplazando Gcon ing,, pero resulta que agregar las comas más tarde es realmente más corto. ¡Gracias!
Ilmari Karonen
¿Cómo se evita el error 'modificación de un valor de solo lectura'?
Jeff Burdges
@JeffBurdges: ¿En la versión original? Al asignar las cadenas a una matriz primero.
Ilmari Karonen
"Se intentó modificar un valor de solo lectura en /opt/local/lib/perl5/5.12.3/Compress/Zlib.pm línea 357." Evité este problema asignando $_en mi actualización a continuación.
Jeff Burdges
10

Lisp común, 333 363

(dotimes(n 12)(format t"on-the-~:R-day-of-christmas
my-true-love-gave-to-me
~v*~@{~R-~A
~#[and-~]~}a-PARTRIDGE-IN-A-PEAR-TREE

"(1+ n)(- 22 n n)12'drummers-drumming 11'pipers-piping 10'lords-a-leaping 9'ladies-dancing 8'maids-a-milking 7'swans-a-swimming 6'geese-a-laying 5'golden-rings 4'calling-birds 3'french-hens 2'turtle-doves))

Las funciones integradas para formatear ordinales son útiles, pero la mayor parte de la compresión proviene de poder usar la misma lista de argumentos una y otra vez, omitiendo cada vez menos argumentos en cada ejecución.

Según lo demostrado por coredump en los comentarios, las instalaciones integradas todavía se pueden aprovechar para los cardenales.

JB
fuente
Tal vez podría comprimir un poco más dado que las líneas comienzan con "doce", "once", "diez", ...
coredump
Tal vez lo es. Cual es tu sugerencia?
JB
1
Primero esperé que se pudiera usar el número restante de argumentos, pero leí las especificaciones y no puedo hacerlo. Los cortos que tengo son 333 caracteres:(dotimes(n 12)(format t"on-the-~:R-day-of-christmas my-true-love-gave-to-me ~v*~@{~R-~A ~#[AND-~]~}A-PARTRIDGE-IN-A-PEAR-TREE "(1+ n)(- 22 n n)12'drummers-drumming 11'pipers-piping 10'lords-a-leaping 9'ladies-dancing 8'maids-a-milking 7'swans-a-swimming 6'geese-a-laying 5'golden-rings 4'calling-birds 3'french-hens 2'turtle-doves))
coredump
Ahora estamos hablando. Mi sueño hubiera sido compartir el contador de saltos con el ordinal, pero no he encontrado una manera corta de hacerlo.
JB
7

JavaScript 570

Esta es mi primera vez jugando al golf. JavaScript 570

var l=["first","second","third","fourth","fifth","sixth","seventh","eigth","nineth","tenth","eleventh","twelth","Two turtle doves","Three french hens","Four calling birds","Five golden rings","Six geese-a-laying","Seven swans-a-swimming","Eight maids-a-milking","Nine ladies dancing","Ten lords-a-leaping","Eleven pipers piping","Twelve drummers drumming"];var b = "<br/>";for(var i=0;i<12;i++){var p="On the "+l[i]+"day of Christmas"+b+"My true love gave to me"+b;for(var x=i;x>0;x--)p+=l[13+x]+b;if(i>0)p+="and ";p+="a partridge in a pear tree"+b+b;document.write(p);}
Silabsoft
fuente
6

Python 2.7 (465)

for k in range(12):
 print'On the %s day of Christmas\nMy true love gave to me'%'first^second^third^fourth^fifth^sixth^seventh^eighth^ninth^tenth^eleventh^twelfth'.split('^')[k]
 print'\n'.join('Twelve drummers drumm*Eleven pipers pip*Ten lords-a-leap*Nine ladies danc*Eight maids-a-milk*Seven swans-a-swimm*Six geese-a-lay*Five golden rings^Four calling birds^Three french hens^Two turtle doves and^a partridge in a pear tree^'.replace('*','ing^').split('^')[11-k:])

Sin embargo, puse el 'y' en la misma línea que las palomas en lugar de la perdiz.

Daan
fuente
1
Cometiste el mismo error de ortografía que yo: es "duodécimo"
Andrew Shepherd
Bueno, eso me ahorra otro personaje entonces ... ¡Gracias!
Daan
5

Rubí (474)

(0..11).each{|i|puts "On the #{"first^second^third^fourth^fifth^sixth^seventh^eighth^ninth^tenth^eleventh^twelfth".split("^")[i]} day of Christmas\nMy true love gave to me";puts "a partridge in a pear tree\n\n^two turtle doves and^three french hens^four calling birds^five golden rings^six geese-a-lay*Seven swans-a-swimm*Eight maids-a-milk*Nine ladies danc*Ten lords-a-leap*Eleven pipers pip*Twelve drummers drumming".gsub('*','ing^').split('^')[0..i].reverse.join("\n")}

o en una forma más legible (486):

(0..11).each do |i|
    puts "On the #{"first^second^third^fourth^fifth^sixth^seventh^eighth^ninth^tenth^eleventh^twelfth".split("^")[i]} day of Christmas\nMy true love gave to me"
    puts "a partridge in a pear tree\n\n^two turtle doves and^three french hens^four calling birds^five golden rings^six geese-a-lay*Seven swans-a-swimm*Eight maids-a-milk*Nine ladies danc*Ten lords-a-leap*Eleven pipers pip*Twelve drummers drumming".gsub('*','ing^').split('^')[0..i].reverse.join("\n")
end

Alguien tiene una idea de cómo sortear el .reverse? no pude encontrar una solución

kev
fuente
Me gusta tu truco con * para representar "ing". Debería poder reducirlo a aproximadamente 440 mediante: use en 12.timeslugar de (0..11).each; hacer un solo pone con dos argumentos en lugar de dos pone con un argumento; use la notación% w () para la matriz de días de Navidad. Finalmente, puede deshacerse del reverso invirtiendo la lista, agregando un ^ adicional al final de la cadena y luego usando en [-i..-1]lugar de [0..i].
Wayne Conrad
¿no podrías cambiar "drumming" a "drumm *"?
undergroundmonorail
5

Perl, 500 485

@s=(first,second,third,fourth,fifth,sixth,seventh,eighth,ninth,tenth,eleventh,twelfth);
$;=ing;
@a=(
"Twelve drummers drumm$;",
"Eleven pipers pip$;",
"Ten lords-a-leap$;",
"Nine ladies danc$;",
"Eight maids-a-milk$;",
"Seven swans-a-swimm$;",
"Six geese-a-lay$;",
"Five golden r$;s",
"Four call$; birds",
"Three french hens",
"Two turtle doves\nAnd "
);
for(0..11){
print"\n\nOn the $s[$_] day of Christmas\nMy true love gave to me\n";
$"=$/;
print"@b";
unshift@b,pop@a;
print"A partridge in a pear tree"
}

Este es mi primer intento, y estoy seguro de que podría hacerse mucho más corto. Los saltos de línea son para facilitar la lectura. Tiene tres conjuntos importantes, uno de los cuales contiene el nombre de cada día @s, uno de los cuales enumera todos los regalos (excepto el primero) @a, y uno que enumera los regalos que ya se han dado @b. El mecanismo principal es que cada día, imprime @by luego transfiere un regalo adicional de @aa @b.

Gracias a Andrew por 500-> 485

PhiNotPi
fuente
puede reemplazar ringscon r$1spara guardar 1 char más
macek
@macek No puedo hacer eso porque Perl interpretará sque es parte del nombre de la variable, y la variable $isno existe. (En realidad son i's en lugar de unos, por cierto)
PhiNotPi
eigth->eighth
Mateo leyó el
Podrías reemplazarlo $i, por ejemplo, $;para evitar eso. Nadie lo usa $;para su propósito previsto de todos modos.
Ilmari Karonen
@IlmariKaronen Seguí tu consejo, pero arreglé un error tipográfico, por lo que el recuento de caracteres se mantuvo igual.
PhiNotPi
5

Vim - 578 pulsaciones de teclas

Decidí probar y jugar vim-golf, ya que este es el tipo de cosas que se pueden jugar vim-golf.

Comience por insertar el marco: la línea "X día de Navidad" un total de 12 veces (89 pulsaciones de teclas):

                                         KS   TL   GT
12iOn the X day of Christmas,<Enter>     30   30   30
my true love gave to me,<Enter>          25   55   55
and a partridge in a pear tree.<Enter>   32   87   87
<Enter><Esc>                              2   89   89

Luego, realice una serie de macros que insertarán los números del 2 al 12 en los lugares respectivos que deben estar para la letra (172 pulsaciones de teclas):

                                      KS   TL   GT
42kqmO2<Esc>9/a<Enter>q10@m           17   17  106
dw                                     2   19  108
6jqm/2<Enter>O3<Esc>jq9@m             14   33  122
/3<Enter>qm/3<Enter>O4<Esc>jq8@m      16   49  138
/4<Enter>qm/4<Enter>O5<Esc>jq7@m      16   65  154
/5<Enter>qm/5<Enter>O6<Esc>jq6@m      16   81  170
/6<Enter>qm/6<Enter>O7<Esc>jq5@m      16   97  186
/7<Enter>qm/7<Enter>O8<Esc>jq4@m      16  113  202
/8<Enter>qm/8<Enter>O9<Esc>jq3@m      16  129  218
/9<Enter>qm/9<Enter>O10<Esc>jq2@m     17  146  235
/10<Enter>qm/10<Enter>O11<Esc>jq@m    18  164  253
?11<Enter>O12<Esc>                     8  172  261

El "dw" en la segunda línea es deshacerse de la primera "y", porque no va allí.

Luego, realice una serie de sustituciones para la cantidad de cosas que le dio el verdadero amor (319 pulsaciones de teclas):

                                       KS   TL   GT
:%s/12/twelve drummers drumming,/g     34   34  295
:%s/11/eleven pipers piping,/g         30   64  325
:%s/10/ten lords-a-leaping,/g          29   93  354
:%s/9/nine ladies dancing,/g           28  117  382
:%s/8/eight maids-a-milking,/g         30  147  412
:%s/7/seven swans-a-swimming,/g        31  178  443
:%s/6/six geese-a-laying,/g            27  205  366
:%s/5/five golden rings,/g             26  231  392
:%s/4/four calling birds,/g            27  268  419
:%s/3/three french hens,/g             26  294  445
:%s/2/two turtle doves,/g              25  319  470

Y finalmente, reemplazando cada aparición de Xcon un número ordinal:

                         KS   TL   GT
/X<Enter>sfirst<Esc>     10   10  480
nssecond<Esc>             9   18  488
nsthird<Esc>              8   27  497
nsfourth<Esc>             9   36  506
nsfifth<Esc>              8   44  514
nssixth<Esc>              8   52  522
nsseventh<Esc>           10   62  532
nseighth<Esc>             9   71  541
nsninth<Esc>              8   79  549
nstenth<Esc>              8   87  557
nseleventh<Esc>          11   98  568
nstwelfth<Esc>           10  108  578

¡Y hemos terminado!


Estoy seguro de que hay otras optimizaciones que me perdí, pero creo que eso es bastante bueno para mí.

Joe Z.
fuente
Uh oh, olvidé las escapadas.
Joe Z.
Puede omitir el / g con las sustituciones, así::%s/2/two turtle doves,
therealfarfetchd
4

C (644)

El recuento no incluye espacios en blanco utilizados para la presentación.

#include <stdio.h>

void main() {
    char *e = "On the \0 day of Christmas my true love gave to me\0 Twelve drummers drumming Eleven pipers piping Ten lords-a-leaping Nine ladies dancing Eight maids-a-milking Seven swans-a-swimming Six geese-a-laying Five golden rings Four calling birds Three french hens Two turtle doves and A partridge in a pear tree\n\n";
    printf("%sfirst%s%s%ssecond%s%s%sthird%s%s%sfourth%s%s%sfifth%s%s%ssixth%s%s%sseventh%s%s%seighth%s%s%sninth%s%s%stenth%s%s%seleventh%s%s%stwelfth%s%s",
           e, e+8, e+276, e, e+8, e+255, e, e+8, e+237, e, e+8, e+218, e, e+8, e+200, e, e+8, e+181, e, e+8, e+158, e, e+8, e+136, e, e+8, e+116, e, e+8, e+96, e, e+8, e+75, e, e+8, e+50);
}

La salida es como:

On the first day of Christmas my true love gave to me A partridge in a pear tree

...

On the twelfth day of Christmas my true love gave to me Twelve drummers drumming Eleven pipers piping Ten lords-a-leaping Nine ladies dancing Eight maids-a-milking Seven swans-a-swimming Six geese-a-laying Five golden rings Four calling birds Three french hens Two turtle doves and A partridge in a pear tree
Matthew Read
fuente
4

Powershell, 487 453

0..11 | % {
   'On the {0} day of christmas my true love gave to me {1}`n'-f
   (
        'first^second^third^fourth^fifth^sixth^seventh^eighth^ninth^tenth^eleventh^twelfth'.Split('^')[$_],
        (
            'a partridge in a pear tree^two turtle doves and^three french hens^four calling birds^five golden rings^six geese-a-laying^Seven swans-a-swimming^Eight maids-a-milking^Nine ladies dancing^Ten lords-a-leaping^Eleven pipers piping^Twelve drummers drumming'.Split('^')[$_..0]-join' '
        )
    )
 }

Gracias a Daan por la idea de dividir una cadena concatenada.

Originalmente había incluido una declaración de cambio para obtener el "y" en la perdiz para todos menos el primer verso. Pero, debido a que la pregunta nos absuelve de la puntuación, simplemente podemos agregar el "y" a las palomas.

Esto da como resultado avances de línea de la siguiente manera:

On the first day of christmas my true love gave to me a partridge in a pear tree

On the second day of christmas my true love gave to me two turtle doves and a partridge in a pear tree

On the third day of christmas my true love gave to me three french hens two turtle doves and a partridge in a pear tree
Andrew Shepherd
fuente
Duodécimo, no duodécimo.
Joey Adams
@Joey Adams - Gracias por corregirme y darme un personaje menos :-)
Andrew Shepherd
4

Perl, 368389 (sin compresión / unicode)

use Lingua::EN::Numbers"/n/";@s=qw(A-partridge-in-a-pear-tree turtle-doves french-hens calling-birds golden-rings geese-a-laying swans-a-swimming maids-a-milking ladies-dancing lords-a-leaping pipers-piping drummers-drumming);$_=$s[0];for$m(1..12){$n=num2en_ordinal$m;say"On the $n day of christmas
my true love gave to me
$_
";s/A/and a/;$_=num2en($m+1)." $s[$m]
$_"}

Harnesses Lingua :: ES :: Números , aunque no estoy 100% convencido de que sea una buena idea cuando veo el módulo y las longitudes de sus nombres de identificadores. Necesita Perl 5.10 o posterior, ejecute desde la línea de comando con un -Einterruptor.

Editar: mejoras menores: deje de usar una matriz, mejor uso de $_espacios en blanco innecesarios.

JB
fuente
+1, genial! Alguien podría quejarse de usar un módulo no estándar, pero si permitimos el uso de cualquier lenguaje (incluidos los de propósito especial como GolfScript), no veo por qué "Perl + Lingua :: EN :: Numbers" no lo haría. Ser un lenguaje válido para una solución. Sin embargo, escribir un módulo "Acme :: 12Days" y enviarlo a CPAN probablemente sea una trampa. :)
Ilmari Karonen
@Ilmari Karonen cuando la gente se queja, generalmente cambio el nombre del idioma a "CPAN". No pasa a menudo.
JB
2
Ilmari, Golfscript no es un lenguaje de propósito especial.
Joey
2
Más como un lenguaje de propósito "accidentalmente general": D
JB
1
Querido señor, ¿por qué la gente ya no puede jugar su propio código?
JB
4

PowerShell, 440

-join('On the 1 day of Christmas
my true love gave to me
1a partridge in a pear tree

1first1second1third1fourth1fifth1sixth1seventh1eighth1ninth1tenth1eleventh1twelfth1Twelve drummers drumm7Eleven pipers pip7Ten lords-a-leap7Nine ladies danc7Eight maids-a-milk7Seven swans-a-swimm7Six geese-a-lay7Five golden rings
1Four calling birds
1Three french hens
1Two turtle doves
And '-replace7,'ing
1'-split1)[(26..15|%{0
29-$_
1
$_..26-le25
2})]

Esto imprime la letra como se da en la pregunta con varias líneas por verso. Podemos guardar algunos caracteres si ese requisito no está allí.

Joey
fuente
+1 mierda de Holey. Obtuviste esto trabajando con saltos de línea, así como el "Y" que aparece en la última línea.
Andrew Shepherd
Bueno, imprimir un texto diferente nunca fue una opción de todos modos, y la "Y" en la última línea usa el mismo truco como todos los demás. Aún así, quería preservar los saltos de línea que la otra solución no tiene (aunque también es más larga).
Joey
3

C # (528)

class P{static void Main(){for(int i=1;i<12;i++){Console.WriteLine("On the "+"^first^second^third^fourth^fifth^sixth^seventh^eighth^ninth^tenth^eleventh^twelfth".Split('^')[i]+" day of christmas my true love gave to me "+"a partridge in a pear tree^two turtle doves and^three french hens^four calling birds^five golden rings^six geese-a-laying^Seven swans-a-swimming^Eight maids-a-milking^Nine ladies dancing^Ten lords-a-leaping^Eleven pipers piping^Twelve drummers drumming".Split('^').Take(i).Aggregate("",(t,s)=>s+' '+t));}}}
kev
fuente
2

Java, 2062

Sé que esto fue publicado hace un tiempo, pero pensé que lo intentaría. Soy estudiante y todavía soy nuevo en esto, pero parece funcionar.

public class TwelveDaysOfChristmas 
{

    public static void main(String[] args) 
    {
        String[] days = new String[12];
        days[0] = "and a partriage in a pear tree.";
        days[1] = "Two turtle doves, ";
        days[2] = "Three french hens, ";
        days[3] = "Four callings birds, ";
        days[4] = "Five diamond rings, ";
        days[5] = "Six geese a-laying, ";
        days[6] = "Seven swans a-swimming, ";
        days[7] = "Eight maids a-milking, ";
        days[8] = "Nine ladies dancing, ";
        days[9] = "Ten lords a-leaping, ";
        days[10] = "Eleven pipers piping, ";
        days[11] = "Twelve twelve drummers drumming, ";


        System.out.println(chorus(0));
        System.out.println("a partriage in a pear tree");

        for(int i = 1; i<days.length; i++)
        {
            System.out.println(chorus(i));

            for(int x = i; x>=0; x--)
            {
                System.out.println(days[x]);
            }
            System.out.println();
        }
    }

    public static String chorus(int line)
    {
        String chorus = "On the " + getLine(line) + " day of Christmas my true " +
                "love gave to me, ";

        return chorus;
    }

    public static String getLine(int line)
    {
        int num = line;
        String result = "first";
        switch (num)
        {
        case 1:  result = "second";
                 break;
        case 2:  result = "third";
                 break;
        case 3:  result = "fourth";
                 break;
        case 4:  result = "fifth";
                 break;
        case 5:  result = "sixth";
                 break;
        case 6:  result = "seventh";
                 break;
        case 7:  result = "eighth";
                 break;
        case 8:  result = "ninth";
                 break;
        case 9: result = "tenth";
                 break;
        case 10: result = "eleventh";
                 break;
        case 11: result = "twelfth";
                 break;
        }

        return result;
    }

}
Gina
fuente
Hola Gina, ¡bienvenido al sitio!
Tynam
3
Felicidades por una primera solución; funciona bien. El concurso con el código de golf es el "código más corto posible", por lo que es estándar en este sitio hacer algunas cosas que nunca haría en código normal: cortar nombres de variables y funciones en un carácter, cortar espacios en blanco y algunas otras cosas. (Está bien, y se espera, incluir también la versión completa como lo hizo aquí para aclarar el enfoque). Una vez hecho eso, puede preguntarse: "¿cómo puedo acortar esto?"
Tynam
2

Swift, 577

import UIKit
let f=NSNumberFormatter()
f.numberStyle = .SpellOutStyle
for i in 0...11{
let w = split("first-second-third-four-fif-six-seven-eigh-nin-ten-eleven-twelf"){$0=="-"}[i]+(i<3 ?"":"th")
println("On the \(w) day of Christmas\nmy true love gave to me")
for m in reverse(0...i){
if m==0{break}
let v = split("turtle doves and*french hens*calling birds*golden rings*geese-a-lay*swans-a-swimm*maids-a-milk*ladies danc*lords-a-leap*pipers pip*drummers drumm"){$0=="*"}[m-1]+(m<5 ?"":"ing")
println("\(f.stringFromNumber(m+1)!) \(v)")}
println("a partridge in a pear tree.")}

Puedes pegar esto en un patio de recreo.

Intenté mover el vcomando de impresión y obtuve:

Playground execution failed: <EXPR>:20:1: error: expression was too complex to be solved in reasonable time; consider breaking up the expression into distinct sub-expressions
Krys Jurgowski
fuente
1

Ruby 1.9.3, comprimido, 321 caracteres

Dado que el código contiene caracteres no imprimibles, en su lugar publicaré un hexdump del código:

0000000: 2363 6f64 696e 673a 6269 6e61 7279 0a72  #coding:binary.r
0000010: 6571 7569 7265 277a 6c69 6227 3b65 7661  equire'zlib';eva
0000020: 6c20 5a6c 6962 2e69 6e66 6c61 7465 2778  l Zlib.inflate'x
0000030: da2d 90db 6ac3 300c 86ef f714 a163 b042  .-..j.0......c.B
0000040: 15e8 5ea7 f442 8be5 58cc 8720 39cd 42db  ..^..B..X.. 9.B.
0000050: 3dfb e4a4 3792 f559 c7ff fcd5 574e a4f7  =...7..Y....WN..
0000060: 073f a6b9 eaa1 64a8 81e0 fdfe b17c 7a16  .?....d......|z.
0000070: ad9d d250 b2eb 6a60 719d 2fb3 d4d0 79f6  ...P..j`q./...y.
0000080: 6695 7f9b a51b 65f3 c463 3097 b905 7547  f.....e..c0...uG
0000090: f1f5 5717 8a56 71bc f0f5 090e 5728 1e86  ..W..Vq.....W(..
00000a0: 20ac 35a1 bea5 15aa cc04 b1dc 0846 3453   .5..........F4S
00000b0: 0b24 3a9c 6c87 5669 c0c9 9c12 89ee 0fce  .$:.l.Vi........
00000c0: e3ab 374c 3c35 6cae 411b 6b5d c429 2044  ..7L<5l.A.k].) D
00000d0: c28d d942 d61a 1d93 5563 1eb6 e2b6 2b24  ...B....Uc....+$
00000e0: e42d 3371 fc69 74bb 0474 c1dc a82e bc4f  .-3q.it..t.....O
00000f0: b233 6124 526a 4d71 6dc8 73db b444 67f9  .3a$RjMqm.s..Dg.
0000100: 6240 3761 60c0 182d 826f 934a 4d31 2102  b@7a`..-.o.JM1!.
0000110: 2f94 8700 81b2 91a5 4035 01a3 1d64 b7da  /[email protected]..
0000120: 1413 1661 42a9 c26e 24e0 6c33 2642 3141  ...aB..n$.l3&B1A
0000130: 888e 973f ee7b 385f 4fd3 f31f be35 9d6f  ...?.{8_O....5.o
0000140: 27                                       '

Para crear el código real del hexdump, póngalo en un archivo y ejecútelo xxd -r hexdump > 12days.rb. Luego, la ejecución ruby1.9.3 12.days.rbejecutará el código e imprimirá la letra. Tenga en cuenta que este código requiere Ruby 1.9.3 (porque usa Zlib.inflate), por lo que no funcionará con Ruby 1.8.x, 1.9.1 y 1.9.2.

El código sin comprimir tiene 425 caracteres de longitud:

12.times{|i|puts"on-the-#{%w(first second third fourth fifth sixth seventh eighth ninth tenth eleventh twelfth)[i]}-day-of-christmas
my-true-love-gave-to-me",%w(twelve-drummers-drumming eleven-pipers-piping ten-lords-a-leaping nine-ladies-dancing eight-maids-a-milking seven-swans-a-swimming six-geese-a-laying five-golden-rings four-calling-birds three-french-hens two-turtle-doves-and a-partridge-in-a-pear-tree)[~i..-1],p}
Ventero
fuente
1

Perl, 319/313

Idea: descomprimir y evaluar la solución Lingua :: EN :: Numbers de JB.

Primero, pegue este bloque de texto en el comando perl -e 'use MIME::Base64; print decode_base64 $_ while <>;' >12days.pl. Luego, ejecuta el comando perl -M5.01 12days.pl.

dXNlIENvbXByZXNzOjpabGliOyRfPSd4nCWOwW7CMAyG730K
q8oBNIUOjq2QxmG3iT3AhJBpTBsRu12cgqpp776UXWx/v63/96QEH166Cev6/VjXx4kvFLWspCqb
N91/P1YHO2JM0buOrBeLdiSMNkUiSFNMgawb7qRwjSRtb3sShRZDyK724qNT6IbgSGzMSgYipewS
cM4M+kDRjPrwzIvA6N0isA+3hQM6T2odSvvEIT7XgXBcePRj/tfmtpCLE/PCzyEr68ac90a/Xk/N
dYiGV9vNZrtb/xjZy8Q7knP284LBcKM4l58CqVwnMAIOZxiu0PbRa2LUgmdIcaL8wZ2gw1zSAEyF
ORdlo9WhQnGA1RL4b70y/LJdb0rI+YZP+bD8Lf4A5ut+sic7ZXZhbCB1bmNvbXByZXNzJF87Cg==

El script en sí toma la forma use Compress::Zlib;$_='...';eval uncompress$_;donde ...está la solución 368 char de JB después de ser comprimido con este comando y escapar de a '.

perl -M5.01 -e 'use Compress::Zlib; $_ .= <> while !eof; say compress($_);' <12days_JB.pl

El guión de Ilmari se queja de modificar un valor de solo lectura sin los $_=...;caracteres adicionales , pero presumiblemente haría este 313 . Podrías guardar varios bytes más ajustando la compresión manualmente como lo hizo Ilmari antes, tal vez logrando 310 más o menos , pero no me molesté.


Perl, 376 (engañando a otra presentación) [mi presentación original]

Primero, cree un script perl llamado que 12days.plcontenga:

use IO::Uncompress::Inflate qw(inflate);inflate\*DATA=>'-';
__DATA__

A continuación, canalice la salida de cualquier otro envío 12days.txty ejecute el comando:

perl -e 'use IO::Compress::Deflate qw(deflate); deflate "-" => "-";' <12days.txt >>12days.pl

Vola 12days.pltiene alrededor de 376 bytes e imprime la canción. ;) Divertidamente usando rawinflate mueve exactamente seis bytes del documento de datos al código a partir de la salida de Ilmari.

Originalmente me propuse buscar un módulo de codificación de Huffman directamente, que no es tan deshonesto. Sin embargo, lamentablemente CPAN no tiene módulos con la tabla de entropía de letras en inglés, que es lo que realmente desea al comprimir cadenas muy cortas.

Descubrí que fortune -m Days\ of\ Christmastampoco funciona, lamentablemente.

Jeff Burdges
fuente
1

PHP, 548

$n=explode('|','first|second|third|fourth|fifth|sixth|seventh|eighth|ninth|tenth|eleventh|twelfth');$w=explode('|','and a partridge in a pear tree.|two turtle doves|three french hens|four calling birds|five golden rings|six geese a-laying|seven swans a-swimming|eight maids a-milking|nine ladies dancing|ten lords a-leaping|eleven pipers piping|twelve drummers drumming');foreach($n as $i=>$j)echo "on the $n[$i] day of christmas,\nmy true love sent to me\n".str_replace($i?'':'and ','',implode(",\n",array_reverse(array_slice($w,0,$i+1))))."\n\n";

Longitud reducida con compresión, 502

eval(gzuncompress(base64_decode('eNpVkE1u3DAMhfc+BWEI8AzqDtJtg7QHCYKCsWiLrX4MUjPOAD58KE829UIyP5Hge8/lF/pYY/F0GvZhHGYWrbvSVLLfa2Dx+1yuUsM+82yn8kc76UbZbuIl2JW5FfWB4tdb3SjaxHB+dtv/OzB7QFhRqrBfCDi3klCgCtHFJgtU2xkJfLmRmg7jMAvlKUCgrIcmmDBGzgu8m0pDfCNYSvSUQQxr0woLkRLg94h3Yw/hoBtmNagbp9Tw4QMSsm84cfzXqNkiiOiZFDzmqTEzCbHI0RcJ12P6sAwrryTarqPR7JsgL9eUGj5+7MHymIsQTuHkzLeC45df7u+ZplCgLxlqIHD51fGbLb1DmWEKwloT6tilu2V0NVWWC6jlDLVAoq6/aJU/QmvEiU6Ofw/DzyNni3sYOT3S78euH1EE79Z6M1V0elQauY1t49Po+NuPs32Xvuv650+BSMT/')));
Vladimir
fuente
No es el tipo de solución que me gusta leer (otra base-64 / gzip, simplemente genial), pero realmente no veo ninguna razón por la que solo usted merezca una puntuación de respuesta negativa con eso. Votado para traer algo de equilibrio; se solicita a quien rechace la votación que nos informe por qué.
JB
Muchos han proporcionado una solución comprimida, así que solo por diversión decidí poner una también. Pero mi código original también está publicado, así que no veo cuál es el problema. Solo ignora el comprimido. También me gustaría saber por qué me rechazaron.
Vladimir
1

VALA, 584 , 574

void main(){int i=0;string[] d={"first","second","thrid","fourth","fifth","sixth","seventh","eighth","ninth","tenth","eleventh","twelfth"};string[] p={"Twelve drummers drumming","Eleven pipers piping","Ten lords-a-leaping","Nine ladies dancing","Eight maids-a-milking","Seven swans-a-swimming","Six geese-a-laying","Five golden rings","Four calling birds","Three french hens","Two turtle doves","A"};while(i<12){stdout.printf("On the %s day of Christmas,\nmy true love gave to me,\n%s partridge in a pear tree.\n\n",d[i],string.joinv(",\n",p[11-i:12]));p[11]="And a";i++;}}

No más advertencias en la compilación.

MARTIN Damien
fuente
1

Java, 608

Primera publicación en Stack Exchange, segundo intento en este problema.

class T{public static void main(String[]args){String Z=" partridge in a pear tree.\n";String[] B=(" day of Christmas,\nMy true love gave to me0first0second0third0fourth0fifth0sixth0seventh0eighth0ninth0tenth0eleventh0twelfth0A"+Z+"0Two turtle doves,0Three french hens,0Four calling birds,0Five golden rings,0Six geese-a-laying,0Seven swans-a-swimming,0Eight maids-a-milking,0Nine ladies dancing,0Ten lords-a-leaping,0Eleven pipers piping,0Twelve drummers drumming,").split("0");for(int i=1;i<13;i++){System.out.println("On the "+B[i]+B[0]);for(int j=i+12;j>12;j--)System.out.println(B[j]);B[13]="And a"+Z;}}}

Java es un poco engorroso para tareas como esta, pero el uso de split ayudó a reducir la sobrecarga de String.

Ben I.
fuente
1

/// , 439 bytes

/|/\/\///^/on the |%/ day of christmas
my true love gave to me
|=/-a-|&/ing|*/even|+/th%|:/

^|A/el* pipers pip&
B|B/ten lords=leap&
C|C/nine ladies danc&
D|D/eight maids=milk&
E|E/s* swans=swimm&
F|F/six geese=lay&
G|G/five golden r&s
H|H/four call& birds
I|I/three french hens
J|J/two turtle doves
and K|K/a partridge in a pear tree/^first%K:second%J:+ird%I:four+H:fif+G:six+F:s*+E:eigh+D:nin+C:ten+B:el*+A:twelf+twelve drummers drumm&
A

Pruébalo en línea!

Si se permiten nuevas líneas finales, puede guardar cuatro bytes:

/|/\/\///^/on the |%/ day of christmas
my true love gave to me
|=/-a-|&/ing|*/even|+/th%|A/el* pipers pip&
B|B/ten lords=leap&
C|C/nine ladies danc&
D|D/eight maids=milk&
E|E/s* swans=swimm&
F|F/six geese=lay&
G|G/five golden r&s
H|H/four call& birds
I|I/three french hens
J|J/two turtle doves
and K|K/a partridge in a pear tree

/^first%K^second%J^+ird%I^four+H^fif+G^six+F^s*+E^eigh+D^nin+C^ten+B^el*+A^twelf+twelve drummers drumm&
A

Pruébalo en línea!

Explicación

/// es un lenguaje donde la única operación es una sustitución auto modificable. En particular, la instrucción /abc/xyz/reemplaza todas las instancias de abccon xyzen el resto del código fuente, incluidas otras sustituciones. Cualquier otro carácter simplemente se envía a STDOUT.

Si bien esto es suficiente para completar Turing, el golf en /// generalmente consiste en comenzar con la salida deseada e identificar subcadenas repetidas que se pueden reemplazar con atajos de un solo carácter.

\se puede usar como un carácter de escape en patrones, reemplazos y caracteres literales para significar un literal /o \.


La primera instrucción encontrada es /|/\/\//. Esto significa "reemplazar todo |con //el resto del programa". Esto ahorra un byte para cada sustitución posterior en el programa.


Después de esto, se realizan un conjunto de reemplazos para comprimir el texto en sí:

  • on the se convierte ^.
  • day of christmas \n my true love gave to me \nse convierte %.
  • -a-se convierte =.
  • ingse convierte &.
  • evense convierte *.
  • th%se convierte +.
  • ^precedido por dos nuevas líneas (que aparece en cada verso pero el primero) se convierte :.

Después de esto, escribimos la letra ellos mismos. Esto se realiza mediante reemplazos a Através de K. Cada reemplazo de letra agrega una línea al reemplazo después de él. Por ejemplo, Krepresenta a partridge in a pear treey Jrepresentatwo turtle doves \n and K .

De esta manera, cada verso de la canción se compone de:

  • ^ o :
  • Una cadena que representa el ordinal correcto (digamos el*th)
  • %
  • Una carta Aa través Kque representa las letras correctas.

Sin embargo, debido a que la mayoría de los ordinales terminan en th, usamos la sustitución th%+para guardar algunos bytes.

Fruta Esolanging
fuente
0

Hay momentos en que la solución más obvia es también la más corta, es decir, ya no pude resistir este impulso.

Bash en Mac OS X, 26

open http://tiny.cc/kavxf

Perl, 111

use LWP::Simple;get("http://tiny.cc/n230t")=~/On.*tree!/;
$_=$&;s/<br>/\n/g;s/(<.+?>)|(&\w+;)/ /g;print "$_\n";

Se agregó una nueva línea para facilitar la lectura.

Jeff Burdges
fuente
3
Si esta es una solución válida, entonces tengo una solución aún más corta escrita en HQ9 + C. (Eso es HQ9 + con un comando adicional. Puedes adivinar lo que hace.)
Ilmari Karonen
1
Pensé en ofuscar al perl usando el eval compresstruco para afirmar que encontré una expresión regular que se comprime muy bien, pero que se hinchó alrededor de 200 caracteres. lol
Jeff Burdges
El video no funciona ... también, use x.co , es el acortador de URL más corto que conozco
0

Java - 1329 caracteres

class x{public static void main(String[] args){for(int i=1;i<=12;i++){System.out.print("On the ");switch(i){case 1:System.out.print("first");break;case 2:System.out.print("second");break;case 3:System.out.print("third");break;case 4:System.out.print("fourth");break;case 5:System.out.print("fifth");break;case 6:System.out.print("sixth");break;case 7:System.out.print("seventh");break;case 8:System.out.print("eighth");break;case 9:System.out.print("ninth");break;case 10:System.out.print("tenth");break;case 11:System.out.print("eleventh");break;case 12:System.out.print("twelfth");break;}System.out.println(" day of Christmas\nmy true love gave to me");switch(i){case 12:System.out.println("Twelve drummers drumming");case 11:System.out.println("Eleven pipers piping");case 10:System.out.println("Ten lords-a-leaping");case 9:System.out.println("Nine ladies dancing");case 8:System.out.println("Eight maids-a-milking");case 7:System.out.println("Seven swans-a-swimming");case 6:System.out.println("Six geese-a-laying");case 5:System.out.println("Five golden rings");case 4:System.out.println("Four calling birds");case 3:System.out.println("Three french hens");default:if(i>=2)System.out.print("Two turtle doves\nAnd a");else System.out.print("A");System.out.println(" partridge in a pear tree");break;}System.out.println();}}}

Soy demasiado vago para deshacerme de él, pero está aquí: http://ideone.com/MU9IcP .

Hosch250
fuente
-2

SIMPLE , 1 byte

a

Nota :

El lenguaje fue diseñado después del desafío y todavía es un WIP.

Cómo :

Cualquier char dará salida a los 12 días de Navidad.

Muhammad Salman
fuente