12 Days of Christmas Lyrics

17

Pomyślałem, że będzie to zabawne wyzwanie dla wszystkich i jestem ciekawy, jakie rozwiązania wymyślają ludzie.

Wydrukuj tekst piosenki „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.

Zasady

  • Nie musisz się martwić o wielkie litery; cały tekst może nie uwzględniać wielkości liter
  • Można rozsądnie zignorować wszelkie znaki interpunkcyjne: łączniki mogą być spacjami, a przecinki i kropki można zignorować
  • Między wierszami powinna znajdować się pusta linia
  • Musisz uporządkować swoje liczby: „ pierwszy dzień świąt”, „ cztery ptaki wzywające” itp
macek
źródło
3
Czy możesz podać pełną wersję każdej linii? Jestem przyzwyczajony do „moja prawdziwa miłość dała mi” i stosowanie różnych wersjach mogą wpływać rozwiązania.
Mateusz
Zaktualizowano pełne teksty.
Macek,
Czy to „można upuścić wielkie litery zdania” czy „cały tekst nie uwzględnia wielkości liter”, nie martwi się o wielkie litery?
JB
Ponadto, w ramach ignorowania interpunkcji, czy możemy zamieniać znaki interpunkcyjne dla białych znaków (i na zasadzie wzajemności)?
JB
1
@macek: lepiej, ale ukryta strona mojego pytania brzmiała: czy mogę również drukować łączniki zamiast spacji?
JB

Odpowiedzi:

23

Brainfuck - 2974

Jestem z tego dość dumny. To brzmi jak całkiem spora liczba, ale należy pamiętać, że nie użyłem żadnych zewnętrznych bibliotek kompresji i nigdzie nie ma oryginalnego tekstu w moim programie. Żaden z pozostałych wniosków nie może tego powiedzieć. To wszystko jest ręcznie kodowane. Bardziej naiwne generatory tekstu dają ponad 39 000 dla tego tekstu, więc powiedziałbym, że jest to znaczna poprawa.

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

Niestety jest to około 600 znaków dłuższych niż jego własne wyjście, ale cokolwiek. Utrzymuje znaki c, h, m, r, w tablicy i używa go do wydrukowania całego tekstu. Dwie tablice po prawej stronie dwunastu pól, każda z nich śledzi, w którym dniu liczymy, i dla których przedmiotów możemy wydać. Być może uda mi się go trochę zoptymalizować, reorganizując mapę pamięci, aby wprowadzić znaki drukujące między dwiema tablicami liczącymi, aby uniknąć takich długich łańcuchów <<<<<<<i>>>>>> , ale w tym momencie byłoby to dużo pracy. Prawdopodobnie mógłbym również wybrać lepsze znaki początkowe z analizą częstotliwości, aby zminimalizować zwiększanie / zmniejszanie, ale cokolwiek.

Zależy to od prawidłowego działania 8-bitowych komórek zawijających.

Nie golfowany:

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

[>+>+>+>+>+<<<<<-]++++++++++
>>[+++++>]<<<[+++++>]<<[+++++>]<+++++>>
++++[<++++++++>-]
++++++++++++>+>+>>>>>>>>>>>>>+<<<<<<<<<<<<<<<
[ 
   <<<<++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
źródło
1
Tolerowałbym wbudowane komentarze na temat zgłoszeń o takim rozmiarze (niepoliczone dla wyniku golfa). W każdym razie daje +1.
JB
Jasne. Dodano wersję bez golfa. Dla liczb dnia ustawia się tylko jeden bit z dwunastu, a po wysłaniu ustawia bit następnych dni. Dla pozycji, obok ostatniego wiersza ustawia n bitów w rzędzie wysoko i wszystkie aktywne uzyskują wynik.
captncraig,
10

Perl, 438 291 znaków

Zainspirowany użytku Jeff Burdges męska kompresji DEFLATE , skompresowanego kodu Ventero za Ruby i użytkowania JB dnia Lingua :: PL :: Liczb , udało mi się ściskać moją pozycję w dół do 291 znaków (dobrze, bajty) włącznie z kodem dekompresji. Ponieważ program zawiera niektóre niedrukowalne znaki, podałem go w formacie MIME Base64 :

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

Aby odkodować program, możesz użyć następującego skryptu Perl pomocnika:

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

Zapisz wynik w pliku o nazwie 12days.pli uruchom go perl -M5.01 12days.pl. Jak wspomniano, aby kod działał , musisz mieć zainstalowany moduł Lingua :: EN :: Numbers .

Jeśli się zastanawiasz, czytelna część kodu wygląda tak:

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

gdzie ...oznacza 254 bajty RFC 1950 skompresowanego kodu Perl . Kod nieskompresowany ma 361 znaków i wygląda następująco:

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

Pisanie tego kodu było dziwnym rodzajem ćwiczenia w golfa: okazuje się, że maksymalizowanie powtórzeń i minimalizowanie liczby użytych znaków są o wiele ważniejsze niż minimalizowanie liczby znaków surowych, gdy odpowiednią miarą jest rozmiar po kompresji .

Aby wycisnąć kilka ostatnich znaków, napisałem prosty program, aby wypróbować małe odmiany tego kodu, aby znaleźć ten, który najlepiej się kompresuje. Do kompresji użyłem narzędzia KZIP Kena Silvermana , które zwykle daje lepsze racje kompresji (kosztem prędkości) niż standardowe Zlib, nawet przy maksymalnych ustawieniach kompresji. Oczywiście, ponieważ KZIP tworzy tylko archiwa ZIP, musiałem wyodrębnić surowy strumień DEFLATE z archiwum i zawinąć go w nagłówek RFC 1950 i sumę kontrolną. Oto kod, którego użyłem do tego:

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

Jeśli to wygląda jak okropny kluge, to dlatego, że właśnie tak jest.


Dla historycznego zainteresowania, oto moje oryginalne rozwiązanie 438-char, które generuje ładniejsze wyjście, w tym podział wierszy i interpunkcję:

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

Najważniejsze w tej wersji para wyrażeń regularnych s/e?t? .*/th/,s/vt/ft/ , które konstruują liczby porządkowe dla 4 do 12 z kardynałów na początku linii prezentu.

Ten kod można oczywiście również skompresować przy użyciu sztuczki Zlib opisanej powyżej, ale okazuje się, że po prostu kompresja danych wyjściowych jest bardziej wydajna, co daje następujący 338-bajtowy program (ponownie w formacie Base64):

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

Mam również 312-bajtowe archiwum gzip tekstów, zbudowane z tego samego strumienia DEFLATE. Przypuszczam, że można to nazwać „skryptem Zcat”. :)

Ilmari Karonen
źródło
Wygląda na to, może zastąpić ringsw rGscelu oszczędzania 2 znaki
Macek
@macek: W mojej wersji oryginalnej nie mogłem, bo byłem zastępując Gz ing,, ale okazuje się, że dodawanie przecinków później rzeczywiście jest krótszy. Dzięki!
Ilmari Karonen
Jak uniknąć błędu „modyfikacji wartości tylko do odczytu”?
Jeff Burdges
@JeffBurdges: W oryginalnej wersji? Najpierw przypisując ciągi do tablicy.
Ilmari Karonen,
„Podjęto próbę modyfikacji wartości tylko do odczytu w /opt/local/lib/perl5/5.12.3/Compress/Zlib.pm linii 357.” Uniknąłem tego problemu, przypisując do $_w mojej aktualizacji poniżej.
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))

Wbudowane funkcje formatowania rzędnych są pomocne, ale większość kompresji wynika z możliwości ciągłego korzystania z tej samej listy argumentów, pomijając coraz mniej argumentów przy każdym uruchomieniu.

Jak udowodniono w rdzeniu w komentarzach, wbudowane urządzenia mogą być nadal dobrze wykorzystywane przez kardynałów.

JB
źródło
Może mógłbyś trochę bardziej skompresować, biorąc pod uwagę, że linie zaczynają się od „dwanaście”, „jedenaście”, „dziesięć”, ...
coredump
Może to jest. Jaka jest twoja sugestia?
JB
1
Najpierw miałem nadzieję, że można wykorzystać pozostałą liczbę argumentów, ale przeczytałem specyfikację i nie mogę tego zrobić. Skróty, które mam, to 333 znaki:(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))
rdzeń
Teraz rozmawiamy. Moim marzeniem byłoby podzielenie się licznikiem pominięć z porządkiem, ale nie znalazłem na to krótkiego sposobu.
JB
7

JavaScript 570

To mój pierwszy raz w golfa. 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
źródło
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:])

Jednak umieszczam „i” na tej samej linii co gołębie zamiast kuropatwy.

Daan
źródło
1
Popełniłeś ten sam błąd ortograficzny co ja: „dwunasty”
Andrew Shepherd,
To oszczędza mi inną postać ... Dzięki!
Daan
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")}

lub w bardziej czytelnej formie (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

ktoś wpadł na pomysł, jak obejść rewers? nie mogłem znaleźć rozwiązania

kev
źródło
Podoba mi się twoja sztuczka z * do reprezentowania „ing”. Powinieneś być w stanie sprowadzić go do około 440 poprzez: użyj 12.timeszamiast (0..11).each; wykonaj pojedynczy put z dwoma argumentami zamiast dwóch putów z jednym argumentem; użyj notacji% w () dla tablicy dni świątecznych. Wreszcie możesz pozbyć się rewersu, odwracając listę, dodając dodatkowe ^ na końcu łańcucha, a następnie używając [-i..-1]zamiast [0..i].
Wayne Conrad
nie możesz zmienić „perkusji” na „perkusję *”?
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"
}

To moja pierwsza próba i jestem pewien, że można by ją znacznie skrócić. Podziały linii służą do czytelności. Ma trzy ważne tablice, z których jedna zawiera nazwę na każdy dzień @s, z których jedna zawiera listę wszystkich prezentów (z wyjątkiem pierwszej) @a, a druga zawiera listę prezentów, które zostały już przekazane @b. Głównym mechanizmem jest to, że każdego dnia drukuje, @ba następnie przesyła jeden dodatkowy prezent od @ado@b .

Podziękowania dla Andrew za 500-> 485

PhiNotPi
źródło
można zastąpić ringsz r$1szaoszczędzić 1 więcej char
Macek
@macek Nie mogę tego zrobić, ponieważ Perl zinterpretuje to sjako część nazwy zmiennej, a zmienna $isnie istnieje. (Tak naprawdę to ja zamiast nich, btw)
PhiNotPi
eigth->eighth
Matthew Read
Możesz zastąpić $i, powiedzmy, $;obejść to. $;Zresztą i tak nikt nigdy nie korzysta z tego celu.
Ilmari Karonen,
@IlmariKaronen Wziąłem twoją radę, ale poprawiłem literówkę, więc liczba znaków pozostała taka sama.
PhiNotPi
5

Vim - 578 naciśnięć klawiszy

Postanowiłem spróbować grać w golfa vim, ponieważ jest to coś, co można grać w golfa vim.

Zacznij od wstawienia frameworka - linia „X dzień świąt Bożego Narodzenia” łącznie 12 razy (89 naciśnięć klawiszy):

                                         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

Następnie wykonaj serię makr, które wstawią cyfry od 2 do 12 w odpowiednich miejscach, w których powinny znajdować się teksty (172 naciśnięcia klawiszy):

                                      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

„Dw” w drugiej linii ma pozbyć się pierwszego „i”, ponieważ tam nie idzie.

Następnie wykonaj serię zamian za liczbę rzeczy, które dała prawdziwa miłość (319 naciśnięć klawiszy):

                                       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

I na koniec, zastępując każde wystąpienie Xliczbą porządkową:

                         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

I skończone!


Jestem pewien, że istnieją inne optymalizacje, które przegapiłem, ale myślę, że to całkiem niezłe.

Joe Z.
źródło
Och, zapomniałem ucieczek.
Joe Z.
Możesz pominąć / g z podstawieniami w następujący sposób::%s/2/two turtle doves,
2xsaiko
4

C (644)

Liczba nie obejmuje białych znaków używanych do prezentacji.

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

Wyjście jest jak:

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
źródło
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' '
        )
    )
 }

Dziękuję Daanowi za pomysł podzielenia połączonego łańcucha.

Pierwotnie zawarłem zdanie przełączające, aby uzyskać „i” na kuropatwie dla wszystkich wierszy oprócz pierwszego. Ponieważ jednak pytanie uwalnia nas od interpunkcji, możemy po prostu dołączyć „i” do gołębi.

Powoduje to następujące informacje:

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
źródło
Dwunasty, nie dwunasty.
Joey Adams,
@Joey Adams - Dziękuję za poprawienie mnie i nadanie mi jednej postaci :-)
Andrew Shepherd,
4

Perl, 368 389 (bez Unicode / kompresji)

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

Uprzęże Lingua :: EN :: Numbers , choć nie jestem w 100% przekonany, że to dobry pomysł, kiedy widzę długości nazw modułów i ich identyfikatorów. Wymaga Perla 5.10 lub nowszego, uruchom z wiersza poleceń za pomocą -Eprzełącznika.

Edycja: drobne ulepszenia: przestań używać tablicy, lepsze wykorzystanie $_, niepotrzebne białe znaki.

JB
źródło
+1, super! Ktoś może narzekać na użycie niestandardowego modułu, ale jeśli zezwalamy na użycie dowolnego języka (w tym języków specjalnego przeznaczenia, takich jak GolfScript), nie rozumiem, dlaczego „Perl + Lingua :: EN :: Numbers” nie miałby być poprawnym językiem dla rozwiązania. Jednak napisanie modułu „Acme :: 12Days” i przesłanie go do CPAN prawdopodobnie oszukuje. :)
Ilmari Karonen,
@Ilmari Karonen, kiedy ludzie narzekają, zwykle zmieniam nazwę języka na „CPAN”. Nie zdarza się często.
JB
2
Ilmari, Golfscript nie jest językiem specjalnego przeznaczenia.
Joey,
2
Bardziej jak „przypadkowo ogólny” język: D
JB,
1
Dobry Boże, dlaczego ludzie nie mogą już grać w swój własny kod?
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})]

To drukuje słowa podane w pytaniu z wieloma liniami na wiersz. Możemy zapisać kilka znaków, jeśli nie ma takiego wymagania.

Joey
źródło
+1 bzdura Holey. Masz to działa z kanałami, a także „I” pojawiające się w ostatnim wierszu.
Andrew Shepherd,
Cóż, wydrukowanie innego tekstu i tak nigdy nie było opcją, a „I” w ostatnim wierszu używa tej samej sztuczki, jak wszyscy inni. Mimo to chciałem zachować przerwy w linii, których nie rozwiązuje inne rozwiązanie (będąc jednocześnie dłuższym).
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
źródło
2

Java, 2062

Wiem, że to zostało opublikowane jakiś czas temu, ale pomyślałem, że spróbuję. Jestem studentem i wciąż jestem w tym nowy, ale wydaje się, że działa.

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
źródło
Cześć Gina, witam na stronie!
Tynam
3
Gratulujemy pierwszego rozwiązania; działa w porządku. Konkurs z kodem golfowym jest „najkrótszym możliwym kodem”, więc standardem na tej stronie jest robienie kilku rzeczy, których nigdy nie zrobiłbyś w normalnym kodzie: przycinanie nazw zmiennych i funkcji do jednego znaku, wycinanie białych znaków i kilka innych rzeczy. (Jest OK, i spodziewane, że obejmie również pełną wersję, tak jak tutaj, aby uczynić podejście bardziej zrozumiałym.) Po zrobieniu tego możesz zadać sobie pytanie: „jak mogę to skrócić?”
Tynam
2

Szybki, 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.")}

Możesz wkleić to na placu zabaw.

Próbowałem przenieść polecenie vdo polecenia drukowania i uzyskałem:

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
źródło
1

Ruby 1.9.3, skompresowany, 321 znaków

Ponieważ kod zawiera znaki niedrukowalne, zamiast tego opublikuję zrzut heksowy kodu:

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                                       '

Aby utworzyć rzeczywisty kod z zrzutu heksadecymalnego, umieść go w pliku i uruchom xxd -r hexdump > 12days.rb . Następnie wykonanie ruby1.9.3 12.days.rburuchomi kod i wydrukuje tekst. Zauważ, że ten kod wymaga Ruby 1.9.3 (ponieważ używaZlib.inflate ), więc nie będzie działał z Ruby 1.8.x, 1.9.1 i 1.9.2.

Nieskompresowany kod ma długość 425 znaków:

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
źródło
1

Perl, 319/313

Pomysł: rozpakuj i oceń rozwiązanie Jingu Lingua :: EN :: Numbers.

Najpierw wklej ten blok tekstowy do polecenia perl -e 'use MIME::Base64; print decode_base64 $_ while <>;' >12days.pl. Następnie uruchom polecenie 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==

Sam skrypt przybiera formę, w use Compress::Zlib;$_='...';eval uncompress$_;której rozwiązanie ...JB ma znak 368 po skompresowaniu za pomocą tego polecenia i uniknięciu znaku '.

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

Skrypt Ilmari narzeka na modyfikację wartości tylko do odczytu bez dodatkowych $_=...;znaków, ale przypuszczalnie zrobiłby to 313 . Możesz zaoszczędzić jeszcze kilka bajtów, ręcznie dostosowując kompresję, tak jak to robił wcześniej Ilmari, może osiągając około 310 , ale nie zawracałem sobie głowy.


Perl, 376 (oszukuje kolejne przesłanie) [moje oryginalne zgłoszenie]

Najpierw utwórz skrypt perla o nazwie 12days.plzawierający:

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

Następnie potokuj dane wyjściowe z dowolnego innego przesłania 12days.txti wykonaj polecenie:

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

Vola 12days.plma około 376 bajtów i drukuje piosenkę. ;) Zabawne użycie rawinflate przenosi dokładnie sześć bajtów z dokumentu danych do kodu, zaczynając od wyjścia Ilmari.

Początkowo szukałem modułu kodującego Huffmana bezpośrednio, co wcale nie jest tak nieuczciwe. Niestety, CPAN nie ma modułów z angielską tabelą entropii liter, co jest tym, czego naprawdę chcesz, gdy kompresujesz bardzo krótkie ciągi.

Stwierdziłem, że fortune -m Days\ of\ Christmasniestety nie działa.

Jeff Burdges
źródło
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";

Skrócona długość dzięki kompresji, 502

eval(gzuncompress(base64_decode('eNpVkE1u3DAMhfc+BWEI8AzqDtJtg7QHCYKCsWiLrX4MUjPOAD58KE829UIyP5Hge8/lF/pYY/F0GvZhHGYWrbvSVLLfa2Dx+1yuUsM+82yn8kc76UbZbuIl2JW5FfWB4tdb3SjaxHB+dtv/OzB7QFhRqrBfCDi3klCgCtHFJgtU2xkJfLmRmg7jMAvlKUCgrIcmmDBGzgu8m0pDfCNYSvSUQQxr0woLkRLg94h3Yw/hoBtmNagbp9Tw4QMSsm84cfzXqNkiiOiZFDzmqTEzCbHI0RcJ12P6sAwrryTarqPR7JsgL9eUGj5+7MHymIsQTuHkzLeC45df7u+ZplCgLxlqIHD51fGbLb1DmWEKwloT6tilu2V0NVWWC6jlDLVAoq6/aJU/QmvEiU6Ofw/DzyNni3sYOT3S78euH1EE79Z6M1V0elQauY1t49Po+NuPs32Xvuv650+BSMT/')));
Vladimir
źródło
Nie jest to rozwiązanie, które lubię czytać (jeszcze jedna baza-64 / gzip, po prostu świetne), ale naprawdę nie widzę powodu, dla którego ty sam zasługiwałbyś na wynik negatywny. Awansowany, aby przywrócić trochę równowagi; każdy, kto przegłosował, proszony jest o poinformowanie nas o przyczynie.
JB
Wielu dostarczyło skompresowane rozwiązanie, więc dla zabawy postanowiłem je również zastosować. Ale mój oryginalny kod również został opublikowany, więc nie widzę problemu. Po prostu zignoruj ​​ten spakowany. Chciałbym również wiedzieć, dlaczego zostałem przegłosowany.
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++;}}

Nigdy więcej ostrzeżenia przy kompilacji.

MARTIN Damien
źródło
1

Java, 608

Pierwszy post na Stack Exchange, druga próba rozwiązania tego problemu.

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 jest trochę kłopotliwa w przypadku takich zadań, ale użycie podziału pomogło zmniejszyć obciążenie łańcucha.

Ben I.
źródło
1

/// , 439 bajtów

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

Wypróbuj online!

Jeśli dozwolone są końcowe znaki nowej linii, możesz zapisać cztery bajty:

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

Wypróbuj online!

Wyjaśnienie

/// to język, w którym jedyną operacją jest podstawienie samomodyfikujące. W szczególności, instrukcja /abc/xyz/zastępuje wszystkie wystąpienia abcze xyzw pozostałej części kodu źródłowego, łącznie z innymi substytucji .. Wszelkie inne znaki są po prostu wyjście na standardowe wyjście.

Chociaż wystarcza to do kompletności Turinga, gra w golfa w /// zasadniczo polega na rozpoczęciu od zamierzonego wyniku i zidentyfikowaniu powtarzających się podciągów, które można zastąpić skrótami jednoznakowymi.

\może być używany jako znak zmiany znaczenia we wzorach, zamiennikach i literalnych znakach, co oznacza literał /lub \.


Pierwsza napotkana instrukcja to /|/\/\//. To oznacza „zastąpić wszystko |ze //w dalszej części programu.” To oszczędza bajt dla każdego kolejnego podstawienia w programie.


Następnie wykonywany jest zestaw zamienników w celu skompresowania samego tekstu:

  • on the staje się ^.
  • day of christmas \n my true love gave to me \nstaje się %.
  • -a-staje się =.
  • ingstaje się &.
  • evenstaje się *.
  • th%staje się +.
  • ^poprzedzone dwoma znakami nowej linii (które pojawiają się w każdym wersecie oprócz pierwszego) :.

Następnie sami piszemy teksty. Odbywa się to za pomocą zamienników Aza pośrednictwem K. Każda zamiana liter dodaje po niej wiersz do zamiany. Na przykład Kreprezentuje a partridge in a pear treei Jreprezentujetwo turtle doves \n and K .

W ten sposób każdy wiersz piosenki składa się z:

  • ^ lub :
  • Ciąg reprezentujący prawidłową liczbę porządkową (powiedzmy el*th)
  • %
  • List Apoprzez Kktóry reprezentuje poprawne lyrics.

Ponieważ jednak większość rzędnych kończy się th, używamy podstawienia th%→, +aby zapisać niektóre bajty.

Esolanging Fruit
źródło
0

Są chwile, kiedy najbardziej oczywiste rozwiązanie jest również najkrótsze, tzn. Nie mogłem już dłużej oprzeć się tej potrzebie.

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

Dodano jedną nową linię dla czytelności.

Jeff Burdges
źródło
3
Jeśli jest to prawidłowe rozwiązanie, mam jeszcze krótsze rozwiązanie napisane w HQ9 + C. (To HQ9 + z jednym dodatkowym poleceniem. Możesz zgadnąć, co on robi.)
Ilmari Karonen,
1
Zastanawiałem się nad zaciemnieniem perla za pomocą eval compresssztuczki, aby stwierdzić, że znalazłem regex, który naprawdę dobrze się kompresuje, ale który rozdęł około 200 znaków. lol
Jeff Burdges
Film nie działa ... także, użyj x.co , jest to najkrótszy skracacz URL, o którym wiem
0

Java - 1329 znaków

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

Jestem zbyt leniwy, aby go rozholfować, ale jest tutaj: http://ideone.com/MU9IcP .

Hosch250
źródło
-2

PROSTE , 1 bajt

a

Uwaga :

Język został zaprojektowany po wyzwaniu i nadal jest PWT.

W jaki sposób :

Każdy znak wyda 12 dni Bożego Narodzenia.

Muhammad Salman
źródło