Lirik 12 Days of Christmas


17

Saya pikir ini akan menjadi tantangan yang menyenangkan bagi semua orang dan saya penasaran melihat solusi yang dihasilkan orang.

Cetak lirik "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.

Aturan

  • Anda tidak perlu khawatir tentang kapitalisasi; seluruh teks dapat menjadi case-sensitive
  • Anda dapat dengan bijaksana mengabaikan tanda baca apa pun: tanda hubung dapat berupa spasi, dan koma dan titik dapat diabaikan
  • Harus ada garis kosong di antara setiap ayat
  • Anda harus menyusun nomor Anda: " hari pertama Natal", " Empat burung pemanggil", dll

3
Bisakah Anda memberikan versi lengkap dari setiap baris? Saya sudah terbiasa dengan "cinta sejati saya yang diberikan kepada saya" dan penggunaan berbagai versi dapat memengaruhi solusi.
Matius Baca

Lirik lengkap yang diperbarui.
macek

Apakah itu "Anda dapat menjatuhkan huruf besar" atau "seluruh teks tidak peka huruf besar-kecil" semacam tidak mengkhawatirkan kapitalisasi?
JB

Juga, di baris mengabaikan tanda baca, bisakah kita menukar tanda baca untuk spasi putih (dan secara timbal balik)?
JB

1
@ Macek: lebih baik, tapi sisi laten dari pertanyaan saya adalah: dapatkah saya mencetak tanda hubung bukan spasi juga?
JB

Jawaban:


23

Brainfuck - 2,974

Saya agak bangga dengan yang ini. Kedengarannya seperti angka yang cukup besar, tetapi perlu diingat, saya tidak menggunakan perpustakaan kompresi eksternal, dan tidak ada teks asli di program saya di mana pun. Tak satu pun dari kiriman lainnya yang bisa mengatakan itu. Ini semua kode tangan. Lebih banyak generator teks yang naif memberi lebih dari 39k untuk teks ini, jadi saya akan mengatakan ini adalah peningkatan yang signifikan.

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

Sayangnya, ini sekitar 600 karakter lebih panjang dari outputnya sendiri, tetapi apa pun itu. Itu membuat karakter c, h, m, r, w dalam array, dan menggunakannya untuk mencetak semua teks. Dua array di sebelah kanan dua belas spasi, masing-masing melacak hari apa kita menghitung, dan untuk item mana kita bisa menampilkan. Saya mungkin bisa mengoptimalkannya sedikit dengan mengatur ulang peta memori untuk membawa karakter pencetakan di antara dua array penghitungan untuk menghindari rantai panjang <<<<<<<dan >>>>>>, tetapi itu akan banyak pekerjaan pada saat ini. Saya juga mungkin bisa memilih beberapa karakter seed yang lebih baik dengan analisis frekuensi untuk meminimalkan kenaikan / penurunan, tetapi apa pun.

Ini tergantung pada sel pembungkus 8-bit untuk bekerja dengan baik.

Tidak Disatukan:

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

[>+>+>+>+>+<<<<<-]++++++++++
>>[+++++>]<<<[+++++>]<<[+++++>]<+++++>>
++++[<++++++++>-]
++++++++++++>+>+>>>>>>>>>>>>>+<<<<<<<<<<<<<<<
[ 
   <<<<++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
Saya akan mentolerir komentar sebaris tentang pengiriman sebesar itu (tidak dihitung untuk skor golf). +1 tetap saja.
JB

Tentu saja. Menambahkan versi yang tidak diklik. Untuk angka hari hanya satu bit yang ditetapkan dari dua belas, dan setelah mengeluarkannya menetapkan sedikit hari berikutnya. Untuk item, di sebelah baris terakhir set n bit berturut-turut tinggi dan semua aktif mendapatkan output.
captncraig

10

Perl, 438 291 karakter

Terinspirasi oleh Jeff Burdges yang menggunakan kompresi DEFLATE , kode Ruby terkompresi Ventero dan JB menggunakan Lingua :: EN :: Numbers , saya berhasil mengompres entri saya menjadi 291 karakter (yah, byte) termasuk kode dekompresi. Karena program ini mengandung beberapa karakter yang tidak dapat dicetak, saya telah menyediakannya dalam format MIME Base64 :

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

Untuk menghapus kode program, Anda dapat menggunakan skrip Perl pembantu berikut:

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

Simpan output dalam file bernama 12days.pldan jalankan dengan perl -M5.01 12days.pl. Seperti disebutkan, Anda harus menginstal modul Lingua :: EN :: Numbers agar kode dapat berfungsi.

Jika Anda bertanya-tanya, bagian kode yang dapat dibaca terlihat seperti ini:

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

di mana ...kepanjangan dari 254 byte dari RFC 1950 kode Perl terkompresi. Tanpa kompresi, kodenya panjangnya 361 karakter dan terlihat seperti ini:

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

Menulis kode ini adalah jenis latihan golf yang aneh: ternyata pengulangan memaksimalkan dan meminimalkan jumlah karakter berbeda yang digunakan jauh lebih penting daripada meminimalkan jumlah karakter mentah ketika metrik yang relevan adalah ukuran setelah kompresi .

Untuk memeras beberapa karakter terakhir, saya menulis sebuah program sederhana untuk mencoba variasi kecil dari kode ini untuk menemukan kode yang paling kompres. Untuk kompresi, saya menggunakan utilitas KZIP Ken Silverman , yang biasanya menghasilkan rasio kompresi yang lebih baik (dengan biaya kecepatan) daripada Zlib standar bahkan pada pengaturan kompresi maksimum. Tentu saja, karena KZIP hanya membuat arsip ZIP, saya kemudian harus mengekstrak aliran DEFLATE mentah dari arsip dan membungkusnya dalam header dan checksum RFC 1950. Berikut kode yang saya gunakan untuk itu:

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

Jika ini terlihat seperti kluge yang mengerikan, itu karena memang seperti itu.


Untuk kepentingan sejarah, inilah solusi 438-char asli saya, yang menghasilkan output yang lebih bagus, termasuk jeda baris dan tanda baca:

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

Sorotan dari versi ini adalah sepasang regexps s/e?t? .*/th/,s/vt/ft/, yang menyusun tata cara untuk 4 hingga 12 dari para kardinal di awal garis hadiah.

Kode ini, tentu saja, juga dapat dikompres menggunakan trik Zlib yang dijelaskan di atas, tetapi ternyata dengan mengompresi output lebih efisien, menghasilkan program 338-byte berikut (dalam format Base64, lagi):

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

Saya juga memiliki arsip gzip 312 byte lirik, dibangun dari aliran DEFLATE yang sama. Saya kira Anda bisa menyebutnya "skrip zcat". :)


Sepertinya Anda dapat mengganti ringsdengan rGsuntuk menyimpan 2 karakter
macek

@macek: Dalam versi asli saya saya tidak bisa, karena saya mengganti Gdengan ing,, tetapi ternyata bahwa menambahkan koma kemudian memang lebih pendek. Terima kasih!
Ilmari Karonen

Bagaimana Anda menghindari kesalahan 'modifikasi nilai hanya baca'?
Jeff Burdges

@JeffBurdges: Dalam versi aslinya? Dengan menetapkan string ke array terlebih dahulu.
Ilmari Karonen

"Modifikasi nilai hanya baca yang dicoba di /opt/local/lib/perl5/5.12.3/Compress/Zlib.pm baris 357." Saya menghindari masalah ini dengan menetapkan $_pembaruan saya di bawah.
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))

Fasilitas builtin untuk memformat ordinal sangat membantu, tetapi sebagian besar kompresi berasal dari kemampuan untuk menggunakan daftar argumen yang sama berulang-ulang, melompati argumen yang semakin sedikit di setiap run.

Sebagaimana dibuktikan oleh coredump dalam komentar, fasilitas builtin masih dapat dimanfaatkan dengan baik untuk para kardinal.


Mungkin Anda bisa mengompres sedikit lebih banyak mengingat bahwa garis-garis mulai dengan "dua belas", "sebelas", "sepuluh", ...
coredump

Mungkin ini. Apa saranmu?
JB

1
Pertama saya berharap bahwa jumlah argumen yang tersisa dapat digunakan, tetapi saya membaca spek dan saya tidak bisa melakukannya. Kekurangan yang saya miliki adalah 333 karakter:(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

Sekarang kita bicara. Mimpi saya adalah berbagi skip counter dengan ordinal, tetapi saya belum menemukan cara singkat untuk melakukan itu.
JB

7

JavaScript 570

Ini adalah kali pertama saya bermain 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);}

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

Namun, saya meletakkan tanda 'dan' di baris yang sama dengan merpati bukannya partridge.


1
Anda membuat kesalahan pengejaan yang sama dengan saya: ini "keduabelas"
Andrew Shepherd

Nah, itu menyelamatkan saya karakter lain kalau begitu ... Terima kasih!
Daan

5

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

atau dalam bentuk yang lebih mudah dibaca (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

ada yang punya ide bagaimana untuk menghindari pembalikan? saya tidak bisa menemukan solusi


Saya suka trik Anda dengan * untuk mewakili "ing". Anda harus dapat menurunkannya menjadi sekitar 440 dengan: gunakan 12.timesalih-alih (0..11).each; lakukan satu put dengan dua argumen, bukan dua put dengan satu argumen; gunakan notasi% w () untuk susunan hari-Natal. Akhirnya, Anda dapat menyingkirkan yang terbalik dengan membalik daftar, menambahkan ^ tambahan di akhir string, dan kemudian menggunakan [-i..-1]sebagai ganti [0..i].
Wayne Conrad

tidak bisakah Anda mengubah "drum" menjadi "drumm *"?
undergroundmonorail

5

Perl, 500 485

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

Ini adalah upaya pertama saya, dan saya yakin itu bisa dibuat jauh lebih pendek. Jeda baris adalah untuk keterbacaan. Itu memiliki tiga susunan penting, satu di antaranya memegang nama untuk setiap hari @s, satu di antaranya mencantumkan semua hadiah (kecuali yang pertama) @a, dan satu yang mencantumkan hadiah apa yang telah diberikan @b. Mekanisme utamanya adalah bahwa setiap hari, ia mencetak @bdan kemudian mentransfer satu hadiah tambahan dari @ake @b.

Terima kasih kepada Andrew untuk 500-> 485


Anda dapat menggantinya ringsdengan r$1suntuk menyimpan 1 lagi char
macek

@ Macek Saya tidak bisa melakukan itu karena perl akan menafsirkan ssebagai bagian dari nama variabel, dan variabel $istidak ada. (Mereka sebenarnya saya bukan yang, btw)
PhiNotPi

eigth->eighth
Matius Baca

Anda bisa menggantinya $idengan, katakanlah, $;untuk menyiasatinya. Tidak ada yang menggunakan $;untuk tujuan yang dimaksudkan pula.
Ilmari Karonen

@IlmariKaronen Saya menerima saran Anda, tetapi memperbaiki kesalahan ketik, sehingga jumlah karakter tetap sama.
PhiNotPi

5

Vim - 578 penekanan tombol

Saya memutuskan untuk mencoba dan golf-vim ini, karena ini adalah jenis hal yang dapat golf-vim.

Mulailah dengan memasukkan kerangka kerja - garis "X hari Natal" sebanyak 12 kali (89 penekanan tombol):

                                         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

Kemudian, lakukan serangkaian makro yang akan memasukkan angka 2 hingga 12 di masing-masing tempat yang mereka perlukan untuk liriknya (172 penekanan tombol):

                                      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" pada baris kedua adalah untuk menghilangkan yang pertama "dan", karena tidak pergi ke sana.

Kemudian, lakukan serangkaian penggantian untuk sejumlah hal yang diberikan cinta sejati (319 penekanan tombol):

                                       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

Dan akhirnya, mengganti setiap kemunculan Xdengan nomor urut:

                         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

Dan kita selesai!


Saya yakin ada optimasi lain yang saya lewatkan, tapi saya pikir itu cukup bagus.


Uh oh, saya lupa lolos.
Joe Z.

Anda dapat meninggalkan / g dengan substitusi, seperti ini::%s/2/two turtle doves,
therealfarfetchd

4

C (644)

Count tidak termasuk spasi putih yang digunakan untuk presentasi.

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

Outputnya seperti:

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

Terimakasih kepada Daan untuk gagasan memisahkan string yang digabungkan.

Saya awalnya menyertakan pernyataan switching untuk mendapatkan "dan" di partridge untuk semua kecuali ayat pertama. Tetapi, karena pertanyaan membebaskan kita dari tanda baca, kita bisa menambahkan "dan" ke merpati.

Ini menghasilkan umpan baris sebagai berikut:

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

Keduabelas, bukan keduabelas.
Joey Adams

@ Joey Adams - Terima kasih telah mengoreksi saya dan memberi saya satu karakter lebih sedikit :-)
Andrew Shepherd

4

Perl, 368 389 (tidak ada kode / kompresi)

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

Harnesses Lingua :: EN :: Numbers , meskipun saya tidak 100% yakin itu ide yang baik ketika saya melihat modul dan panjang nama pengenalnya. Membutuhkan Perl 5.10 atau lebih baru, jalankan dari baris perintah dengan sebuah -Esaklar.

Sunting: peningkatan kecil: berhenti menggunakan larik, gunakan $_spasi yang lebih baik dan tidak dibutuhkan.


+1, Keren! Seseorang mungkin mengeluh tentang penggunaan modul non-standar, tetapi jika kita mengizinkan bahasa apa pun untuk digunakan (termasuk yang bertujuan khusus seperti GolfScript), saya tidak melihat mengapa "Perl + Lingua :: EN :: Numbers" wouldn ' t menjadi bahasa yang valid untuk suatu solusi. Menulis modul "Acme :: 12Days" dan mengirimkannya ke CPAN mungkin curang. :)
Ilmari Karonen

@Ilmari Karonen ketika orang mengeluh, saya biasanya mengubah nama bahasa menjadi "CPAN". Tidak sering terjadi.
JB

2
Ilmari, Golfscript bukan bahasa tujuan khusus.
Joey

2
Lebih mirip bahasa "tidak sengaja umum" -tujuan: D
JB

1
Tuan yang terhormat, mengapa orang tidak bisa golf kode mereka lagi?
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})]

Ini mencetak lirik seperti yang diberikan dalam pertanyaan dengan beberapa baris per ayat. Kami dapat menyimpan beberapa karakter jika persyaratan itu tidak ada.


+1 Omong kosong. Anda dapat menggunakannya dengan umpan baris serta tanda "Dan" muncul di baris terakhir.
Andrew Shepherd

Yah, mencetak teks yang berbeda tidak pernah menjadi pilihan, dan "Dan" di baris terakhir menggunakan trik yang sama seperti orang lain. Namun, saya ingin mempertahankan jeda baris yang solusi lain tidak (sementara lebih lama juga).
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

Jawa, 2062

Saya tahu ini diposting beberapa waktu yang lalu, tetapi saya pikir saya akan mencoba. Saya seorang siswa dan masih baru dalam hal ini tetapi tampaknya berhasil.

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

}

Hai Gina, selamat datang di situs ini!
Tynam

3
Selamat atas solusi pertama; bekerja dengan baik. Kontes dengan golf kode adalah 'kode sesingkat mungkin', jadi standar di situs ini untuk melakukan beberapa hal yang tidak akan pernah Anda lakukan dalam kode normal: potong variabel dan nama fungsi menjadi satu karakter, potong spasi, dan beberapa hal lainnya. (Tidak apa-apa, dan diharapkan, untuk juga menyertakan versi lengkap seperti yang Anda lakukan di sini untuk membuat pendekatan lebih jelas.) Setelah melakukan itu, Anda kemudian dapat bertanya pada diri sendiri: "bagaimana saya bisa membuat ini lebih pendek?"
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.")}

Anda bisa menempel ini di taman bermain.

Saya mencoba memindahkan vke perintah cetak dan mendapatkan:

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, terkompresi, 321 karakter

Karena kode berisi karakter yang tidak dapat dicetak, saya akan memposting hexdump kode sebagai gantinya:

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                                       '

Untuk membuat kode aktual dari hexdump, masukkan ke dalam file dan jalankan xxd -r hexdump > 12days.rb . Kemudian mengeksekusi ruby1.9.3 12.days.rbakan menjalankan kode dan mencetak lirik. Perhatikan bahwa kode ini memerlukan Ruby 1.9.3 (karena menggunakan Zlib.inflate), sehingga tidak akan berfungsi dengan Ruby 1.8.x, 1.9.1 dan 1.9.2.

Kode yang tidak terkompresi adalah 425 karakter:

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

Ide: Buka kompresi dan evaluasi solusi Lingua :: EN :: Numbers JB.

Pertama, rekatkan blok teks ini ke dalam perintah perl -e 'use MIME::Base64; print decode_base64 $_ while <>;' >12days.pl. Selanjutnya, jalankan perintah 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==

Script itu sendiri mengambil bentuk di use Compress::Zlib;$_='...';eval uncompress$_;mana ...solusi char 368 JB setelah dikompresi dengan perintah ini dan melarikan diri a '.

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

Skrip Ilmari mengeluh tentang memodifikasi nilai hanya baca tanpa $_=...;karakter tambahan , tetapi mungkin dia akan membuat ini 313 . Anda bisa menghemat beberapa byte lagi dengan mengubah kompresi secara manual seperti yang dilakukan Ilmari sebelumnya, mungkin mencapai 310 atau lebih , tapi saya tidak repot.


Perl, 376 (menipu kiriman lain) [kiriman asli saya]

Pertama, buat skrip perl yang disebut 12days.plmengandung:

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

Selanjutnya, masukkan output dari pengajuan lain ke 12days.txtdan jalankan perintah:

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

Vola 12days.plsekitar 376 byte dan mencetak lagu. ;) Mengasyikkan menggunakan gerakan rawinflate tepat enam byte dari data doc ke dalam kode mulai dari output Ilmari.

Saya awalnya mulai mencari modul pengkodean Huffman secara langsung, yang hampir tidak jujur. Namun, sayangnya CPAN tidak memiliki modul dengan tabel entropi huruf bahasa Inggris, yang benar-benar Anda inginkan ketika mengompresi string yang sangat pendek.

Saya menemukan bahwa fortune -m Days\ of\ Christmasitu tidak berhasil, sayangnya.


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

Mengurangi panjang dengan kompresi, 502

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

Bukan jenis solusi yang saya suka baca (basis-64 / gzip lain, hanya hebat), tapi saya benar-benar tidak melihat alasan mengapa Anda sendiri yang pantas mendapatkan skor jawaban negatif dengan itu. Dipilih untuk membawa keseimbangan; siapa pun yang downvoted diminta untuk memberi tahu kami alasannya.
JB

Banyak yang telah memberikan solusi terkompresi jadi hanya untuk bersenang-senang saya memutuskan untuk memasukkannya juga. Tetapi kode asli saya diposting juga, jadi saya tidak melihat apa masalahnya. Abaikan saja yang di-gzip. Saya juga ingin tahu mengapa saya direndahkan.
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++;}}

Tidak ada lagi peringatan saat kompilasi.


1

Java, 608

Posting pertama di Stack Exchange, upaya kedua untuk masalah ini.

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 sedikit rumit untuk tugas-tugas seperti ini, tetapi menggunakan split membantu mengurangi overhead String.


1

/// , 439 byte

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

Cobalah online!

Jika membuntuti baris baru diizinkan, Anda dapat menyimpan empat byte:

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

Cobalah online!

Penjelasan

/// adalah bahasa di mana satu-satunya operasi adalah substitusi yang memodifikasi sendiri. Secara khusus, instruksi /abc/xyz/menggantikan semua instance abcdenganxyz di sisa kode sumber, termasuk substitusi lain .. Karakter lain hanya output ke STDOUT.

Meskipun ini cukup untuk penyelesaian Turing, bermain golf di /// umumnya terdiri dari mulai dengan output yang diinginkan dan mengidentifikasi substring yang berulang yang dapat diganti dengan pintasan satu karakter.

\dapat digunakan sebagai karakter pelarian dalam pola, penggantian, dan karakter literal yang berarti literal /atau \.


Instruksi pertama yang ditemui adalah /|/\/\//. Ini berarti "ganti semua |dengan //sisa program." Ini menghemat satu byte untuk setiap penggantian berikutnya dalam program.


Setelah ini, serangkaian penggantian dibuat untuk mengompresi teks itu sendiri:

  • on the menjadi ^.
  • day of christmas \n my true love gave to me \nmenjadi %.
  • -a-menjadi =.
  • ingmenjadi &.
  • evenmenjadi *.
  • th%menjadi +.
  • ^didahului oleh dua baris baru (yang muncul di setiap ayat tetapi yang pertama) menjadi :.

Setelah ini, kami menulis lirik sendiri. Ini dilakukan dengan menggunakan penggantian Amelalui K. Setiap penggantian huruf menambahkan baris ke penggantian setelah itu. Misalnya, Krepresentasikan a partridge in a pear treedan Jrepresentasikantwo turtle doves \n and K .

Dengan cara ini, setiap bait lagu terdiri dari:

  • ^ atau :
  • String yang mewakili tata cara yang benar (katakanlah, el*th)
  • %
  • Sebuah surat Amelalui Kyang mewakili lirik yang benar.

Namun, karena sebagian besar tata cara berakhir th, kami menggunakan subtitusi th%+untuk menghemat beberapa byte.


0

Ada kalanya solusi yang paling jelas juga merupakan yang terpendek, yaitu saya tidak bisa lagi menahan keinginan ini.

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

Satu baris baru ditambahkan untuk dibaca.


3
Jika ini adalah solusi yang valid, maka saya memiliki yang lebih pendek yang ditulis dalam HQ9 + C. (Itu HQ9 + dengan satu perintah tambahan. Anda dapat menebak apa fungsinya.)
Ilmari Karonen

1
Saya menganggap mengaburkan perl satu menggunakan eval compresstrik untuk mengklaim saya menemukan regex yang kompres dengan sangat baik, tetapi itu membengkak sekitar 200 karakter. lol
Jeff Burdges

Video tidak berfungsi ... juga, gunakan x.co , ini adalah pemendek url terpendek yang saya ketahui

0

Jawa - 1329 karakter

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

Saya terlalu malas untuk ungolf, tetapi di sini: http://ideone.com/MU9IcP .


-2

SEDERHANA , 1 byte

a

Catatan :

Bahasa dirancang setelah tantangan dan masih WIP.

Bagaimana:

Setiap arang akan menghasilkan 12 hari Natal.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.