12 Tage Weihnachten Lyrics


17

Ich dachte, das wäre eine lustige Herausforderung für alle und ich bin gespannt auf die Lösungen, die die Leute finden.

Drucken Sie die Texte "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.

Regeln

  • Sie müssen sich keine Sorgen um die Großschreibung machen. Der gesamte Text kann zwischen Groß- und Kleinschreibung unterscheiden
  • Sie können Satzzeichen vernünftigerweise ignorieren: Bindestriche können Leerzeichen sein, Kommas und Punkte können ignoriert werden
  • Zwischen jedem Vers sollte eine Leerzeile stehen
  • Sie müssen Ihre Zahlen ordinalisieren: " erster Weihnachtstag", " Vier rufende Vögel" usw

3
Können Sie die Vollversion jeder Zeile bereitstellen? Ich bin es gewohnt, "meine wahre Liebe mir geschenkt zu haben", und die Verwendung verschiedener Versionen kann sich auf die Lösungen auswirken.
Matthew Read

Komplette Texte aktualisiert.
macek

Ist das ein "Sie können Satz-Großbuchstaben fallenlassen" oder ein "der ganze Text ist case-insensitiv" Typ, der sich keine Gedanken über die Großschreibung macht?
JB

Können wir in der Zeile, in der die Interpunktion ignoriert wird, die Interpunktion durch Leerzeichen (und umgekehrt) ersetzen?
JB

1
@macek: Besser, aber die latente Seite meiner Frage war: Kann ich auch Bindestriche anstelle von Leerzeichen drucken?
JB

Antworten:


21

Brainfuck - 2.974

Ich bin ziemlich stolz darauf. Das hört sich nach einer ziemlich großen Zahl an, aber denken Sie daran, dass ich keine externen Komprimierungsbibliotheken verwendet habe und dass sich nirgendwo der Originaltext in meinem Programm befindet. Keiner der anderen Beiträge kann das behaupten. Dies ist alles handcodiert. Naivere Textgeneratoren geben mehr als 39 KB für diesen Text aus, daher würde ich sagen, dass dies eine signifikante Verbesserung darstellt.

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

Leider ist dies etwa 600 Zeichen länger als die eigene Ausgabe, aber was auch immer. Die Zeichen c, h, m, r, w bleiben in einem Array und werden zum Drucken des gesamten Texts verwendet. Zwei Felder rechts von je zwölf Feldern protokollieren, an welchem ​​Tag wir zählen und für welche Elemente wir ausgeben können. Möglicherweise kann ich es ein wenig optimieren, indem ich die Speicherzuordnung neu organisiere, um die Druckzeichen zwischen die beiden Zählfelder zu bringen, um so lange Ketten von <<<<<<<und zu vermeiden >>>>>>, aber das wäre an dieser Stelle eine Menge Arbeit. Ich könnte wahrscheinlich auch einige bessere Startzeichen mit Frequenzanalyse auswählen, um das Inkrementieren / Dekrementieren zu minimieren, aber wie auch immer.

Dies hängt davon ab, ob 8-Bit-Umbruchzellen ordnungsgemäß funktionieren.

Ungolfed:

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

[>+>+>+>+>+<<<<<-]++++++++++
>>[+++++>]<<<[+++++>]<<[+++++>]<+++++>>
++++[<++++++++>-]
++++++++++++>+>+>>>>>>>>>>>>>+<<<<<<<<<<<<<<<
[ 
   <<<<++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..>>>>>.<<<<<-->->--->>>>>>>>>>>>>>>>>>>-]
   <<<<<<<<<<<<<<<<<<<<<<..>>>>>>>->+
   [>+>>>>>>>>>>>>>[>]+[<]<<<<<<<<<<<<<-]>[<+>-]<<
]

1
Ich würde Inline-Kommentare zu Einsendungen dieser Größe tolerieren (nicht gezählt für die Golfwertung). + 1 würde sowieso.
JB

Sichere Sache. Ungolfed Version hinzugefügt. Für die Tageszahlen wird nur ein Bit von zwölf gesetzt, und nach der Ausgabe wird das Bit für die nächsten Tage gesetzt. Bei Elementen setzt die vorletzte Zeile n Bits in einer Reihe auf Hoch, und alle aktiven werden ausgegeben.
captncraig

10

Perl, 438 291 Zeichen

Inspiriert von Jeff Burdges 'DEFLATE-Komprimierung , Venteros komprimiertem Ruby-Code und JBs Lingua :: EN :: Numbers gelang es mir, meine Eingabe auf 291 Zeichen (naja, Bytes) einschließlich Dekomprimierungscode zu komprimieren. Da das Programm einige nicht druckbare Zeichen enthält, habe ich es im MIME Base64-Format bereitgestellt :

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

Um das Programm zu entschlüsseln, können Sie das folgende Hilfs-Perl-Skript verwenden:

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

Speichern Sie die Ausgabe in einer Datei mit dem Namen 12days.plund führen Sie sie mit aus perl -M5.01 12days.pl. Wie bereits erwähnt, muss das Lingua :: EN :: Numbers- Modul installiert sein, damit der Code funktioniert.

Falls Sie sich fragen, sieht der lesbare Teil des Codes einfach so aus:

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

Dabei ...steht das für 254 Bytes RFC 1950- komprimierten Perl-Code. Unkomprimiert ist der Code 361 Zeichen lang und sieht folgendermaßen aus:

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

Das Schreiben dieses Codes war eine seltsame Art von Golfübung: Es stellte sich heraus, dass die Maximierung der Wiederholung und die Minimierung der Anzahl der verwendeten unterschiedlichen Zeichen viel wichtiger sind als die Minimierung der Anzahl der rohen Zeichen, wenn die relevante Metrik die Größe nach der Komprimierung ist .

Um die letzten Zeichen herauszufiltern, habe ich ein einfaches Programm geschrieben, um kleine Variationen dieses Codes auszuprobieren und das zu finden, das am besten komprimiert. Für die Komprimierung habe ich Ken Silvermans KZIP- Dienstprogramm verwendet, das in der Regel selbst bei maximalen Komprimierungseinstellungen bessere Komprimierungsraten (auf Kosten der Geschwindigkeit) liefert als Standard-Zlib. Da KZIP nur ZIP-Archive erstellt, musste ich natürlich den unformatierten DEFLATE-Stream aus dem Archiv extrahieren und ihn in einen RFC 1950-Header und eine Prüfsumme verpacken. Hier ist der Code, den ich dafür verwendet habe:

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";
}}}}}}}

Wenn das wie ein schrecklicher Schlitten aussieht, dann ist es genau das, was es ist.


Aus historischen Gründen ist hier meine ursprüngliche 438-Zeichen-Lösung, die eine bessere Ausgabe, einschließlich Zeilenumbrüchen und Interpunktion, generiert:

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

Höhepunkte dieser Version sind die beiden Regexps s/e?t? .*/th/,s/vt/ft/, die aus den Kardinälen am Anfang der Geschenklinien die Ordnungszahlen für 4 bis 12 bilden.

Dieser Code kann natürlich auch mit dem oben beschriebenen Zlib-Trick komprimiert werden, aber es stellt sich heraus, dass das einfache Komprimieren der Ausgabe effizienter ist und das folgende 338-Byte-Programm ergibt (wieder im Base64-Format):

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

Ich habe auch ein 312-Byte-GZIP-Archiv mit den Texten, das aus demselben DEFLATE-Stream erstellt wurde. Ich nehme an, Sie könnten es ein "zcat-Skript" nennen. :)


Sieht aus wie Sie können ersetzen ringsmit rGszu speichern 2 chars
macek

@macek: In meiner ursprünglichen Version konnte ich nicht, weil ich Ersatz Gmit ing,, aber es stellt sich heraus , dass die Kommas später hinzuzufügen , ist in der Tat kürzer. Vielen Dank!
Ilmari Karonen

Wie vermeidet man den Fehler, dass ein schreibgeschützter Wert geändert wird?
Jeff Burdges

@ JeffBurdges: In der Originalversion? Indem Sie die Zeichenfolgen zuerst einem Array zuweisen.
Ilmari Karonen

"Änderung eines schreibgeschützten Werts in Zeile 357 /opt/local/lib/perl5/5.12.3/Compress/Zlib.pm versucht." Ich habe dieses Problem durch Zuweisen von $_in meinem Update unten vermieden .
Jeff Burdges

10

Common Lisp, 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))

Die eingebauten Funktionen zum Formatieren von Ordnungszahlen sind hilfreich, aber der größte Teil der Komprimierung ergibt sich aus der Möglichkeit, dieselbe Argumentliste immer wieder zu verwenden und bei jedem Durchlauf immer weniger Argumente zu überspringen.

Wie von coredump in den Kommentaren bewiesen, können die eingebauten Einrichtungen für die Kardinäle weiterhin gut genutzt werden.


Vielleicht könnten Sie etwas mehr komprimieren, da die Zeilen mit "zwölf", "elf", "zehn", ... beginnen
coredump

Vielleicht ist es. Was ist dein Vorschlag?
JB

1
Ich habe zuerst gehofft, dass die verbleibende Anzahl von Argumenten verwendet werden kann, aber ich habe die Spezifikation gelesen und kann es nicht tun. Die Shorts, die ich habe, ist 333 Zeichen:(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

Jetzt reden wir. Mein Traum wäre es gewesen, den Sprungzähler mit der Ordnungszahl zu teilen, aber ich habe keinen kurzen Weg gefunden, dies zu tun.
JB

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:])

Ich setze jedoch das 'und' in die gleiche Zeile wie die Tauben anstelle des Rebhuhns.


1
Sie haben den gleichen Rechtschreibfehler wie ich gemacht: Es ist "zwölfter"
Andrew Shepherd

Nun, das erspart mir dann einen weiteren Charakter ... Danke!
Daan

6

JavaScript 570

Ich spiele zum ersten Mal 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);}

5

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

oder in besser lesbarer Form (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

Hat jemand eine Idee, wie man die .reverse umgehen kann? Ich konnte keine Lösung finden


Ich mag deinen Trick mit *, um "ing" darzustellen. Sie sollten in der Lage sein, es auf ungefähr 440 zu bringen, indem Sie: use 12.timesanstatt (0..11).each; einen einzelnen Puts mit zwei Argumenten anstelle von zwei Puts mit einem Argument ausführen; Verwenden Sie die% w () - Notation für das Array der Weihnachtstage. Zum Schluss können Sie die Umkehrung wieder rückgängig machen, indem Sie die Liste umkehren, ein zusätzliches ^ am Ende der Zeichenfolge [-i..-1]anfügen und dann anstelle von [0..i] verwenden.
Wayne Conrad

Konntest du "Schlagzeug" nicht in "Schlagzeug *" ändern?
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"
}

Dies ist mein erster Versuch und ich bin sicher, dass er viel kürzer gemacht werden könnte. Die Zeilenumbrüche dienen der Lesbarkeit. Es hat drei wichtige Felder, von denen eines den Namen für jeden Tag enthält @s, von denen eines alle Geschenke auflistet (mit Ausnahme des ersten) @aund eines, das auflistet, welche Geschenke bereits gegeben wurden @b. Der Hauptmechanismus besteht darin, dass jeden Tag @bein zusätzliches Geschenk von @anach gedruckt und dann übertragen wird @b.

Danke an Andrew für 500-> 485


Sie können ersetzen ringsmit r$1s1 mehr Zeichen zu speichern
macek

@macek Ich kann das nicht tun, weil Perl das sals Teil des Variablennamens interpretiert und die Variable $isnicht existiert. (Sie sind eigentlich ich ist anstelle von denen, übrigens)
PhiNotPi

eigth->eighth
Matthew Read

Sie könnten beispielsweise ersetzen $i, $;um das zu umgehen. Niemand benutzt es jemals $;für seinen beabsichtigten Zweck.
Ilmari Karonen

@IlmariKaronen Ich habe Ihren Rat befolgt, aber einen Tippfehler behoben, sodass die Anzahl der Zeichen gleich blieb.
PhiNotPi

5

Vim - 578 Tastenanschläge

Ich habe beschlossen, dies zu versuchen und Vim-Golf zu spielen, da dies die Art von Dingen ist, die man mit Vim-Golf spielen kann.

Beginnen Sie mit dem Einfügen des Frameworks - die Zeile "X day of Christmas" insgesamt 12 Mal (89 Tastenanschläge):

                                         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

Führen Sie dann eine Reihe von Makros aus, in die die Nummern 2 bis 12 an den entsprechenden Stellen eingefügt werden, an denen sie für den Text erforderlich sind (172 Tastenanschläge):

                                      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

Das "dw" in der zweiten Zeile ist, das erste "und" loszuwerden, weil es dort nicht hingeht.

Führen Sie dann eine Reihe von Substitutionen für die Anzahl der Dinge durch, die die wahre Liebe gegeben hat (319 Tastenanschläge):

                                       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

Und schließlich jedes Vorkommen von Xdurch eine Ordnungszahl ersetzen :

                         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

Und wir sind fertig!


Ich bin sicher, dass es noch andere Optimierungen gibt, die ich verpasst habe, aber ich finde das ziemlich gut.


Oh oh, ich habe die Flucht vergessen.
Joe Z.

Sie können das / g mit den Substitutionen :%s/2/two turtle doves,
weglassen

4

C (644)

Die Anzahl enthält keine für die Präsentation verwendeten Leerzeichen.

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

Die Ausgabe ist wie folgt:

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

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

Vielen Dank an Daan für die Idee, eine verkettete Zeichenfolge zu teilen.

Ich hatte ursprünglich eine switch-Anweisung eingefügt, um das "und" für alle außer dem ersten Vers auf das Rebhuhn zu bekommen. Aber weil die Frage uns von Interpunktion befreit, können wir einfach das "und" an die Tauben anhängen.

Dies führt zu folgenden Zeilenvorschüben:

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

Zwölfte, nicht zwölfte.
Joey Adams

@ Joey Adams - Vielen Dank, dass Sie mich korrigiert und mir einen Charakter weniger gegeben haben :-)
Andrew Shepherd

4

Perl, 368 389 (kein Unicode / keine Komprimierung)

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]
$_"}

Kabelbäume Lingua :: EN :: Numbers , obwohl ich nicht zu 100% überzeugt bin, ist es eine gute Idee, wenn ich die Länge des Moduls und der Bezeichnernamen sehe. Benötigt Perl 5.10 oder höher, mit einem -ESchalter von der Befehlszeile aus ausführen .

Bearbeiten: kleinere Verbesserungen: Verwenden Sie kein Array mehr, verwenden Sie $_nicht mehr benötigte Leerzeichen besser .


+1, Cool! Jemand könnte sich über die Verwendung eines nicht standardmäßigen Moduls beschweren, aber wenn wir die Verwendung einer Sprache zulassen (einschließlich derjenigen für spezielle Zwecke wie GolfScript), verstehe ich nicht, warum "Perl + Lingua :: EN :: Numbers" dies nicht tun würde. t eine gültige Sprache für eine Lösung sein. Das Schreiben eines "Acme :: 12Days" -Moduls und das Einreichen an CPAN ist jedoch wahrscheinlich ein Betrug. :)
Ilmari Karonen

@Ilmari Karonen Wenn Leute sich beschweren, benenne ich die Sprache normalerweise in "CPAN" um. Kommt nicht oft vor.
JB

2
Ilmari, Golfscript ist keine Spezialsprache.
Joey

2
Eher wie eine "versehentlich allgemeine" Sprache: D
JB

1
Sehr geehrter Herr, warum können die Leute ihren eigenen Code nicht mehr spielen?
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})]

Dies druckt den Text wie in der Frage angegeben mit mehreren Zeilen pro Vers. Wir können ein paar Zeichen speichern, wenn diese Anforderung nicht vorhanden ist.


+1 Holey Mist. Dies funktioniert sowohl mit Zeilenvorschüben als auch mit dem "Und" in der letzten Zeile.
Andrew Shepherd

Nun, das Drucken eines anderen Textes war sowieso nie eine Option, und das „Und“ in der letzten Zeile verwendet den gleichen Trick wie alle anderen. Trotzdem wollte ich Zeilenumbrüche beibehalten, die die andere Lösung nicht bietet (obwohl sie auch länger ist).
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));}}}

2

Java, 2062

Ich weiß, dass dies vor einiger Zeit gepostet wurde, aber ich dachte, ich würde es versuchen. Ich bin ein Student und noch neu in diesem Bereich, aber es scheint zu funktionieren.

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

}

Hallo Gina, willkommen auf der Seite!
Tynam

3
Herzlichen Glückwunsch zu einer ersten Lösung; funktioniert gut. Der Wettbewerb mit Codegolf ist "kürzester möglicher Code". Daher ist es auf dieser Website Standard, einige Dinge zu tun, die Sie in normalem Code niemals tun würden: Variablen- und Funktionsnamen auf ein Zeichen beschränken, Leerzeichen und einige andere Dinge. (Es ist in Ordnung und zu erwarten, dass Sie auch die Vollversion einbeziehen, wie Sie es hier getan haben, um den Ansatz zu verdeutlichen.) Nachdem Sie dies getan haben, können Sie sich fragen: "Wie kann ich das verkürzen?"
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.")}

Sie können dies auf einem Spielplatz einfügen.

Ich habe versucht, das vin den Druckbefehl zu verschieben und habe:

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

1

Ruby 1.9.3, komprimiert, 321 Zeichen

Da der Code nicht druckbare Zeichen enthält, werde ich stattdessen einen Hexdump des Codes veröffentlichen:

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  /.......@5...d..
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                                       '

Um den eigentlichen Code aus dem Hexdump zu erstellen, legen Sie ihn in eine Datei und führen Sie ihn aus xxd -r hexdump > 12days.rb. Dann ruby1.9.3 12.days.rbwird beim Ausführen der Code ausgeführt und der Text gedruckt. Beachten Sie, dass dieser Code Ruby 1.9.3 erfordert (weil er verwendet wird Zlib.inflate), sodass er mit Ruby 1.8.x, 1.9.1 und 1.9.2 nicht funktioniert.

Der unkomprimierte Code ist 425 Zeichen lang:

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}

1

Perl, 319/313

Idee: Dekomprimieren und bewerten Sie die Lingua :: EN :: Numbers-Lösung von JB.

Fügen Sie zuerst diesen Textblock in den Befehl ein perl -e 'use MIME::Base64; print decode_base64 $_ while <>;' >12days.pl. Führen Sie als Nächstes den Befehl aus 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==

Das Skript selbst hat die Form, use Compress::Zlib;$_='...';eval uncompress$_;in der ...sich JBs 368 char-Lösung befindet, nachdem es mit diesem Befehl komprimiert und mit einem Escapezeichen versehen wurde '.

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

Ilmaris Skript beschwert sich darüber, dass ein schreibgeschützter Wert ohne die zusätzlichen $_=...;Zeichen geändert wird, aber vermutlich würde er dies 313 machen . Sie könnten mehrere weitere Bytes einsparen, indem Sie die Komprimierung manuell anpassen, wie es Ilmari zuvor getan hat, vielleicht erreichen Sie 310 oder so , aber ich habe mich nicht darum gekümmert.


Perl, 376 (betrügt eine andere Vorlage) [meine ursprüngliche Vorlage]

Erstellen Sie zunächst ein Perl-Skript mit dem Namen 12days.pl:

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

Leiten Sie als Nächstes die Ausgabe einer anderen 12days.txtÜbermittlung an den folgenden Befehl weiter und führen Sie ihn aus:

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

Vola 12days.plist ungefähr 376 Bytes groß und druckt das Lied. ;) Mit rawinflate werden ausgehend von Ilmaris Ausgabe amüsanterweise genau sechs Bytes aus dem Datendokument in den Code verschoben.

Ich hatte mich ursprünglich direkt auf die Suche nach einem Huffman-Codierungsmodul gemacht, was bei weitem nicht so unehrlich ist. Leider hat CPAN keine Module mit der englischen Buchstaben-Entropietabelle, was Sie wirklich wollen, wenn Sie sehr kurze Zeichenfolgen komprimieren.

Ich fand, dass fortune -m Days\ of\ Christmasdas leider auch nicht funktioniert.


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

Verkürzte Länge mit Kompression, 502

eval(gzuncompress(base64_decode('eNpVkE1u3DAMhfc+BWEI8AzqDtJtg7QHCYKCsWiLrX4MUjPOAD58KE829UIyP5Hge8/lF/pYY/F0GvZhHGYWrbvSVLLfa2Dx+1yuUsM+82yn8kc76UbZbuIl2JW5FfWB4tdb3SjaxHB+dtv/OzB7QFhRqrBfCDi3klCgCtHFJgtU2xkJfLmRmg7jMAvlKUCgrIcmmDBGzgu8m0pDfCNYSvSUQQxr0woLkRLg94h3Yw/hoBtmNagbp9Tw4QMSsm84cfzXqNkiiOiZFDzmqTEzCbHI0RcJ12P6sAwrryTarqPR7JsgL9eUGj5+7MHymIsQTuHkzLeC45df7u+ZplCgLxlqIHD51fGbLb1DmWEKwloT6tilu2V0NVWWC6jlDLVAoq6/aJU/QmvEiU6Ofw/DzyNni3sYOT3S78euH1EE79Z6M1V0elQauY1t49Po+NuPs32Xvuv650+BSMT/')));

Nicht die Art von Lösung, die ich gerne lese (noch eine Base-64 / gzip, einfach großartig), aber ich sehe wirklich keinen Grund, warum Sie alleine damit eine negative Antwortnote verdienen würden. Aufgestimmt, um ein Gleichgewicht zu bringen; wer downvoted wird gebeten, uns mitzuteilen, warum.
JB

Viele haben eine komprimierte Lösung bereitgestellt, deshalb habe ich mich nur zum Spaß dazu entschlossen, auch eine zu verwenden. Aber mein ursprünglicher Code ist auch veröffentlicht, sodass ich nicht sehe, wo das Problem liegt. Ignorieren Sie einfach den gezippten. Ich würde auch gerne wissen, warum ich abgelehnt wurde.
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++;}}

Keine Warnung mehr beim Kompilieren.


1

Java, 608

Erster Beitrag auf Stack Exchange, zweiter Versuch dieses Problems.

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 ist für Aufgaben wie diese etwas umständlich, aber durch die Verwendung von split konnte der String-Overhead verringert werden.


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

Probieren Sie es online!

Wenn nachfolgende Zeilenumbrüche zulässig sind, können Sie vier Bytes speichern:

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

Probieren Sie es online!

Erläuterung

/// ist eine Sprache, in der die einzige Operation eine sich selbst ändernde Ersetzung ist. Insbesondere /abc/xyz/ersetzt der Befehl alle Instanzen von abcmit xyzim Rest des Quellcodes, einschließlich anderer Ersetzungen. Alle anderen Zeichen werden einfach an STDOUT ausgegeben.

Während dies für die Turing-Vollständigkeit ausreicht, besteht das Golfen in /// der Regel darin, mit der beabsichtigten Ausgabe zu beginnen und wiederholte Teilfolgen zu identifizieren, die durch Abkürzungen mit einzelnen Zeichen ersetzt werden können.

\kann als Escapezeichen in Mustern, Ersetzungen und Literalzeichen verwendet werden, um ein Literal /oder zu bedeuten \.


Die erste Anweisung ist /|/\/\//. Dies bedeutet "alles |durch //den Rest des Programms ersetzen ". Dies erspart ein Byte für jede nachfolgende Ersetzung im Programm.


Danach werden einige Ersetzungen vorgenommen, um den Text selbst zu komprimieren:

  • on the wird ^.
  • day of christmas \n my true love gave to me \nwird %.
  • -a-wird =.
  • ingwird &.
  • evenwird *.
  • th%wird +.
  • ^davor stehen zwei Zeilenumbrüche (die in jedem Vers außer dem ersten vorkommen) :.

Anschließend schreiben wir die Texte selbst. Dies geschieht durch Ersetzungen Adurch K. Jede Buchstabenersetzung fügt der Ersetzung danach eine Zeile hinzu. Zum Beispiel Krepräsentiert a partridge in a pear treeund Jrepräsentierttwo turtle doves \n and K .

Auf diese Weise besteht jeder Vers des Liedes aus:

  • ^ oder :
  • Eine Zeichenfolge, die die richtige Ordnungszahl darstellt (z. B. el*th)
  • %
  • Ein Adurchgehender Buchstabe steht Kfür den richtigen Text.

Da jedoch die meisten Ordnungszahlen auf enden th, verwenden wir die Ersetzung th%+, um einige Bytes zu sparen.


0

Es gibt Zeiten, in denen die naheliegendste Lösung auch die kürzeste ist, dh ich konnte diesem Drang nicht länger widerstehen.

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

Eine neue Zeile zur besseren Lesbarkeit hinzugefügt.


3
Wenn dies eine gültige Lösung ist, habe ich eine noch kürzere in HQ9 + C geschrieben. (Das ist HQ9 + mit einem zusätzlichen Befehl. Sie können erraten, was es tut.)
Ilmari Karonen

1
Ich überlegte, ob ich den Perl-Code mit dem eval compressTrick verschleiern könnte, um zu behaupten, ich hätte einen Regex gefunden, der sich wirklich gut komprimieren lässt, der aber rund 200 Zeichen aufblähte. lol
Jeff Burdges

Das Video funktioniert nicht ... benutze auch x.co , es ist der kürzeste URL- Shortener , den ich kenne

0

Java - 1329 Zeichen

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

Ich bin zu faul, um es zu entgolfen, aber es ist hier: http://ideone.com/MU9IcP .


-2

EINFACH , 1 Byte

a

Hinweis :

Die Sprache wurde nach der Herausforderung entworfen und ist immer noch eine WIP.

Wie :

Jedes Zeichen gibt die 12 Weihnachtstage aus.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.