12 Days of Christmas Lyrics


17

ฉันคิดว่านี่จะเป็นความท้าทายที่สนุกสำหรับทุกคนและฉันอยากรู้วิธีแก้ปัญหาที่คนคิด

พิมพ์เนื้อเพลง "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.

กฎระเบียบ

  • คุณไม่ต้องกังวลกับการใช้ตัวพิมพ์ใหญ่ ข้อความทั้งหมดอาจไม่ตรงตามตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก
  • คุณสามารถละเว้นเครื่องหมายวรรคตอนอย่างสมเหตุสมผล: เครื่องหมายยัติภังค์อาจเป็นช่องว่างได้และสามารถละเว้นเครื่องหมายจุลภาคและจุด
  • ควรมีบรรทัดว่างระหว่างแต่ละข้อ
  • คุณต้องกำหนดหมายเลขของคุณ: " วันแรกของวันคริสต์มาส", " สี่สายเรียกนก" ฯลฯ

3
คุณสามารถให้เวอร์ชั่นเต็มของแต่ละบรรทัดได้หรือไม่? ฉันคุ้นเคยกับ "ความรักที่แท้จริงของฉันมอบให้ฉัน" และการใช้รุ่นที่แตกต่างกันอาจส่งผลกระทบต่อการแก้ปัญหา
Matthew อ่าน

อัปเดตเนื้อเพลงสมบูรณ์แล้ว
macek

นั่นคือ "คุณสามารถวางตัวพิมพ์ประโยค" หรือ "ข้อความทั้งหมดเป็นตัวพิมพ์เล็กและตัวพิมพ์เล็ก" โดยไม่ต้องกังวลเกี่ยวกับการใช้อักษรตัวพิมพ์ใหญ่?
JB

นอกจากนี้ในบรรทัดของการละเว้นเครื่องหมายวรรคตอนเราสามารถแลกเปลี่ยนเครื่องหมายวรรคตอนสำหรับช่องว่าง (และกลับกัน) ได้หรือไม่
JB

1
@macek: ดีกว่า แต่ด้านแฝงของคำถามของฉันคือ: ฉันสามารถพิมพ์ยัติภังค์แทนช่องว่างได้หรือไม่?
JB

คำตอบ:


23

Brainfuck - 2,974

ฉันค่อนข้างภูมิใจกับสิ่งนี้ ฟังดูเหมือนเป็นจำนวนมาก แต่โปรดจำไว้ว่าฉันไม่ได้ใช้ไลบรารีการบีบอัดภายนอกและไม่มีข้อความต้นฉบับอยู่ในโปรแกรมของฉัน ไม่มีการส่งอื่น ๆ สามารถพูดได้ว่า นี่คือรหัสทั้งหมด เครื่องกำเนิดข้อความไร้เดียงสามากขึ้นให้มากกว่า 39k สำหรับข้อความนี้ดังนั้นฉันจะบอกว่านี่เป็นการปรับปรุงที่สำคัญ

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

น่าเสียดายที่นี่มีความยาวประมาณ 600 ตัวอักษรมากกว่าตัวของมันเอง มันเก็บตัวอักษร c, h, m, r, w ในอาร์เรย์และใช้มันเพื่อพิมพ์ข้อความทั้งหมด สองอาร์เรย์ทางด้านขวาของสิบสองช่องว่างติดตามแต่ละวันที่เราอยู่สำหรับการนับและรายการที่เราสามารถส่งออก ฉันอาจสามารถปรับให้เหมาะสมได้เล็กน้อยโดยจัดระเบียบแผนผังหน่วยความจำใหม่เพื่อนำอักขระการพิมพ์ระหว่างอาร์เรย์การนับทั้งสองเพื่อหลีกเลี่ยงสายโซ่ยาวของ<<<<<<<และ>>>>>>เช่นนี้ แต่นั่นจะเป็นการทำงานมากในตอนนี้ ฉันอาจเลือกตัวละครที่ดีกว่าบางตัวพร้อมการวิเคราะห์ความถี่เพื่อลดการเพิ่ม / ลดขนาด แต่สิ่งใดก็ตาม

สิ่งนี้ขึ้นอยู่กับการห่อเซลล์ 8 บิตเพื่อให้ทำงานได้อย่างถูกต้อง

Ungolfed:

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

[>+>+>+>+>+<<<<<-]++++++++++
>>[+++++>]<<<[+++++>]<<[+++++>]<+++++>>
++++[<++++++++>-]
++++++++++++>+>+>>>>>>>>>>>>>+<<<<<<<<<<<<<<<
[ 
   <<<<++o.-n.->>>.<<++t.--<<h.<++e.-->>>>>.    
   >>>>>>>>>>>>>>
   12[<<<<<<<<<<<<<<<<++t.>w.<<<<++e.-->>-l.+<--f.++>>t.--<<h.>>>>.>>>>>>>>>>>>>>-]
   11<[<<<<<<<<<<<<<<<<<<++e.>>-l.<<e.>>>>-v.+<<<<e.-->>++n.>++t.--<<h.>->>>.>>>>>>>>>>>>>>+<-]
   10<[<<<<<<<<<<<<<<++t.<<<++e.-->>+n.->t.--<<h.>>>>.>>>>>>>>>>>>>+<-]
   9<[<<<<<<<<<<<< <<+n.<+i.>n.->++t.--<<-h.>>>> . >>>>>>>>>>>>+<-]
   8<[<<<<<<<<<<< <<<<++e.-->+i.--g.+h.>>++t.--<<h.>>>> . >>>>>>>>>>>+<-]
   7<[<<<<<<<<<< <+s.<<<++e.>>>>-v.+<<<<e.-->>+n.->+t.--<<h.>>>> . >>>>>>>>>>+<-]
   6<[<<<<<<<<< <+s.<<+i.>>>+x.-<+t.--<<-h.>>>> . >>>>>>>>>+<-]
   5<[<<<<<<<< <<<--f.+++i.---f.>>++t.--<<++h.>>>>. >>>>>>>>+<-]
   4<[<<<<<<< <<<--f.>++o.-->>--u.++<r.++t.--<<++h.>>>> . >>>>>>>+<-]
   3<[<<<<<< <++t.<<h.+i.->>--r.<<<+d.->>>>>.>>>>>>+<-]
   2<[<<<<<<+s.-<<<++e.--c.>>++o.-n.-<<+d.->>>>>.>>>>>+<-]
   1<[<<<<<<<--f.+++i.->>r.+s.+t.-->>.>>>>+<-]
   <<<<<<<<+d.---a.>>>>++y.>_.<<<++o.<--f.>>>>_.<<<<<++c.>++h.>>r.<<+i.>>+s.+t.
   <--m.<<--a.>>>-s.>>_.<<<m.>>y.>_.<<+t.--r.>----u.<<<<++++e.>>>>>_.
   <<<-l.+++o.>>+v.<<<<e.>>>>>_.   
   <<<<--g.<----a.>>>>v.<<<<++++e.>>>>>.
   <<++t.<o.>>>.
   <<<--m.<<e.>>>>>.
   <<<<<-->+>>-->+
   >>>>>>>>>>>>>>>>>>>>>>>>>>>>
   12[<<<<<<<<<<<<<<<<<<<<<<<<<<<<<++t.>w.<<<<++e.>>-l.>>-v.<<<<e.->>>>>.
   <<<<<d.>>>--r.>-u.<<+m.m.<<+e.>>>r.+s.>>.<<<<<-d.->>>-r.>u.<<m.m.<+i.>+n.-<--g.+>>>++>.
   >>>>>>>>>>>>>>>>>>>>>>>>>>>-]
   11<[<<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<++e.>>-l.<<e.>>>>-v.+<<<<e.>>++n.>>>.
   <<--p.<<+i.>>p.<<<e.-->>>++r.+s.>>.<<---p.<<i.>>p.++<<i.>n.-<--g.+>>>>.>>>>>>>>>>>>>>>>>>>>>>>>>>-]
   10<[<<<<<<<<<<<<<<<<<<<<<<<<<< <++t.<<<++e.>>+n.>>> .<<<--
   .+++o.>--r.<<<-d.>>>+s.>>.<<<<<---a.>>>>>.<<<---l.<<++++e.----a.++>>>---p.++<<+
   i.>++n.-<--g.+>>>> .    >>>>>>>>>>>>>>>>>>>>>>>>>-]
   9< [<<<<<<<<<<<<<<<<<<<<<<<<< <<+n.<+i.>n.<<++e.>>>>> .<<<--l.<<----a.+++d.>
   i.<+e.>>>+s.->> .<<<<<-d.---a.>>++n.<<++c.>i.>n.-<--g.+>>>> . >>>>>>>>>>>>>>>>>>>>>>>>-]
   8< [<<<<<<<<<<<<<<<<<<<<<<<< <<<<++e.>+i.--g.+h.>>++t.>> .<<<m.<<----a.>+
   i.<+++d.>>>-s.->> .<<<<<---a.++>>>>> .<<<m.<i.>-l.-k.<i.>+++n.-<--g.+>>>> . >>>>>>>>>>>>>>>>>>>>>>>-]
   7< [<<<<<<<<<<<<<<<<<<<<<<< <+s.<<<++e.>>>>-v.<<<<e.>>+n.>>> .<<s.>+w.<<<<
   ----a.>>n.>s.>> .<<<<<a.++>>>>> .<<s.->w.<<<+i.>-m.m.<i.>+n.-<--g.+>>>>.  >>>>>>>>>>>>>>>>>>>>>>-]
   6< [<<<<<<<<<<<<<<<<<<<<<< <+s.<<+i.>>>+x.> .<<<<--g.<++e.e.>>>s.-<<<e.>>>>> 
   .<<<<<----a.>>>>> .<<<-l.<<a.++>>>>+y.--<<<++i.>++n.-<--g.+>>>> .  >>>>>>>>>>>>>>>>>>>>>-]
   5< [<<<<<<<<<<<<<<<<<<<<< <<<--f.+++i.>>>-v.+<<<<++e.>>>>> .<<<<--g.>++o.---
   l.<<-d.+e.-->>++n.>>> .<<r.<<++i.>n.-<--g.+>>+s.->> .   >>>>>>>>>>>>>>>>>>>>-]
   4< [<<<<<<<<<<<<<<<<<<<< <<<--f.>++o.>>--u.++<r.>> .<<<<<c.--a.>>---l.l.<+++
   i.>++n.-<--g.>>>> .<<<<<+b.>++i.->>r.<<<++d.->>>+s.->> .  >>>>>>>>>>>>>>>>>>>-]
   3< [<<<<<<<<<<<<<<<<<<< <++t.<<h.>>--r.<<<++e.e.>>>>> .<<<<--f.>>r.<<<e.>>+
   n.<<--c.>++h.>>>> .<<<<h.<++e.-->>n.->+s.->> .    >>>>>>>>>>>>>>>>>>-]
   2< [<<<<<<<<<<<<<<<<<<<++t.>w.<<++o.>>>.<<t.>--u.<--r.++t.<---l.<<++e.>>>>>.
   <<<<<-d.>>+++0.>>+v.<<<<+e.>>>-s.>>.<<<<<----a.>>-n.-<<+++d.->>>->+>.
   >>>>>>>>>>>>>>>>>-] 
   1<[<<<<<<<<<<<<<<<<<<<<<--a.>>>>>.<<p--.<<<a.>>>++r.++t.--r.<<+i.<+++d.>--g.<+
   e.>>>>>.<<<<++i.>+n.>>>.<<<<<----a.>>>>>.<<<++p.<<++++e.----a.>>>r.>>.<<++
   t.--r.<<<++++e..>>>>>.<<<<<-->->--->>>>>>>>>>>>>>>>>>>-]
   <<<<<<<<<<<<<<<<<<<<<<..>>>>>>>->+
   [>+>>>>>>>>>>>>>[>]+[<]<<<<<<<<<<<<<-]>[<+>-]<<
]

1
ฉันยอมรับความคิดเห็นแบบอินไลน์เกี่ยวกับขนาดที่ส่งเข้ามา (ไม่นับรวมคะแนนกอล์ฟ) +1 แล้ว
JB

แน่นอนค่ะ เพิ่มเวอร์ชั่นที่ไม่ดี สำหรับตัวเลขในวันนั้นมีเพียงหนึ่งบิตเท่านั้นที่ตั้งจากสิบสองและหลังจากการส่งออกมันจะตั้งค่าบิตของวันถัดไป สำหรับรายการถัดจากบรรทัดสุดท้ายจะตั้งค่าบิต n ในแถวสูงและรับเอาต์พุตที่แอ็คทีฟทั้งหมด
captncraig

10

Perl, 438 291 ตัวอักษร

แรงบันดาลใจจากการใช้เจฟฟ์ Burdges ของการบีบอัดยุบ , Ventero ของการบีบอัดรหัสทับทิมและใช้ JB ของ Lingua :: EN :: เบอร์ฉันจัดการเพื่อบีบอัดรายการของฉันลงไป 291 ตัวอักษร (ดีไบต์) รวมทั้งรหัสการบีบอัด เนื่องจากโปรแกรมมีอักขระที่ไม่สามารถพิมพ์ได้บางตัวเราจึงได้จัดให้ในรูปแบบ MIME Base64 :

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

เพื่อยกเลิกการเข้ารหัสโปรแกรมคุณสามารถใช้สคริปต์ผู้ช่วยเหลือ Perl ต่อไปนี้:

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

บันทึกการส่งออกในแฟ้มที่มีชื่อและเรียกมันด้วย12days.pl perl -M5.01 12days.plตามที่ระบุไว้คุณจะต้องมีLingua :: EN :: ตัวเลขโมดูลติดตั้งเพื่อให้โค้ดทำงานได้

ในกรณีที่คุณสงสัยส่วนที่อ่านได้ของโค้ดจะมีลักษณะดังนี้:

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

ที่...หมายถึง 254 ไบต์ของRFC 1950รหัส Perl ที่ถูกบีบอัด ไม่บีบอัดรหัสมีความยาว 361 ตัวอักษรและมีลักษณะดังนี้:

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

การเขียนรหัสนี้เป็นแบบฝึกหัดการเล่นกอล์ฟแปลก ๆ : มันเป็นการเพิ่มการทำซ้ำให้มากที่สุดและการลดจำนวนตัวอักษรที่ใช้ให้ชัดเจนนั้นมีความสำคัญมากกว่าการลดจำนวนตัวอักษรดิบเมื่อตัวชี้วัดที่เกี่ยวข้องมีขนาด หลังจากการบีบอัดหลังจากการบีบอัด

ในการบีบตัวอักษรสองสามตัวที่ผ่านมาออกมาฉันได้เขียนโปรแกรมง่าย ๆ เพื่อลองใช้โค๊ดเล็ก ๆ ของโค้ดนี้เพื่อหาตัวที่ดีที่สุด สำหรับการบีบอัดฉันใช้KZIPยูทิลิตี้ของ Ken Silverman ซึ่งโดยปกติจะให้อัตราส่วนการบีบอัดที่ดีกว่า (ที่ราคาความเร็ว) กว่า Zlib มาตรฐานแม้ที่การตั้งค่าการบีบอัดสูงสุด แน่นอนเนื่องจาก KZIP สร้างเพียงไฟล์เก็บถาวร ZIP ฉันจึงต้องแยกสตรีม DEFLATE ดิบออกจากไฟล์เก็บถาวรและใส่ไว้ในส่วนหัวและการตรวจสอบ RFC 1950 นี่คือรหัสที่ฉันใช้:

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

หากสิ่งนี้ดูเหมือนว่าจะเป็น kluge ที่น่ากลัวนั่นเป็นเพราะนั่นคือสิ่งที่มันเป็น


เพื่อความสนใจในอดีตนี่คือโซลูชัน 438-char ดั้งเดิมของฉันซึ่งสร้างเอาต์พุตที่ดีกว่ารวมถึงตัวแบ่งบรรทัดและเครื่องหมายวรรคตอน:

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

จุดเด่นของรุ่นนี้คือคู่ของ regexps s/e?t? .*/th/,s/vt/ft/ซึ่งสร้างกฎสำหรับ 4 ถึง 12 จากพระคาร์ดินัลที่จุดเริ่มต้นของสายของขวัญ

แน่นอนว่ารหัสนี้สามารถบีบอัดได้โดยใช้ Zlib trick ที่อธิบายไว้ข้างต้น แต่ปรากฎว่าการบีบอัดเอาต์พุตมีประสิทธิภาพมากขึ้นโดยให้โปรแกรม 338- ไบต์ต่อไปนี้ (ในรูปแบบ Base64 อีกครั้ง):

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

ฉันมีไฟล์เก็บถาวร gzip ขนาด 312 ไบต์ซึ่งสร้างจากสตรีม DEFLATE เดียวกัน ฉันคิดว่าคุณสามารถเรียกมันว่า "สคริปต์ zcat" :)


ดูเหมือนว่าคุณสามารถแทนที่ringsด้วยrGsเพื่อบันทึก 2 ตัวอักษร
macek

@macek: ในฉบับดั้งเดิมของฉันฉันไม่สามารถเพราะฉันแทนที่Gด้วยing,แต่ปรากฎว่าการเพิ่มเครื่องหมายจุลภาคในภายหลังจะสั้นกว่าแน่นอน ขอบคุณ!
Ilmari Karonen

คุณจะหลีกเลี่ยงข้อผิดพลาด 'การแก้ไขค่าอ่านอย่างเดียว' ได้อย่างไร
Jeff Burdges

@JeffBurdges: ในรุ่นเดิมหรือไม่ โดยการกำหนดสตริงให้กับอาร์เรย์ก่อน
Ilmari Karonen

"พยายามแก้ไขค่าแบบอ่านอย่างเดียวที่ /opt/local/lib/perl5/5.12.3/Compress/Zlib.pm บรรทัด 357" ฉันหลีกเลี่ยงปัญหานี้โดยกำหนดให้$_ในการอัปเดตด้านล่าง
Jeff Burdges

10

เสียงกระเพื่อมสามัญ, 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))

สิ่งอำนวยความสะดวกบิวอินเพื่อจัดรูปแบบเลขลำดับมีประโยชน์ แต่การบีบอัดส่วนใหญ่มาจากความสามารถในการใช้รายการอาร์กิวเมนต์เดียวกันซ้ำแล้วซ้ำอีกการข้ามอาร์กิวเมนต์น้อยลงและน้อยลงในแต่ละการเรียกใช้

พิสูจน์ได้จากcoredumpในความคิดเห็นสิ่งอำนวยความสะดวกในตัวยังสามารถนำไปใช้ประโยชน์ได้ดีสำหรับพระคาร์ดินัล


บางทีคุณอาจบีบอัดได้อีกเล็กน้อยเนื่องจากบรรทัดที่ขึ้นต้นด้วย "สิบสอง", "สิบเอ็ด", "สิบ", ...
coredump

อาจจะเป็น คุณมีข้อเสนอแนะอะไร?
JB

1
ฉันก่อนหวังว่าจำนวนอาร์กิวเมนต์ที่เหลือสามารถใช้ แต่ฉันอ่าน spec และฉันไม่สามารถทำได้ shortes ฉันมี 333 chars:(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

ตอนนี้เรากำลังพูดถึง ความฝันของฉันคือการแบ่งปันเคาน์เตอร์ข้ามกับลำดับ แต่ฉันไม่พบวิธีที่จะทำเช่นนั้น
JB

7

JavaScript 570

นี่เป็นครั้งแรกที่ฉันเล่นกอล์ฟ 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:])

อย่างไรก็ตามฉันใส่ 'และ' ในบรรทัดเดียวกันกับนกพิราบแทนนกกระทา


1
คุณทำผิดการสะกดคำเดียวกันกับฉัน: มันเป็น "สิบสอง"
Andrew Shepherd

นั่นช่วยฉันอีกตัวหนึ่งแล้ว ... ขอบคุณ!
Daan

5

ทับทิม (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")}

หรือในรูปแบบที่อ่านได้มากขึ้น (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

ใครมีความคิดวิธีหลีกเลี่ยง. กลับ? ฉันไม่สามารถหาวิธีแก้ปัญหาได้


ฉันชอบกลอุบายของคุณด้วย * เพื่อแสดงถึง "ไอเอ็นจี" คุณควรจะสามารถทำให้มันลดลงเหลือประมาณ 440 โดย: ใช้12.timesแทน(0..11).each; ทำเดี่ยวทำให้กับสองข้อโต้แย้งแทนสองทำให้กับอาร์กิวเมนต์หนึ่ง; ใช้สัญกรณ์% w () สำหรับอาร์เรย์ days-of-Christmas ในที่สุดคุณสามารถกำจัดสิ่งที่ตรงกันข้ามโดยการย้อนกลับรายการเพิ่มพิเศษ ^ ไปยังจุดสิ้นสุดของสตริงแล้วใช้[-i..-1]แทน [0..i]
Wayne Conrad

คุณไม่สามารถเปลี่ยน "drumming" เป็น "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"
}

นี่เป็นความพยายามครั้งแรกของฉันและฉันแน่ใจว่ามันจะทำให้สั้นลงมาก การขึ้นบรรทัดใหม่มีไว้เพื่อให้สามารถอ่านได้ มันมีสามอาร์เรย์ที่สำคัญแห่งหนึ่งซึ่งถือชื่อในแต่ละวัน@sซึ่งหนึ่งในรายการออกทั้งหมดของของขวัญ (ยกเว้นคนแรก) และคนที่ออกรายการของขวัญอะไรได้แล้วให้@a @bกลไกหลักคือในแต่ละวันมันจะพิมพ์@bและโอนของขวัญเพิ่มเติมอีกหนึ่งชิ้นจาก@aเป็น@bไป

ขอบคุณแอนดรูสำหรับ 500-> 485


คุณสามารถแทนที่ringsด้วยr$1sเพื่อประหยัด 1 ถ่านมากขึ้น
Macek

@macek ฉันไม่สามารถทำได้เพราะ perl จะตีความsว่าเป็นส่วนหนึ่งของชื่อตัวแปรและ$isไม่มีตัวแปร (จริงๆแล้วพวกเขาคือฉันแทนที่จะเป็นคน btw)
PhiNotPi

eigth->eighth
Matthew อ่าน

คุณสามารถแทนที่$iด้วยพูด$;เพื่อหลีกเลี่ยงสิ่งนั้น ไม่มีใครเคยใช้$;เพื่อจุดประสงค์
Ilmari Karonen

@IlmariKaronen ฉันได้รับคำแนะนำของคุณ แต่ได้แก้ไขคำที่พิมพ์ผิดดังนั้นจำนวนตัวละครจึงยังคงเหมือนเดิม
PhiNotPi

5

VIM - 578 การกดแป้น

ฉันตัดสินใจลองเล่นกอล์ฟเพราะนี่เป็นสิ่งที่สามารถเล่นกอล์ฟได้

เริ่มต้นด้วยการแทรกเฟรมเวิร์ก - บรรทัด "X day of Christmas" จำนวน 12 ครั้ง (89 การกดแป้น):

                                         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

จากนั้นดำเนินการชุดของแมโครที่จะแทรกหมายเลข 2 ถึง 12 ในสถานที่นั้น ๆ ที่พวกเขาต้องการสำหรับเนื้อเพลง (172 keystrokes):

                                      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" ในบรรทัดที่สองคือการกำจัดของแรก "และ" เพราะมันไม่ได้ไปที่นั่น

จากนั้นให้ทำการแทนสิ่งต่างๆตามจำนวนสิ่งที่ความรักที่แท้จริงมอบให้ (319 การกดแป้น):

                                       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

และสุดท้ายแทนที่แต่ละเหตุการณ์Xด้วยหมายเลขลำดับ:

                         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

และเราทำเสร็จแล้ว!


ฉันแน่ใจว่ามีการเพิ่มประสิทธิภาพอื่น ๆ ที่ฉันพลาด แต่ฉันคิดว่ามันค่อนข้างดีสำหรับตัวเอง


อ๊ะฉันลืมทางหนี
Joe Z.

คุณสามารถละ / g ด้วยการทดแทนเช่นนี้::%s/2/two turtle doves,
2xsaiko

4

C (644)

การนับไม่รวมช่องว่างที่ใช้สำหรับการนำเสนอ

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

ผลผลิตเป็นเช่น:

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

ขอบคุณDaanสำหรับความคิดที่จะแยกสตริง

ฉันได้รวมคำสั่งเปลี่ยนเพื่อรับ "และ" ในนกกระทาสำหรับทุกคนยกเว้นบทกวีแรก แต่เนื่องจากคำถามทำให้เราใช้เครื่องหมายวรรคตอนได้เราสามารถผนวก "และ" เข้ากับนกพิราบได้

ส่งผลให้เกิดการป้อนบรรทัดดังนี้:

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

ที่สิบสองไม่ใช่ที่สิบสอง
Joey Adams

@Joey Adams - ขอบคุณสำหรับการแก้ไขและทำให้ฉันมีตัวละครน้อยลงหนึ่งตัว :-)
Andrew Shepherd

4

Perl, 368 389 (ไม่มี Unicode / การบีบอัด)

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 :: ตัวเลขแม้ว่าฉันจะไม่เชื่อ 100% เป็นความคิดที่ดีเมื่อฉันเห็นโมดูลและความยาวของชื่อตัวระบุ ต้องการ Perl 5.10 หรือใหม่กว่าเรียกใช้จากบรรทัดคำสั่งด้วย-Eสวิตช์

แก้ไข:การปรับปรุงเล็กน้อย: หยุดใช้อาร์เรย์ใช้ประโยชน์จาก$_ช่องว่างที่ไม่จำเป็น


+1 เจ๋ง! บางคนอาจบ่นเกี่ยวกับการใช้โมดูลที่ไม่ได้มาตรฐาน แต่ถ้าเราอนุญาตให้ใช้ภาษาใด ๆ (รวมถึงวัตถุประสงค์พิเศษเช่น GolfScript) ฉันไม่เห็นว่าทำไม "Perl + Lingua :: EN :: Numbers" ไม่เป็นภาษาที่ถูกต้องสำหรับการแก้ปัญหา การเขียนโมดูล "Acme :: 12Days" และส่งไปที่ CPAN นั้นอาจเป็นการโกง :)
Ilmari Karonen

@Ilmari Karonen เมื่อมีคนบ่นฉันมักจะเปลี่ยนชื่อภาษาเป็น "CPAN" ไม่ได้เกิดขึ้นบ่อยครั้ง
JB

2
Ilmari, Golfscript ไม่ใช่ภาษาที่มีวัตถุประสงค์พิเศษ
Joey

2
เป็นเหมือน "ภาษาทั่วไป" โดยบังเอิญ: D
JB

1
ท่านที่รักทำไมผู้คนถึงไม่สามารถตีรหัสของตัวเองได้อีกต่อไป?
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})]

สิ่งนี้พิมพ์เนื้อเพลงตามที่ระบุในคำถามที่มีหลายบรรทัดต่อข้อ เราสามารถบันทึกอักขระได้ไม่กี่ตัวหากไม่มีข้อกำหนดดังกล่าว


+1 อึ Holey คุณได้ทำงานกับฟีดบรรทัดเช่นเดียวกับ "และ" ปรากฏในบรรทัดสุดท้าย
Andrew Shepherd

ทีนี้การพิมพ์ข้อความที่แตกต่างก็ไม่เคยเป็นตัวเลือกอยู่ดีและการ“ และ” ในบรรทัดสุดท้ายนั้นใช้กลอุบายที่เหมือนกันทุกคน แต่ถึงกระนั้นฉันต้องการที่จะรักษาเส้นแบ่งที่โซลูชั่นอื่นไม่ได้ (ในขณะที่อีกต่อไปด้วย)
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

ฉันรู้ว่านี่ถูกโพสต์เมื่อไม่นานมานี้ แต่ฉันคิดว่าฉันจะลอง ฉันเป็นนักเรียนและยังใหม่กับสิ่งนี้ แต่ดูเหมือนว่าจะทำงาน

public class TwelveDaysOfChristmas 
{

    public static void main(String[] args) 
    {
        String[] days = new String[12];
        days[0] = "and a partriage in a pear tree.";
        days[1] = "Two turtle doves, ";
        days[2] = "Three french hens, ";
        days[3] = "Four callings birds, ";
        days[4] = "Five diamond rings, ";
        days[5] = "Six geese a-laying, ";
        days[6] = "Seven swans a-swimming, ";
        days[7] = "Eight maids a-milking, ";
        days[8] = "Nine ladies dancing, ";
        days[9] = "Ten lords a-leaping, ";
        days[10] = "Eleven pipers piping, ";
        days[11] = "Twelve twelve drummers drumming, ";


        System.out.println(chorus(0));
        System.out.println("a partriage in a pear tree");

        for(int i = 1; i<days.length; i++)
        {
            System.out.println(chorus(i));

            for(int x = i; x>=0; x--)
            {
                System.out.println(days[x]);
            }
            System.out.println();
        }
    }

    public static String chorus(int line)
    {
        String chorus = "On the " + getLine(line) + " day of Christmas my true " +
                "love gave to me, ";

        return chorus;
    }

    public static String getLine(int line)
    {
        int num = line;
        String result = "first";
        switch (num)
        {
        case 1:  result = "second";
                 break;
        case 2:  result = "third";
                 break;
        case 3:  result = "fourth";
                 break;
        case 4:  result = "fifth";
                 break;
        case 5:  result = "sixth";
                 break;
        case 6:  result = "seventh";
                 break;
        case 7:  result = "eighth";
                 break;
        case 8:  result = "ninth";
                 break;
        case 9: result = "tenth";
                 break;
        case 10: result = "eleventh";
                 break;
        case 11: result = "twelfth";
                 break;
        }

        return result;
    }

}

สวัสดี Gina ยินดีต้อนรับสู่เว็บไซต์!
Tynam

3
ขอแสดงความยินดีกับโซลูชั่นแรก ทำงานได้ดี การแข่งขันที่มีโค้ดกอล์ฟนั้นเป็น 'รหัสที่สั้นที่สุดเท่าที่จะเป็นไปได้' ดังนั้นมันจึงเป็นมาตรฐานในเว็บไซต์นี้ที่จะทำบางสิ่งที่คุณไม่เคยทำในรหัสปกติ: ตัดชื่อตัวแปรและฟังก์ชั่นให้กับตัวละครตัวหนึ่ง (ไม่เป็นไรและคาดว่าจะรวมเวอร์ชันเต็มความยาวเหมือนที่คุณทำที่นี่เพื่อทำให้วิธีการนั้นชัดเจนยิ่งขึ้น) เมื่อทำเช่นนั้นแล้วคุณสามารถถามตัวเองว่า: "ฉันจะทำให้เรื่องนี้สั้นลงได้อย่างไร"
Tynam

2

สวิฟท์, 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.")}

คุณสามารถวางสิ่งนี้ในสนามเด็กเล่น

ฉันลองย้ายvคำสั่ง print ไปที่:

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 บีบอัด 321 ตัวอักษร

เนื่องจากรหัสมีอักขระที่พิมพ์ไม่ได้ฉันจะโพสต์ hexdump ของรหัสแทน:

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                                       '

เพื่อสร้างรหัสที่เกิดขึ้นจริงจาก hexdump xxd -r hexdump > 12days.rbใส่ไว้ในไฟล์และเรียกใช้ จากนั้นการดำเนินการruby1.9.3 12.days.rbจะเรียกใช้รหัสและพิมพ์เนื้อเพลง โปรดทราบว่ารหัสนี้ต้องใช้ Ruby 1.9.3 (เพราะใช้Zlib.inflate ) ดังนั้นจึงไม่สามารถทำงานกับ Ruby 1.8.x, 1.9.1 และ 1.9.2

รหัสที่ไม่บีบอัดมีความยาว 425 ตัวอักษร:

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

แนวคิด: ยกเลิกการบีบอัดและประเมินผลโซลูชัน Lingua :: EN :: Numbers ของ JB

perl -e 'use MIME::Base64; print decode_base64 $_ while <>;' >12days.plครั้งแรกที่วางบล็อกข้อความนี้ลงในคำสั่ง 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==

สคริปต์ใช้รูปแบบuse Compress::Zlib;$_='...';eval uncompress$_;ที่...เป็นโซลูชันถ่าน 368 ของ JB หลังจากถูกบีบอัดด้วยคำสั่งนี้และหนีออก'มา

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

สคริปต์ของ Ilmari บ่นเกี่ยวกับการปรับเปลี่ยนค่าแบบอ่านอย่างเดียวโดยไม่มี$_=...;อักขระพิเศษแต่สันนิษฐานว่าเขาสร้าง313นี้ คุณสามารถบันทึกได้อีกหลายไบต์โดยการปรับแต่งการบีบอัดด้วยตนเองอย่างที่ Ilmari ทำมาก่อนอาจจะบรรลุถึง310 หรือประมาณนั้นแต่ฉันก็ไม่ได้สนใจอะไร


Perl, 376 (โกงการส่งอื่น) [การส่งต้นฉบับของฉัน]

ก่อนอื่นให้สร้างสคริปต์ Perl 12days.plที่มีชื่อว่า:

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

ถัดไปไพพ์เอาต์พุตจากการส่งอื่น ๆ เข้า12days.txtและดำเนินการคำสั่ง:

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

Vola 12days.plอยู่ที่ประมาณ 376 ไบต์และพิมพ์เพลง ;) การใช้ rawinflate อย่างสนุกสนานย้ายข้อมูลหกไบต์อย่างแม่นยำจาก data doc ไปยังโค้ดเริ่มต้นจากผลลัพธ์ของ Ilmari

ตอนแรกฉันตั้งค่าเกี่ยวกับการหาโมดูลการเข้ารหัส Huffman โดยตรงซึ่งไม่เกือบจะไม่น่าไว้วางใจ แต่น่าเศร้าที่ CPAN ไม่มีโมดูลที่มีตารางเอนโทรปีของตัวอักษรภาษาอังกฤษซึ่งเป็นสิ่งที่คุณต้องการจริงๆเมื่อบีบอัดสตริงที่สั้นมาก ๆ

ฉันพบว่าfortune -m Days\ of\ Christmasมันใช้งานไม่ได้อย่างน่าเสียดาย


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

ความยาวลดลงด้วยการบีบอัด 502

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

ไม่ใช่วิธีการแก้ปัญหาที่ฉันชอบอ่าน (เป็นอีกหนึ่งเบส -64 / gzip, เยี่ยมมาก) แต่ฉันไม่เห็นเหตุผลว่าทำไมคุณคนเดียวสมควรได้รับคะแนนคำตอบเชิงลบด้วย โหวตขึ้นเพื่อนำยอดคงเหลือบางส่วน; ใครก็ตามที่ถูกลงขอให้แจ้งให้เราทราบว่าทำไม
JB

หลายคนให้โซลูชันที่ถูกบีบอัดดังนั้นเพื่อความสนุกของฉันฉันจึงตัดสินใจเลือกใช้ แต่รหัสเดิมของฉันก็โพสต์ด้วยดังนั้นฉันไม่เห็นว่าปัญหาคืออะไร เพียงแค่ละเว้น gzipped หนึ่ง ฉันอยากจะรู้ว่าทำไมฉันถึงถูกลดระดับลง
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++;}}

ไม่มีคำเตือนเพิ่มเติมเกี่ยวกับการรวบรวม


1

Java, 608

โพสต์ครั้งแรกในการแลกเปลี่ยนสแต็กลองครั้งที่สองที่ปัญหานี้

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 ค่อนข้างยุ่งยากสำหรับงานเช่นนี้ แต่การใช้ split ช่วยลดค่าใช้จ่ายของสายอักขระ


1

/// , 439 ไบต์

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

ลองออนไลน์!

หากได้รับอนุญาตให้ขึ้นบรรทัดใหม่คุณสามารถบันทึกสี่ไบต์:

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

ลองออนไลน์!

คำอธิบาย

/// เป็นภาษาที่การดำเนินการเพียงอย่างเดียวเป็นการทดแทนการแก้ไขด้วยตนเอง โดยเฉพาะคำสั่ง/abc/xyz/จะแทนที่ทุกอินสแตนซ์ของabcด้วยxyzในส่วนที่เหลือของรหัสที่มารวมถึงการทดแทนอื่น ๆ .. ตัวละครอื่น ๆ จะถูกส่งออกไปยัง STDOUT

แม้ว่าจะเพียงพอสำหรับทัวริง - สมบูรณ์แล้วการเล่นกอล์ฟใน /// โดยทั่วไปประกอบด้วยการเริ่มต้นด้วยผลลัพธ์ที่ต้องการและการระบุวัสดุย่อยซ้ำ ๆ ที่สามารถแทนที่ด้วยทางลัดอักขระเดียว

\สามารถใช้เป็นอักขระยกเว้นในรูปแบบการแทนที่และอักขระตามตัวอักษรเพื่อหมายถึงตัวอักษร/หรือ\หรือ


/|/\/\//การเรียนการสอนครั้งแรกที่พบคือ ซึ่งหมายความว่า "แทนที่ทั้งหมด|ด้วย//ในส่วนที่เหลือของโปรแกรม" สิ่งนี้จะบันทึกไบต์สำหรับการทดแทนที่ตามมาทุกครั้งในโปรแกรม


หลังจากนี้ชุดของการแทนที่ถูกสร้างขึ้นเพื่อบีบอัดข้อความเอง:

  • on the กลายเป็น ^จะกลายเป็น
  • day of christmas \n my true love gave to me \n กลายเป็น %จะกลายเป็น
  • -a- กลายเป็น =จะกลายเป็น
  • ing กลายเป็น &จะกลายเป็น
  • even กลายเป็น *จะกลายเป็น
  • th% กลายเป็น +จะกลายเป็น
  • ^นำโดยสองบรรทัดใหม่ (ซึ่งปรากฏอยู่ในทุกบทกวี แต่แรก) :จะกลายเป็น

ติดตามนี้เราเขียนเนื้อเพลงเอง นี้จะกระทำโดยการเปลี่ยนผ่านA Kการเปลี่ยนตัวอักษรแต่ละตัวจะเพิ่มบรรทัดการแทนที่หลังจากนั้น ยกตัวอย่างเช่นการKแสดงให้เห็นถึงa partridge in a pear treeและแสดงให้เห็นถึงJtwo turtle doves \n and K

ด้วยวิธีนี้แต่ละข้อของเพลงประกอบด้วย:

  • ^ หรือ :
  • สตริงที่แสดงลำดับที่ถูกต้อง (พูดel*th)
  • %
  • จดหมายAผ่านKที่แสดงถึงเนื้อเพลงที่ถูกต้อง

อย่างไรก็ตามเนื่องจากกฎส่วนใหญ่สิ้นสุดลงthเราจึงใช้การแทนที่th%+เพื่อบันทึกบางไบต์


0

มีบางครั้งที่วิธีแก้ปัญหาที่ชัดเจนที่สุดก็สั้นที่สุดเช่นฉันไม่สามารถต้านทานการกระตุ้นนี้ได้อีกต่อไป

Bash บน 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";

เพิ่มหนึ่งบรรทัดใหม่เพื่อให้สามารถอ่านได้


3
หากนี่เป็นวิธีการแก้ปัญหาที่ถูกต้องฉันจะมีคำย่อที่เขียนสั้นกว่าใน HQ9 + C (นั่นคือ HQ9 + พร้อมคำสั่งพิเศษหนึ่งคำสั่งคุณสามารถเดาได้ว่ามันทำอะไร)
Ilmari Karonen

1
ฉันถือว่างง perl หนึ่งโดยใช้eval compressเคล็ดลับเพื่อเรียกร้องฉันพบ regex ที่บีบอัดได้ดีจริงๆ แต่ที่ bloated ขึ้นประมาณ 200 ตัวอักษร lol
Jeff Burdges

วิดีโอใช้งานไม่ได้ ... ใช้x.coเป็น shortener url ที่สั้นที่สุดที่ฉันทราบ

0

Java - 1329 ตัวอักษร

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

ฉันขี้เกียจเกินกว่าจะเลิกทำ แต่มันอยู่ที่นี่: http://ideone.com/MU9IcP http://ideone.com/MU9IcP


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.