Lời bài hát 12 ngày Giáng sinh


17

Tôi nghĩ rằng đây sẽ là một thử thách thú vị cho mọi người và tôi tò mò muốn xem các giải pháp mà mọi người đưa ra.

In lời bài hát "12 ngày Giáng sinh"

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.

Quy tắc

  • Bạn không phải lo lắng về viết hoa; toàn bộ văn bản có thể không phân biệt chữ hoa chữ thường
  • Bạn có thể bỏ qua bất kỳ dấu câu nào: dấu gạch nối có thể là dấu cách và dấu phẩy và dấu chấm có thể được bỏ qua
  • Cần có một dòng trống giữa mỗi câu
  • Bạn phải sắp xếp các số của mình: " ngày đầu tiên của Giáng sinh", " Bốn con chim kêu", v.v.

3
Bạn có thể cung cấp phiên bản đầy đủ của từng dòng? Tôi đã quen với "tình yêu đích thực của tôi dành cho tôi" và việc sử dụng các phiên bản khác nhau có thể ảnh hưởng đến các giải pháp.
Matthew đọc

Cập nhật lời bài hát đầy đủ.
macek

Đó có phải là "bạn có thể bỏ thủ đô câu" hay "toàn bộ văn bản không phân biệt chữ hoa chữ thường" không đáng lo ngại về viết hoa?
JB

Ngoài ra, trong dòng bỏ qua dấu chấm câu, chúng ta có thể trao đổi dấu chấm câu cho khoảng trắng (và đối ứng) không?
JB

1
@macek: tốt hơn, nhưng khía cạnh tiềm ẩn trong câu hỏi của tôi là: tôi có thể in dấu gạch nối thay vì dấu cách không?
JB

Câu trả lời:


23

Brainfuck - 2.974

Tôi khá tự hào về điều này. Nghe có vẻ là một con số khá lớn, nhưng hãy nhớ rằng, tôi đã không sử dụng bất kỳ thư viện nén bên ngoài nào và không có văn bản gốc nào có trong chương trình của tôi ở bất cứ đâu. Không ai trong số các đệ trình khác có thể nói rằng. Đây là tất cả mã hóa tay. Các trình tạo văn bản ngây thơ hơn cung cấp hơn 39k cho văn bản này, vì vậy tôi sẽ nói rằng đây là một cải tiến đáng kể.

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

Thật không may, đây là khoảng 600 ký tự dài hơn đầu ra của chính nó, nhưng bất cứ điều gì. Nó giữ các ký tự c, h, m, r, w trong một mảng và sử dụng nó để in tất cả văn bản. Hai mảng ở bên phải của mười hai khoảng trống, mỗi khoảng theo dõi chúng ta sẽ tính ngày nào và chúng ta có thể xuất các mục nào. Tôi có thể tối ưu hóa nó một chút bằng cách tổ chức lại các bản đồ bộ nhớ để mang lại các nhân vật in ở giữa hai mảng đếm để tránh chuỗi dài như vậy <<<<<<<>>>>>>, nhưng đó sẽ là rất nhiều công việc vào thời điểm này. Tôi cũng có thể chọn một số ký tự hạt giống tốt hơn với phân tích tần số để giảm thiểu tăng / giảm, nhưng bất cứ điều gì.

Điều này không phụ thuộc vào các ô gói 8 bit để hoạt động đúng.

Ung dung:

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

[>+>+>+>+>+<<<<<-]++++++++++
>>[+++++>]<<<[+++++>]<<[+++++>]<+++++>>
++++[<++++++++>-]
++++++++++++>+>+>>>>>>>>>>>>>+<<<<<<<<<<<<<<<
[ 
   <<<<++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
Tôi chấp nhận các nhận xét nội tuyến về nội dung gửi có kích thước đó (không tính cho điểm số golf). + 1 dù sao đi nữa.
JB

Điều chắc chắn. Đã thêm phiên bản chưa được chỉnh sửa. Đối với các số ngày, chỉ một bit được đặt trong số mười hai và sau khi xuất ra, nó sẽ thiết lập bit ngày tiếp theo. Đối với các mục, dòng bên cạnh dòng cuối cùng đặt n bit liên tiếp và tất cả đầu ra nhận hoạt động.
captncraig

10

Perl, 438 chars

Lấy cảm hứng từ việc sử dụng nén DEFLATE của Jeff Burdges , mã Ruby đã nén của Ventersử dụng Lingua :: EN :: Numbers của JB , tôi đã quản lý để nén mục nhập của mình xuống còn 288 ký tự (tốt, byte) bao gồm cả mã giải nén. Vì chương trình chứa một số ký tự không in được, tôi đã cung cấp nó ở định dạng MIME Base64 :

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

Để giải mã chương trình, bạn có thể sử dụng tập lệnh Perl của trình trợ giúp sau:

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

Lưu đầu ra trong một tệp có tên 12days.plvà chạy nó với perl -M5.01 12days.pl. Như đã lưu ý, bạn cần cài đặt mô-đun Lingua :: EN :: Numbers để mã hoạt động.

Trong trường hợp bạn đang tự hỏi, phần có thể đọc được của mã chỉ đơn giản là như thế này:

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

trong đó ...viết tắt của 254 byte mã Perl được nén RFC 1950 . Không nén, mã dài 361 ký tự và trông như thế này:

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

Viết mã này là một loại bài tập golf kỳ lạ: hóa ra sự lặp lại tối đa hóa và giảm thiểu số lượng ký tự riêng biệt được sử dụng quan trọng hơn nhiều so với việc giảm thiểu số lượng ký tự thô khi số liệu có liên quan là kích thước sau khi nén .

Để vắt kiệt vài ký tự cuối cùng, tôi đã viết một chương trình đơn giản để thử các biến thể nhỏ của mã này để tìm ra mã nén tốt nhất. Để nén, tôi đã sử dụng tiện ích KZIP của Ken Silverman , thường mang lại khẩu phần nén tốt hơn (với chi phí tốc độ) so với Zlib tiêu chuẩn ngay cả ở cài đặt nén tối đa. Tất nhiên, vì KZIP chỉ tạo tài liệu lưu trữ ZIP, nên sau đó tôi phải trích xuất luồng DEFLATE thô từ kho lưu trữ và bọc nó trong tiêu đề và tổng kiểm tra RFC 1950. Đây là mã tôi đã sử dụng cho điều đó:

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

Nếu cái này trông giống như một cái kluge khủng khiếp, thì đó chính là nó.


Đối với lợi ích lịch sử, đây là giải pháp 438-char ban đầu của tôi, tạo ra đầu ra đẹp hơn, bao gồm ngắt dòng và chấm câu:

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

Điểm nổi bật của phiên bản này là cặp regexps s/e?t? .*/th/,s/vt/ft/, cấu trúc thứ tự cho 4 đến 12 từ các hồng y ở đầu dòng quà tặng.

Tất nhiên, mã này cũng có thể được nén bằng thủ thuật Zlib được mô tả ở trên, nhưng hóa ra chỉ đơn giản là nén đầu ra hiệu quả hơn, mang lại chương trình 338 byte sau (ở định dạng Base64, một lần nữa):

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

Tôi cũng có một kho lưu trữ gzip 312 byte của lời bài hát, được xây dựng từ cùng một luồng DEFLATE. Tôi cho rằng bạn có thể gọi nó là "kịch bản zcat". :)


Có vẻ như bạn có thể thay thế ringsbằng rGsđể lưu 2 ký tự
macek

@macek: Trong phiên bản gốc của tôi, tôi không thể, bởi vì tôi đã thay thế Gbằng ing,, nhưng hóa ra việc thêm dấu phẩy sau đó thực sự ngắn hơn. Cảm ơn!
Ilmari Karonen

Làm thế nào để bạn tránh lỗi 'sửa đổi giá trị chỉ đọc'?
Jeff Burdges

@JeffBurdges: Trong phiên bản gốc? Bằng cách gán các chuỗi cho một mảng đầu tiên.
Ilmari Karonen

"Đã sửa đổi giá trị chỉ đọc tại /opt/local/lib/perl5/5.12.3/Compress/Zlib.pm dòng 357." Tôi đã tránh vấn đề này bằng cách chỉ định $_trong bản cập nhật của tôi dưới đây.
Jeff Burdges

10

Lisp thường gặp, 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))

Các tiện ích dựng sẵn để định dạng các lệnh là hữu ích, nhưng hầu hết việc nén xuất phát từ việc có thể sử dụng cùng một danh sách đối số, bỏ qua ngày càng ít đối số trong mỗi lần chạy.

Như đã được chứng minh bởi coredump trong các ý kiến, cơ sở vật chất được xây dựng trong vẫn có thể được đưa vào sử dụng tốt cho các hồng y.


Có lẽ bạn có thể nén thêm một chút khi các dòng bắt đầu bằng "mười hai", "mười một", "mười", ...
trích dẫn vào

Có thể nó là. Gợi ý của bạn là gì?
JB

1
Trước tiên tôi hy vọng rằng số lượng đối số còn lại có thể được sử dụng, nhưng tôi đã đọc thông số kỹ thuật và tôi không thể làm điều đó. Các shortes tôi có là 333 ký tự:(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

Bây giờ chúng ta nói chuyện. Ước mơ của tôi sẽ là chia sẻ bộ đếm bỏ qua với thứ tự, nhưng tôi đã không tìm thấy một cách ngắn để làm điều đó.
JB

7

JavaScript 570

Đây là lần đầu tiên tôi chơi 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:])

Tuy nhiên, tôi đặt 'và' trên cùng một dòng với chim bồ câu thay vì partridge.


1
Bạn đã mắc lỗi chính tả giống như tôi: đó là "thứ mười hai"
Andrew Shepherd

Chà, điều đó cứu tôi một nhân vật khác sau đó ... Cảm ơn!
Daan

5

Hồng ngọc (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")}

hoặc ở dạng dễ đọc hơn (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

bất cứ ai có một ý tưởng làm thế nào để phá vỡ .reverse? tôi không thể đưa ra giải pháp


Tôi thích thủ thuật của bạn với * để thể hiện "ing". Bạn sẽ có thể giảm xuống còn khoảng 440 bằng cách: sử dụng 12.timesthay vì (0..11).each; thực hiện một lần đặt với hai đối số thay vì hai lần đặt với một đối số; sử dụng ký hiệu% w () cho mảng ngày Giáng sinh. Cuối cùng, bạn có thể thoát khỏi đảo ngược bằng cách đảo ngược danh sách, thêm ^ vào cuối chuỗi, sau đó sử dụng [-i..-1]thay vì [0..i].
Wayne Conrad

bạn không thể thay đổi "trống" thành "trống *"?
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"
}

Đây là nỗ lực đầu tiên của tôi và tôi chắc chắn rằng nó có thể được thực hiện ngắn hơn rất nhiều. Các ngắt dòng là để dễ đọc. Nó có ba mảng quan trọng, một trong số đó giữ tên cho mỗi ngày @s, một trong số đó liệt kê tất cả các quà tặng (ngoại trừ một trong những món quà đầu tiên) @avà một trong đó liệt kê những món quà đã được tặng @b. Cơ chế chính là mỗi ngày, nó in @bvà sau đó chuyển thêm một món quà từ @ađến @b.

Cảm ơn Andrew vì 500-> 485


bạn có thể thay thế ringsbằng r$1sđể tiết kiệm thêm 1 char
macek

@macek Tôi không thể làm điều đó bởi vì perl sẽ diễn giải snhư là một phần của tên biến và biến $iskhông tồn tại. (Họ thực sự là tôi thay vì những người, btw)
PhiNotPi

eigth->eighth
Matthew Đọc

Bạn có thể thay thế $ibằng, nói, $;để có được xung quanh đó. Không ai từng sử dụng $;cho mục đích dự định của nó nào.
Ilmari Karonen

@IlmariKaronen Tôi đã lấy lời khuyên của bạn, nhưng đã sửa một lỗi đánh máy, vì vậy số lượng nhân vật vẫn giữ nguyên.
PhiNotPi

5

Vim - 578 tổ hợp phím

Tôi quyết định thử và vim-golf này, vì đây là loại có thể là vim-golfed.

Bắt đầu bằng cách chèn khung - dòng "X ngày Giáng sinh" tổng cộng 12 lần (89 lần nhấn phím):

                                         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

Sau đó, thực hiện một loạt các macro sẽ chèn các số từ 2 đến 12 vào các vị trí tương ứng mà chúng cần dành cho lời bài hát (172 tổ hợp phím):

                                      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" trên dòng thứ hai là loại bỏ "và" đầu tiên, bởi vì nó không đi đến đó.

Sau đó, thực hiện một loạt các thay thế cho số lượng những thứ mà tình yêu đích thực đã đưa ra (319 tổ hợp phím):

                                       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

Và cuối cùng, thay thế mỗi lần xuất hiện Xbằng một số thứ tự:

                         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

Và chúng ta đã hoàn thành!


Tôi chắc chắn có những tối ưu hóa khác mà tôi đã bỏ lỡ, nhưng tôi nghĩ rằng bản thân nó khá tốt.


Uh oh, tôi quên mất việc trốn thoát.
Joe Z.

Bạn có thể bỏ qua / g với các thay thế, như thế này::%s/2/two turtle doves,
trị liệu

4

C (644)

Đếm không bao gồm khoảng trắng được sử dụng để trình bày.

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

Đầu ra giống như:

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

Quyền hạn, 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' '
        )
    )
 }

Cảm ơn Daan vì ý tưởng chia tách chuỗi kết nối.

Ban đầu tôi đã bao gồm một câu lệnh chuyển đổi để có được "và" trên partridge cho tất cả trừ câu đầu tiên. Nhưng, vì câu hỏi loại bỏ chúng tôi về dấu câu, chúng tôi chỉ có thể nối "và" cho chim bồ câu.

Điều này dẫn đến các nguồn cấp dữ liệu như sau:

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

Thứ mười hai, không phải twelveth.
Joey Adams

@Joey Adams - Cảm ơn bạn đã sửa lỗi cho tôi và cho tôi một nhân vật ít hơn :-)
Andrew Shepherd

4

Perl, 368 389 (không có unicode / nén)

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

Khai thác Lingua :: EN :: Numbers , mặc dù tôi không tin chắc 100% là một ý tưởng hay khi tôi thấy mô-đun và độ dài tên định danh của nó. Cần Perl 5.10 trở lên, chạy từ dòng lệnh bằng một -Ecông tắc.

Chỉnh sửa: cải tiến nhỏ: ngừng sử dụng một mảng, sử dụng tốt hơn $_, khoảng trắng không cần thiết.


+1, tuyệt! Ai đó có thể phàn nàn về việc sử dụng mô-đun không chuẩn, nhưng nếu chúng tôi cho phép sử dụng bất kỳ ngôn ngữ nào (bao gồm cả các mục đích đặc biệt như GolfScript), tôi không hiểu tại sao "Perl + Lingua :: EN :: Numbers" sẽ không ' t là một ngôn ngữ hợp lệ cho một giải pháp. Tuy nhiên, viết một mô-đun "Acme :: 12 ngày" và gửi nó cho CPAN có lẽ là gian lận. :)
Ilmari Karonen

@Ilmari Karonen khi mọi người phàn nàn, tôi thường đổi tên ngôn ngữ thành "CPAN". Không xảy ra thường xuyên.
JB

2
Ilmari, Golfscript không phải là ngôn ngữ có mục đích đặc biệt.
Joey

2
Giống như một ngôn ngữ "vô tình chung chung": D
JB

1
Thưa ngài, tại sao mọi người không thể chơi mã của riêng mình nữa?
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})]

Điều này in lời bài hát như được đưa ra trong câu hỏi với nhiều dòng trên mỗi câu. Chúng tôi có thể lưu một vài ký tự nếu yêu cầu đó không có.


+1 Holey tào lao. Bạn đã làm việc này với các nguồn cấp dữ liệu cũng như "Và" xuất hiện trên dòng cuối cùng.
Andrew Shepherd

Chà, dù sao thì việc in một văn bản khác chưa bao giờ là một lựa chọn, và ở dòng cuối cùng và sử dụng thủ thuật giống như mọi người khác. Tuy nhiên, tôi muốn duy trì ngắt dòng mà giải pháp khác không có (trong khi cũng dài hơn).
Joey

3

C # (528)

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

2

Java, 2062

Tôi biết điều này đã được đăng cách đây một thời gian, nhưng tôi nghĩ tôi sẽ thử. Tôi là một sinh viên và vẫn còn mới với điều này nhưng nó dường như làm việc.

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

}

Xin chào Gina, chào mừng đến với trang web!
Tynam

3
Chúc mừng một giải pháp đầu tiên; hoạt động tốt Cuộc thi với mã golf là 'mã ngắn nhất có thể', do đó, tiêu chuẩn trên trang web này là thực hiện một số điều bạn không bao giờ làm trong mã thông thường: cắt tên biến và hàm thành một ký tự, cắt khoảng trắng và một vài thứ khác. (Không sao, và dự kiến, cũng bao gồm phiên bản đầy đủ như bạn đã làm ở đây để làm cho cách tiếp cận rõ ràng hơn.) Sau khi thực hiện điều đó, bạn có thể tự hỏi: "Làm thế nào tôi có thể làm cho nó ngắn hơn?"
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.")}

Bạn có thể dán cái này trong một sân chơi.

Tôi đã thử chuyển vlệnh in và nhận được:

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, được nén, 321 ký tự

Vì mã chứa các ký tự không in được, thay vào đó tôi sẽ đăng một hexdump của mã:

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                                       '

Để tạo mã thực tế từ hexdump, hãy đặt nó vào một tệp và chạy xxd -r hexdump > 12days.rb. Sau đó thực thi ruby1.9.3 12.days.rbsẽ chạy mã và in lời bài hát. Lưu ý rằng mã này yêu cầu Ruby 1.9.3 (vì nó sử dụng Zlib.inflate), vì vậy nó sẽ không hoạt động với Ruby 1.8.x, 1.9.1 và 1.9.2.

Mã không nén có độ dài 425 ký tự:

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

Ý tưởng: Giải nén và đánh giá Lingua của JB :: Giải pháp số ::.

Đầu tiên, dán khối văn bản này vào lệnh perl -e 'use MIME::Base64; print decode_base64 $_ while <>;' >12days.pl. Tiếp theo, chạy lệnh 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==

Kịch bản thân có dạng use Compress::Zlib;$_='...';eval uncompress$_;nơi ...là giải pháp 368 char JB sau khi được nén bằng lệnh này và thoát một '.

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

Kịch bản Ilmari của than phiền về việc sửa đổi một đọc chỉ có giá trị mà không có thêm $_=...;ký tự, nhưng có lẽ ông muốn làm cho 313 . Bạn có thể tiết kiệm thêm vài byte bằng cách điều chỉnh nén theo cách thủ công như Ilmari đã làm trước đây, có thể đạt được 310 hoặc hơn , nhưng tôi không bận tâm.


Perl, 376 (gian lận trong một đệ trình khác) [đệ trình ban đầu của tôi]

Đầu tiên, tạo một tập lệnh perl được gọi là 12days.plcó chứa:

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

Tiếp theo, dẫn đầu ra từ bất kỳ đệ trình nào khác vào 12days.txtvà thực hiện lệnh:

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

Vola 12days.pllà khoảng 376 byte và in bài hát. ;) Thật thú vị khi sử dụng rawinflate di chuyển chính xác sáu byte từ tài liệu dữ liệu vào mã bắt đầu từ đầu ra của Ilmari.

Ban đầu tôi định tìm kiếm một mô-đun mã hóa Huffman trực tiếp, điều này gần như không trung thực. Tuy nhiên, đáng buồn là CPAN không có mô-đun với bảng entropy chữ cái tiếng Anh, đó là những gì bạn thực sự muốn khi nén các chuỗi rất ngắn.

Tôi thấy rằng fortune -m Days\ of\ Christmasnó cũng không hoạt động, đáng tiếc.


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

Giảm chiều dài khi nén, 502

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

Không phải là loại giải pháp tôi muốn đọc (một cơ sở 64-gzip khác, chỉ tuyệt vời), nhưng tôi thực sự thấy không có lý do tại sao một mình bạn lại xứng đáng nhận được điểm trả lời tiêu cực với điều đó. Nâng cao để mang lại một số cân bằng; bất cứ ai bị hạ cấp được yêu cầu thông báo cho chúng tôi lý do tại sao.
JB

Nhiều người đã cung cấp một giải pháp nén vì vậy chỉ để cho vui, tôi quyết định đặt một giải pháp. Nhưng mã gốc của tôi cũng được đăng, vì vậy tôi không thấy vấn đề là gì. Chỉ cần bỏ qua một gzipped. Tôi cũng muốn biết lý do tại sao tôi bị hạ thấp.
Vladimir

1

GIÁ TRỊ, 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++;}}

Không có thêm cảnh báo tại biên dịch.


1

Java, 608

Bài đăng đầu tiên trên Stack Exchange, lần thứ hai cho vấn đề này.

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 hơi cồng kềnh đối với các tác vụ như thế này, nhưng việc sử dụng phân tách đã giúp giảm chi phí chuỗi.


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

Hãy thử trực tuyến!

Nếu các dòng mới được cho phép, bạn có thể lưu bốn 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

Hãy thử trực tuyến!

Giải trình

/// là ngôn ngữ trong đó thao tác duy nhất là sự thay thế tự sửa đổi. Cụ thể, hướng dẫn /abc/xyz/thay thế tất cả các trường hợp abcvới xyztrong phần còn lại của mã nguồn, bao gồm cả các thay thế khác .. Bất kỳ ký tự nào khác chỉ đơn giản là xuất ra STDOUT.

Mặc dù điều này là đủ cho tính đầy đủ của Turing, nhưng việc chơi gôn trong /// thường bao gồm bắt đầu với đầu ra dự định và xác định các chuỗi con lặp đi lặp lại có thể được thay thế bằng các phím tắt một ký tự.

\có thể được sử dụng như một ký tự thoát trong các mẫu, thay thế và các ký tự theo nghĩa đen có nghĩa là một nghĩa đen /hoặc \.


Hướng dẫn đầu tiên gặp phải là /|/\/\//. Điều này có nghĩa là "thay thế tất cả |bằng //trong phần còn lại của chương trình." Điều này tiết kiệm một byte cho mỗi lần thay thế tiếp theo trong chương trình.


Sau này, một bộ thay thế được thực hiện để tự nén văn bản:

  • on the trở thành ^.
  • day of christmas \n my true love gave to me \ntrở thành %.
  • -a-trở thành =.
  • ingtrở thành &.
  • eventrở thành *.
  • th%trở thành +.
  • ^đứng trước hai dòng mới (xuất hiện trong mỗi câu nhưng đầu tiên) trở thành :.

Theo đó, chúng tôi tự viết lời bài hát. Điều này được thực hiện bằng cách sử dụng thay thế Athông qua K. Mỗi chữ cái thay thế thêm một dòng để thay thế sau nó. Ví dụ, Kđại diện a partridge in a pear treeJđại diện two turtle doves \n and K.

Theo cách này, mỗi câu hát của bài hát bao gồm:

  • ^ hoặc là :
  • Một chuỗi đại diện cho thứ tự đúng (nói, el*th)
  • %
  • Một lá thư Athông qua Kđó đại diện cho lời bài hát chính xác.

Tuy nhiên, vì hầu hết các lệnh kết thúc th, chúng tôi sử dụng thay thế th%+để lưu một số byte.


0

Có những lúc giải pháp rõ ràng nhất cũng là ngắn nhất, tức là tôi không thể cưỡng lại sự thôi thúc này.

Bash trên 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";

Một dòng mới được thêm vào để dễ đọc.


3
Nếu đây là một giải pháp hợp lệ, thì tôi có một giải pháp thậm chí còn ngắn hơn được viết bằng HQ9 + C. (Đó là HQ9 + với một lệnh bổ sung. Bạn có thể đoán nó làm gì.)
Ilmari Karonen

1
Tôi đã cân nhắc việc làm xáo trộn người perl bằng cách sử dụng eval compressmánh khóe để khẳng định tôi đã tìm thấy một regex nén rất tốt, nhưng nó đã tăng lên khoảng 200 ký tự. lol
Jeff Burdges

Video không hoạt động ... đồng thời, hãy sử dụng x.co , đây là công cụ rút ngắn url ngắn nhất mà tôi biết

0

Java - 1329 ký tự

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

Tôi quá lười biếng để đánh lừa nó, nhưng nó ở đây: http://ideone.com/MU9IcP .


-2

SIMPLE , 1 byte

a

Ghi chú :

Ngôn ngữ được thiết kế sau thử thách và vẫn là WIP.

Làm sao :

Bất kỳ char sẽ xuất ra 12 ngày Giáng sinh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.