Paroles de chanson 12 Days of Christmas

17

Je pensais que ce serait un défi amusant pour tout le monde et je suis curieux de voir les solutions que les gens trouvent.

Imprimer les paroles 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.

Règles

  • Vous n'avez pas à vous soucier de la capitalisation; le texte entier peut être insensible à la casse
  • Vous pouvez sensiblement ignorer toute ponctuation: les tirets peuvent être des espaces et les virgules et les points peuvent être ignorés
  • Il devrait y avoir une ligne vierge entre chaque verset
  • Vous devez ordinaliser vos numéros: " premier jour de Noël", " quatre oiseaux qui appellent", etc.
macek
la source
3
Pouvez-vous fournir la version complète de chaque ligne? J'ai l'habitude de "mon véritable amour m'a donné " et l'utilisation de différentes versions pourrait affecter les solutions.
Matthew Read
Mise à jour des paroles complètes.
macek
S'agit-il d'un "vous pouvez supprimer les majuscules des phrases" ou d'un "tout le texte est insensible à la casse" de ne pas vous soucier de la capitalisation?
JB
En outre, dans la ligne d'ignorer la ponctuation, pouvons-nous échanger la ponctuation pour les espaces (et réciproquement)?
JB
1
@macek: mieux, mais le côté latent de ma question était: puis-je également imprimer des tirets au lieu d'espaces?
JB

Réponses:

23

Brainfuck - 2,974

Je suis plutôt fier de celui-ci. Cela ressemble à un assez grand nombre, mais gardez à l'esprit que je n'ai utilisé aucune bibliothèque de compression externe et aucun du texte d'origine n'est dans mon programme. Aucune des autres communications ne peut le dire. Tout est codé à la main. Des générateurs de texte plus naïfs donnent plus de 39 Ko pour ce texte, donc je dirais que c'est une amélioration significative.

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

Malheureusement, c'est environ 600 caractères de plus que sa propre sortie, mais peu importe. Il conserve les caractères c, h, m, r, w dans un tableau et l'utilise pour imprimer tout le texte. Deux tableaux à droite de douze espaces gardent une trace de quel jour nous sommes pour le décompte et pour quels éléments nous pouvons sortir. Je peux peut-être l'optimiser un peu en réorganisant la carte mémoire pour amener les caractères d'impression entre les deux tableaux de comptage pour éviter de si longues chaînes de <<<<<<<et >>>>>>, mais ce serait beaucoup de travail à ce stade. Je pourrais aussi probablement choisir de meilleurs caractères de départ avec une analyse de fréquence pour minimiser l'incrémentation / décrémentation, mais peu importe.

Cela dépend des cellules d'encapsulation 8 bits pour fonctionner correctement.

Non 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
la source
1
Je tolérerais les commentaires en ligne sur les soumissions de cette taille (sans compter le score de golf). +1 de toute façon.
JB
Chose sûre. Ajout d'une version non golfée. Pour les numéros de jour, un seul bit est défini sur douze, et après la sortie, il définit le bit des jours suivants. Pour les éléments, l'avant-dernière ligne définit n bits dans une ligne haute et toutes les sorties get actives.
captncraig
10

Perl, 438 291 caractères

Inspiré par l'utilisation de la compression DEFLATE par Jeff Burdges , le code Ruby compressé de Ventero et l'utilisation de Lingua :: EN :: Numbers par JB , j'ai réussi à compresser mon entrée à 291 caractères (enfin, octets), y compris le code de décompression. Étant donné que le programme contient des caractères non imprimables, je l'ai fourni au format MIME Base64 :

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

Pour désencoder le programme, vous pouvez utiliser le script Perl d'assistance suivant:

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

Enregistrez la sortie dans un fichier nommé 12days.plet exécutez-le avec perl -M5.01 12days.pl. Comme indiqué, vous devez avoir installé le module Lingua :: EN :: Numbers pour que le code fonctionne.

Au cas où vous vous poseriez la question, la partie lisible du code ressemble simplement à ceci:

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

...représente 254 octets de code Perl compressé RFC 1950 . Non compressé, le code contient 361 caractères et ressemble à ceci:

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

L'écriture de ce code était un type étrange d'exercice de golf: il s'avère que la répétition maximisée et la minimisation du nombre de caractères distincts utilisés sont beaucoup plus importantes que la minimisation du nombre de caractères bruts lorsque la métrique pertinente est la taille après compression .

Pour extraire les derniers caractères, j'ai écrit un programme simple pour essayer de petites variations de ce code pour trouver celui qui compresse le mieux. Pour la compression, j'ai utilisé l' utilitaire KZIP de Ken Silverman , qui donne généralement de meilleures rations de compression (au prix de la vitesse) que le Zlib standard, même avec les paramètres de compression maximum. Bien sûr, puisque KZIP crée uniquement des archives ZIP, j'ai dû ensuite extraire le flux DEFLATE brut de l'archive et l'envelopper dans un en-tête et une somme de contrôle RFC 1950. Voici le code que j'ai utilisé pour cela:

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 cela ressemble à un horrible kluge, c'est parce que c'est exactement ce que c'est.


Pour l'intérêt historique, voici ma solution originale de 438 caractères, qui génère une sortie plus agréable, y compris les sauts de ligne et la ponctuation:

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

Faits saillants de cette version la paire de regexps s/e?t? .*/th/,s/vt/ft/, qui construisent les ordinaux pour 4 à 12 à partir des cardinaux au début des lignes de cadeaux.

Ce code peut, bien sûr, également être compressé à l'aide de l'astuce Zlib décrite ci-dessus, mais il s'avère que la simple compression de la sortie est plus efficace, produisant le programme suivant de 338 octets (au format Base64, encore):

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

J'ai également une archive gzip de 312 octets des paroles, construite à partir du même flux DEFLATE. Je suppose que vous pourriez l'appeler un "script zcat". :)

Ilmari Karonen
la source
On dirait que vous pouvez remplacer ringspar rGspour enregistrer 2 caractères
macek
@macek: Dans ma version originale, je ne pouvais pas, car je remplaçais Gpar ing,, mais il s'avère que l'ajout de virgules plus tard est en effet plus court. Merci!
Ilmari Karonen
Comment éviter l'erreur "modification d'une valeur en lecture seule"?
Jeff Burdges
@JeffBurdges: Dans la version originale? En affectant d'abord les chaînes à un tableau.
Ilmari Karonen
"Modification d'une valeur en lecture seule tentée sur /opt/local/lib/perl5/5.12.3/Compress/Zlib.pm ligne 357." J'ai évité ce problème en l'attribuant à $_dans ma mise à jour ci-dessous.
Jeff Burdges
10

Lisp commun, 333363

(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))

Les fonctionnalités intégrées pour formater les ordinaux sont utiles, mais la majeure partie de la compression provient de la possibilité d'utiliser la même liste d'arguments encore et encore, en sautant de moins en moins d'arguments à chaque exécution.

Comme l'a démontré coredump dans les commentaires, les installations intégrées peuvent toujours être utilisées à bon escient pour les cardinaux.

JB
la source
Peut-être pourriez-vous compresser un peu plus étant donné que les lignes commencent par "douze", "onze", "dix", ...
coredump
Peut etre c'est. Quelle est votre suggestion?
JB
1
J'ai d'abord espéré que le nombre d'arguments restant pourrait être utilisé, mais j'ai lu la spécification et je ne peux pas le faire. Le shortes que j'ai est de 333 caractères:(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
Nous parlons maintenant. Mon rêve aurait été de partager le compteur de saut avec l'ordinal, mais je n'ai pas trouvé de moyen court pour le faire.
JB
7

JavaScript 570

C'est ma première fois au 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
la source
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:])

Cependant, je mets le «et» sur la même ligne que les colombes au lieu de la perdrix.

Daan
la source
1
Vous avez fait la même faute d'orthographe que moi: c'est "douzième"
Andrew Shepherd
Eh bien, cela me sauve un autre personnage alors ... Merci!
Daan
5

Rubis (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")}

ou sous une forme plus lisible (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

quelqu'un a une idée de la façon de contourner le .reverse? je n'ai pas pu trouver de solution

kev
la source
J'aime votre astuce avec * pour représenter "ing". Vous devriez pouvoir le ramener à environ 440 en: utilisant 12.timesau lieu de (0..11).each; faire un seul put avec deux arguments au lieu de deux put avec un argument; utilisez la notation% w () pour le tableau des jours de Noël. Enfin, vous pouvez vous débarrasser de l'inverse en inversant la liste, en ajoutant un ^ supplémentaire à la fin de la chaîne, puis en utilisant [-i..-1]au lieu de [0..i].
Wayne Conrad
ne pouviez-vous pas changer "batterie" en "batterie *"?
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"
}

C'est ma première tentative, et je suis sûr qu'elle pourrait être beaucoup plus courte. Les sauts de ligne sont pour la lisibilité. Il a trois tableaux importants, dont l'un contient le nom de chaque jour @s, dont l'un répertorie tous les cadeaux (sauf le premier) @a, et celui qui répertorie les cadeaux qui ont déjà été offerts @b. Le mécanisme principal est que chaque jour, il imprime @bpuis transfère un cadeau supplémentaire de @aà @b.

Merci à Andrew pour 500-> 485

PhiNotPi
la source
vous pouvez remplacer ringspar r$1spour enregistrer 1 char de plus
macek
@macek Je ne peux pas faire ça car perl interprétera le scomme faisant partie du nom de la variable, et la variable $isn'existe pas. (Ce sont en fait des i au lieu de ceux, btw)
PhiNotPi
eigth->eighth
Matthew Lire
Vous pourriez remplacer $i, disons, $;pour contourner cela. De toute façon, personne ne l'utilise $;aux fins prévues.
Ilmari Karonen
@IlmariKaronen J'ai suivi votre conseil, mais j'ai corrigé une faute de frappe, donc le nombre de caractères est resté le même.
PhiNotPi
5

Vim - 578 frappes

J'ai décidé d'essayer le vim-golf, car c'est le genre de chose qui peut être vim-golf.

Commencez par insérer le cadre - la ligne "X jour de Noël" au total 12 fois (89 frappes):

                                         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

Ensuite, effectuez une série de macros qui insèreront les nombres 2 à 12 aux endroits respectifs dont ils ont besoin pour les paroles (172 frappes):

                                      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

Le "dw" sur la deuxième ligne est de se débarrasser du premier "et", car il n'y va pas.

Ensuite, effectuez une série de substitutions pour le nombre de choses que le véritable amour a donné (319 frappes):

                                       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

Et enfin, en remplaçant chaque occurrence de Xpar un nombre 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

Et nous avons terminé!


Je suis sûr qu'il y a d'autres optimisations que j'ai ratées, mais je pense que c'est assez bien moi-même.

Joe Z.
la source
Euh oh, j'ai oublié les évasions.
Joe Z.23
Vous pouvez laisser de côté le / g avec les substitutions, comme ceci::%s/2/two turtle doves,
2xsaiko
4

C (644)

Le nombre ne comprend pas les espaces utilisés pour la présentation.

#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 sortie est comme:

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
la source
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' '
        )
    )
 }

Merci de Daan pour l'idée de fractionner une chaîne concaténée.

J'avais à l'origine inclus une instruction de commutation pour obtenir le "et" sur la perdrix pour tous sauf le premier couplet. Mais, parce que la question nous absout de la ponctuation, nous pouvons simplement ajouter le «et» aux colombes.

Il en résulte des sauts de ligne comme suit:

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
la source
Douzième, pas douzième.
Joey Adams
@Joey Adams - Merci de m'avoir corrigé et de m'avoir donné un caractère de moins :-)
Andrew Shepherd
4

Perl, 368 389 (pas d'unicode / compression)

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 :: FR :: Numbers , même si je ne suis pas convaincu à 100% que c'est une bonne idée quand je vois le module et la longueur des noms de ses identifiants. Nécessite Perl 5.10 ou une version ultérieure, exécutée à partir de la ligne de commande avec un -Ecommutateur.

Edit: améliorations mineures: arrêtez d'utiliser un tableau, meilleure utilisation $_des espaces blancs inutiles.

JB
la source
+1, cool! Quelqu'un pourrait se plaindre de l'utilisation d'un module non standard, mais si nous permettons à n'importe quel langage d'être utilisé (y compris ceux à usage spécial comme GolfScript), je ne vois pas pourquoi "Perl + Lingua :: EN :: Numbers" ne le ferait pas '' t être une langue valide pour une solution. Cependant, écrire un module "Acme :: 12Days" et le soumettre au CPAN est probablement de la triche. :)
Ilmari Karonen
@Ilmari Karonen lorsque les gens se plaignent, je renomme généralement la langue en "CPAN". Cela n'arrive pas souvent.
JB
2
Ilmari, Golfscript n'est pas un langage spécial.
Joey
2
Plus comme un langage "accidentellement général": D
JB
1
Cher seigneur, pourquoi les gens ne peuvent-ils plus jouer à leur propre code?
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})]

Cela imprime les paroles comme indiqué dans la question avec plusieurs lignes par verset. Nous pouvons enregistrer quelques caractères si cette exigence n'est pas là.

Joey
la source
+1 merde trouée. Vous avez obtenu ce travail avec les sauts de ligne ainsi que le «Et» apparaissant sur la dernière ligne.
Andrew Shepherd
Eh bien, l'impression d'un texte différent n'a jamais été une option de toute façon, et le «Et» dans la dernière ligne utilise la même astuce que tout le monde. Pourtant, je voulais conserver les sauts de ligne, ce que l'autre solution ne fait pas (tout en étant plus long aussi).
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
la source
2

Java, 2062

Je sais que cela a été publié il y a quelque temps, mais j'ai pensé que j'essaierais. Je suis étudiant et encore nouveau dans ce domaine, mais cela semble fonctionner.

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
la source
Salut Gina, bienvenue sur le site!
Tynam
3
Félicitations pour une première solution; fonctionne bien. Le concours avec le code golf est le `` code le plus court possible '', il est donc normal sur ce site de faire quelques choses que vous ne feriez jamais en code normal: couper les noms de variables et de fonctions à un caractère, couper les espaces blancs et quelques autres choses. (Il est normal et attendu d'inclure également la version intégrale comme vous l'avez fait ici pour rendre l'approche plus claire.) Cela fait, vous pouvez alors vous demander: "comment puis-je raccourcir cela?"
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.")}

Vous pouvez coller cela dans une aire de jeux.

J'ai essayé de déplacer le vdans la commande d'impression et j'ai obtenu:

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
la source
1

Ruby 1.9.3, compressé, 321 caractères

Étant donné que le code contient des caractères non imprimables, je publierai plutôt un vidage hexadécimal du code:

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                                       '

Pour créer le code réel à partir de l'hexdump, placez-le dans un fichier et exécutez xxd -r hexdump > 12days.rb. L'exécution ruby1.9.3 12.days.rbexécutera ensuite le code et imprimera les paroles. Notez que ce code nécessite Ruby 1.9.3 (car il utiliseZlib.inflate ), donc il ne fonctionnera pas avec Ruby 1.8.x, 1.9.1 et 1.9.2.

Le code non compressé comprend 425 caractères:

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
la source
1

Perl, 319/313

Idée: décompresser et évaluer la solution Lingua :: EN :: Numbers de JB.

Tout d'abord, collez ce bloc de texte dans la commande perl -e 'use MIME::Base64; print decode_base64 $_ while <>;' >12days.pl. Ensuite, exécutez la commande 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==

Le script lui-même prend la forme use Compress::Zlib;$_='...';eval uncompress$_;où se ...trouve la solution 368 char de JB après avoir été compressé avec cette commande et avoir échappé à a '.

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

Le script d'Ilmari se plaint de modifier une valeur en lecture seule sans les $_=...;caractères supplémentaires , mais il ferait probablement ce 313 . Vous pouvez économiser plusieurs octets supplémentaires en modifiant manuellement la compression comme Ilmari l'a fait auparavant, atteignant peut-être 310 ou plus , mais je n'ai pas pris la peine.


Perl, 376 (tromper une autre soumission) [ma soumission d'origine]

Tout d'abord, créez un script perl appelé 12days.plcontenant:

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

Ensuite, dirigez la sortie de toute autre soumission vers 12days.txtet exécutez la commande:

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

Vola 12days.plfait environ 376 octets et imprime la chanson. ;) L'utilisation amusante de rawinflate déplace précisément six octets du document de données dans le code à partir de la sortie d'Ilmari.

À l'origine, je m'étais mis à la recherche d'un module de codage Huffman directement, ce qui n'est pas si malhonnête. Pourtant, malheureusement, CPAN n'a pas de modules avec la table d'entropie des lettres en anglais, ce que vous voulez vraiment lors de la compression de chaînes très courtes.

J'ai trouvé que fortune -m Days\ of\ Christmascela ne fonctionnait pas non plus, malheureusement.

Jeff Burdges
la source
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";

Longueur réduite avec compression, 502

eval(gzuncompress(base64_decode('eNpVkE1u3DAMhfc+BWEI8AzqDtJtg7QHCYKCsWiLrX4MUjPOAD58KE829UIyP5Hge8/lF/pYY/F0GvZhHGYWrbvSVLLfa2Dx+1yuUsM+82yn8kc76UbZbuIl2JW5FfWB4tdb3SjaxHB+dtv/OzB7QFhRqrBfCDi3klCgCtHFJgtU2xkJfLmRmg7jMAvlKUCgrIcmmDBGzgu8m0pDfCNYSvSUQQxr0woLkRLg94h3Yw/hoBtmNagbp9Tw4QMSsm84cfzXqNkiiOiZFDzmqTEzCbHI0RcJ12P6sAwrryTarqPR7JsgL9eUGj5+7MHymIsQTuHkzLeC45df7u+ZplCgLxlqIHD51fGbLb1DmWEKwloT6tilu2V0NVWWC6jlDLVAoq6/aJU/QmvEiU6Ofw/DzyNni3sYOT3S78euH1EE79Z6M1V0elQauY1t49Po+NuPs32Xvuv650+BSMT/')));
Vladimir
la source
Pas le genre de solution que j'aime lire (encore une autre base-64 / gzip, tout simplement génial), mais je ne vois vraiment aucune raison pour laquelle vous méritez à lui seul un score de réponse négative avec cela. Ont voté pour apporter un certain équilibre; quiconque a voté en bas est prié de nous en informer.
JB
Beaucoup ont fourni une solution compressée, donc juste pour le plaisir, j'ai décidé d'en mettre une également. Mais mon code d'origine est également affiché, donc je ne vois pas quel est le problème. Ignorez simplement celui compressé. J'aimerais aussi savoir pourquoi j'ai été rétrogradé.
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++;}}

Plus d'avertissement à la compilation.

MARTIN Damien
la source
1

Java, 608

Premier post sur Stack Exchange, deuxième tentative de ce problème.

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 est un peu lourd pour des tâches comme celle-ci, mais l'utilisation de split a permis de réduire la surcharge de String.

Ben I.
la source
1

/// , 439 octets

/|/\/\///^/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

Essayez-le en ligne!

Si les retours à la ligne de fin sont autorisés, vous pouvez enregistrer quatre octets:

/|/\/\///^/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

Essayez-le en ligne!

Explication

/// est un langage où la seule opération est une substitution auto-modifiable. En particulier, l'instruction /abc/xyz/remplace toutes les instances de abcparxyz dans le reste du code source, y compris les autres substitutions. Tout autre caractère est simplement sorti vers STDOUT.

Bien que cela soit suffisant pour que Turing soit complet, le golf dans /// consiste généralement à commencer par la sortie prévue et à identifier les sous-chaînes répétées qui peuvent être remplacées par des raccourcis à un seul caractère.

\peut être utilisé comme caractère d'échappement dans les motifs, les remplacements et les caractères littéraux pour signifier un littéral /ou \.


La première instruction rencontrée est /|/\/\//. Cela signifie "remplacer tout |par// dans le reste du programme». Cela enregistre un octet pour chaque substitution ultérieure dans le programme.


Après cela, un ensemble de remplacements est effectué pour compresser le texte lui-même:

  • on the devient ^ .
  • day of christmas \n my true love gave to me \n devient % .
  • -a- devient = .
  • ing devient & .
  • even devient * .
  • th% devient + .
  • ^précédé de deux nouvelles lignes (qui apparaît dans tous les versets sauf le premier) devient :.

Ensuite, nous écrivons les paroles elles-mêmes. Cela se fait à l' aide de remplacement Apar K. Chaque remplacement de lettre ajoute une ligne au remplacement après celui-ci. Par exemple, Kreprésente a partridge in a pear treeetJ représente two turtle doves \n and K.

De cette façon, chaque couplet de la chanson est composé de:

  • ^ ou :
  • Une chaîne représentant l'ordinal correct (disons el*th)
  • %
  • Une lettre Apar Kqui représente les paroles correctes.

Cependant, comme la plupart des ordinaux se terminent par th, nous utilisons la substitution th%+pour enregistrer quelques octets.

Esolanging Fruit
la source
0

Il y a des moments où la solution la plus évidente est aussi la plus courte, c'est-à-dire que je ne pouvais plus résister à cette envie.

Bash sur 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";

Une nouvelle ligne ajoutée pour plus de lisibilité.

Jeff Burdges
la source
3
Si c'est une solution valide, j'en ai une encore plus courte écrite en HQ9 + C. (C'est HQ9 + avec une commande supplémentaire. Vous pouvez deviner ce que cela fait.)
Ilmari Karonen
1
J'ai envisagé de brouiller le perl en utilisant l' eval compressastuce pour prétendre avoir trouvé une expression régulière qui comprime très bien, mais qui gonflait environ 200 caractères. lol
Jeff Burdges
La vidéo ne fonctionne pas ... aussi, utilisez x.co , c'est le raccourcisseur d'url le plus court que je connaisse
0

Java - 1329 caractères

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();}}}

Je suis trop paresseux pour le dé-golfer, mais c'est ici: http://ideone.com/MU9IcP .

Hosch250
la source
-2

SIMPLE , 1 octet

a

Remarque :

Le langage a été conçu après le défi et est toujours un WIP.

Comment :

Tout personnage affichera les 12 jours de Noël.

Muhammad Salman
la source