Testo della canzone 12 Days of Christmas


17

Ho pensato che sarebbe stata una sfida divertente per tutti e sono curioso di vedere le soluzioni che le persone escogitano.

Stampa il testo di "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.

Regole

  • Non devi preoccuparti della capitalizzazione; l'intero testo può fare distinzione tra maiuscole e minuscole
  • Puoi ignorare sensibilmente qualsiasi punteggiatura: i trattini possono essere spazi e le virgole e i punti possono essere ignorati
  • Dovrebbe esserci una linea vuota tra ogni verso
  • Devi ordinare i tuoi numeri: " primo giorno di Natale", " Quattro uccelli chiamanti", ecc

3
Potete fornire la versione completa di ogni linea? Sono abituato a "il mio vero amore mi ha dato " e l'uso di versioni diverse potrebbe influenzare le soluzioni.
Matteo Leggi il

Testi completi aggiornati.
macek,

È un "puoi eliminare le maiuscole delle frasi" o un "tutto il testo non fa distinzione tra maiuscole e minuscole" in modo da non preoccuparti delle maiuscole?
JB

Inoltre, nella linea di ignorare la punteggiatura, possiamo scambiare la punteggiatura con spazi bianchi (e reciprocamente)?
JB

1
@macek: meglio, ma il lato latente della mia domanda era: posso stampare trattini anziché spazi?
JB

Risposte:


23

Brainfuck - 2.974

Sono piuttosto orgoglioso di questo. Sembra un numero piuttosto grande, ma tieni presente che non ho usato alcuna libreria di compressione esterna e nessuno del testo originale è nel mio programma da nessuna parte. Nessuna delle altre osservazioni può dirlo. Questo è tutto codificato a mano. Generatori di testo più ingenui danno oltre 39k per questo testo, quindi direi che si tratta di un miglioramento significativo.

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

Sfortunatamente, questo è di circa 600 caratteri più lungo del suo stesso output, ma comunque. Mantiene i caratteri c, h, m, r, w in un array e li usa per stampare tutto il testo. Due array a destra di dodici spazi tengono ciascuno traccia del giorno in cui ci troviamo per il conteggio e per quali elementi possiamo produrre. Potrei essere in grado di ottimizzarlo un po 'riorganizzando la mappa di memoria per portare i caratteri di stampa tra le due matrici di conteggio per evitare catene così lunghe di <<<<<<<e >>>>>>, ma a questo punto sarebbe molto impegnativo. Probabilmente potrei anche scegliere alcuni caratteri seed migliori con l'analisi della frequenza per ridurre al minimo l'incremento / decremento, ma comunque.

Ciò dipende dal corretto funzionamento delle celle di wrapping a 8 bit.

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
Tollererei i commenti in linea sugli invii di quella dimensione (non conteggiati per il punteggio di golf). +1 fatto comunque.
JB il

Cosa certa. Aggiunta versione non golfata. Per i numeri dei giorni viene impostato solo un bit su dodici e, dopo averlo emesso, imposta il bit dei giorni successivi. Per gli elementi, il prossimo all'ultima riga imposta n bit in una riga alta e tutti gli output attivi vengono ricevuti.
captncraig,

10

Perl, 438 291 caratteri

Ispirato dall'uso della compressione DEFLATE di Jeff Burdges , dal codice Ruby compresso di Ventero e dall'uso di Lingua :: EN :: Numbers di JB , sono riuscito a comprimere la mia voce fino a 291 caratteri (bene, byte) incluso il codice di decompressione. Poiché il programma contiene alcuni caratteri non stampabili, l'ho fornito in formato MIME Base64 :

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

Per decodificare il programma, è possibile utilizzare il seguente script Perl helper:

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

Salvare l'output in un file denominato 12days.pled eseguirlo perl -M5.01 12days.pl. Come notato, è necessario che il modulo Lingua :: EN :: Numbers sia installato affinché il codice funzioni.

Nel caso ti stia chiedendo, la parte leggibile del codice appare semplicemente così:

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

dove ...sta per 254 byte di codice Perl compresso RFC 1950 . Non compresso, il codice è lungo 361 caratteri e si presenta così:

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

Scrivere questo codice è stato uno strano tipo di esercizio di golf: risulta che massimizzare la ripetizione e minimizzare il numero di caratteri distinti usati sono molto più importanti che minimizzare il numero di caratteri grezzi quando la metrica rilevante è la dimensione dopo la compressione .

Per eliminare gli ultimi caratteri, ho scritto un semplice programma per provare piccole variazioni di questo codice per trovare quello che comprime meglio. Per la compressione, ho usato l' utilità KZIP di Ken Silverman , che di solito produce razioni di compressione migliori (a costo della velocità) rispetto allo standard Zlib anche con le massime impostazioni di compressione. Naturalmente, dato che KZIP crea solo archivi ZIP, ho dovuto quindi estrarre il flusso DEFLATE grezzo dall'archivio e inserirlo in un'intestazione e checksum RFC 1950. Ecco il codice che ho usato per questo:

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

Se questo sembra un kluge orribile, è perché è esattamente quello che è.


Per interesse storico, ecco la mia soluzione originale a 438 caratteri, che genera un output migliore, comprese interruzioni di linea e punteggiatura:

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

Punti salienti di questa versione la coppia di regexps s/e?t? .*/th/,s/vt/ft/ , che costruiscono gli ordinali da 4 a 12 dai cardinali all'inizio delle linee regalo.

Naturalmente questo codice può anche essere compresso usando il trucco Zlib sopra descritto, ma si scopre che la semplice compressione dell'output è più efficiente, producendo il seguente programma a 338 byte (di nuovo in formato Base64):

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

Ho anche un archivio gzip a 312 byte dei testi, costruito dallo stesso flusso DEFLATE. Suppongo che potresti chiamarlo "script zcat". :)


Sembra che tu possa sostituirlo ringscon rGsper salvare 2 caratteri
macek

@macek: Nella mia versione originale non potevo, perché stavo sostituendo Gcon ing,, ma si scopre che l'aggiunta le virgole dopo è davvero breve. Grazie!
Ilmari Karonen l'

Come evitare l'errore "modifica di un valore di sola lettura"?
Jeff Burdges,

@JeffBurdges: nella versione originale? Assegnando prima le stringhe a un array.
Ilmari Karonen,

"Modifica di un valore di sola lettura tentato in /opt/local/lib/perl5/5.12.3/Compress/Zlib.pm riga 357." Ho evitato questo problema assegnandomi $_nel mio aggiornamento di seguito.
Jeff Burdges,

10

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

Le funzionalità integrate per formattare gli ordinali sono utili, ma la maggior parte della compressione deriva dall'essere in grado di utilizzare lo stesso elenco di argomenti più e più volte, saltando sempre meno argomenti ad ogni esecuzione.

Come dimostrato da coredump nei commenti, le strutture integrate possono ancora essere utilizzate per i cardinali.


Forse potresti comprimere un po 'di più dato che le linee iniziano con "dodici", "undici", "dieci", ...
coredump

Forse lo è. Qual è il tuo suggerimento?
JB

1
Prima ho sperato che potesse essere usato il numero rimanente di argomenti, ma ho letto le specifiche e non posso farlo. La mia mancanza è di 333 caratteri:(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

Ora stiamo parlando. Il mio sogno sarebbe stato quello di condividere il contatore dei salti con l'ordinale, ma non ho trovato un modo breve per farlo.
JB,

7

JavaScript 570

Questa è la mia prima volta a giocare a 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:])

Tuttavia, ho inserito "e" sulla stessa riga delle colombe anziché sulla pernice.


1
Hai fatto lo stesso errore di ortografia: è "dodicesimo"
Andrew Shepherd,

Bene, questo mi salva un altro personaggio, quindi ... Grazie!
Daan,

5

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

o in una forma più leggibile (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

qualcuno ha idea di come aggirare il .reverse? non sono riuscito a trovare una soluzione


Mi piace il tuo trucco con * per rappresentare "ing". Dovresti essere in grado di farlo scendere a circa 440: usa 12.timesinvece di (0..11).each; fare un singolo put con due argomenti invece di due put con un argomento; usa la notazione% w () per l'array dei giorni di Natale. Infine, puoi sbarazzarti del contrario invertendo l'elenco, aggiungendo un ulteriore ^ alla fine della stringa e quindi usando [-i..-1]invece di [0..i].
Wayne Conrad,

non potresti cambiare "drumming" in "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"
}

Questo è il mio primo tentativo e sono sicuro che potrebbe essere molto più breve. Le interruzioni di riga sono per leggibilità. Ha tre array importanti, uno dei quali detiene il nome per ogni giorno @s, uno dei quali elenca tutti i doni (tranne il primo) @ae uno che elenca quali doni sono già stati fatti @b. Il meccanismo principale è che ogni giorno stampa @be quindi trasferisce un regalo aggiuntivo da @aa @b.

Grazie ad Andrew per 500-> 485


puoi sostituirlo ringscon r$1sper salvare un altro char
macek l'

@macek Non posso farlo perché perl interpreterà scome parte del nome della variabile e la variabile $isnon esiste. (In realtà sono io invece di quelli, tra l'altro)
PhiNotPi

eigth->eighth
Matteo Leggi l'

Si potrebbe sostituire $icon, diciamo, $;per aggirare quello. Nessuno lo usa mai $;per lo scopo previsto.
Ilmari Karonen,

@IlmariKaronen Ho seguito il tuo consiglio, ma ho corretto un refuso, quindi il conteggio dei personaggi è rimasto lo stesso.
PhiNotPi

5

Vim - 578 sequenze di tasti

Ho deciso di provare a vim-golf, dato che questo è il tipo di cosa che può essere vim-golf.

Inizia inserendo il framework - la riga "X day of Christmas" per un totale di 12 volte (89 battute):

                                         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

Quindi, esegui una serie di macro che inseriranno i numeri da 2 a 12 nei rispettivi punti in cui devono trovarsi i testi (172 battute):

                                      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

Il "dw" sulla seconda riga è quello di sbarazzarsi del primo "e", perché non ci va.

Quindi, esegui una serie di sostituzioni per il numero di cose che il vero amore ha dato (319 battiture):

                                       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

E infine, sostituendo ogni occorrenza di Xcon un numero ordinale:

                         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

E abbiamo finito!


Sono sicuro che ci sono altre ottimizzazioni che ho perso, ma penso che sia abbastanza buono per me.


Uh oh, ho dimenticato le fughe.
Joe Z.

È possibile tralasciare / g con le sostituzioni, in questo modo::%s/2/two turtle doves,
therealfarfetchd

4

C (644)

Il conteggio non include gli spazi bianchi utilizzati per la presentazione.

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

L'output è come:

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

Grazie a Daan per l'idea di dividere una stringa concatenata.

Inizialmente avevo incluso un'istruzione switch per ottenere "e" sulla pernice per tutti tranne il primo verso. Ma, poiché la domanda ci assolve dalla punteggiatura, possiamo semplicemente aggiungere "e" alle colombe.

Ciò si traduce in feed di riga come segue:

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

Dodicesimo, non dodici.
Joey Adams,

@Joey Adams - Grazie per avermi corretto e per avermi dato un personaggio in meno :-)
Andrew Shepherd,

4

Perl, 368389 (nessun unicode / compressione)

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 :: IT :: Numbers , anche se non sono convinto al 100% che sia una buona idea quando vedo le lunghezze dei nomi del modulo e del suo identificatore. Richiede Perl 5.10 o versioni successive, eseguire dalla riga di comando con -Eun'opzione.

Modifica: miglioramenti minori: smettere di usare un array, un uso migliore degli $_spazi bianchi non necessari.


+1, fantastico! Qualcuno potrebbe lamentarsi dell'utilizzo di un modulo non standard, ma se consentiamo l'utilizzo di qualsiasi linguaggio (compresi quelli per scopi speciali come GolfScript), non vedo perché "Perl + Lingua :: EN :: Numbers" non vorrebbe ' essere una lingua valida per una soluzione. Tuttavia, scrivere un modulo "Acme :: 12Days" e inviarlo a CPAN è probabilmente un imbroglio. :)
Ilmari Karonen l'

@Ilmari Karonen quando le persone si lamentano, di solito rinominare la lingua in "CPAN". Non succede spesso.
JB

2
Ilmari, Golfscript non è un linguaggio speciale.
Joey,

2
Più come un linguaggio "accidentalmente generale": D
JB

1
Caro signore, perché le persone non possono più giocare a golf con il proprio codice?
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})]

Questo stampa i testi come indicato nella domanda con più righe per verso. Possiamo salvare alcuni caratteri se tale requisito non è presente.


+1 Schifo buco. Hai funzionato con i feed di riga e con "E" che appare sull'ultima riga.
Andrew Shepherd,

Bene, la stampa di un testo diverso non è mai stata un'opzione comunque, e "E" nell'ultima riga usa lo stesso trucco di tutti gli altri. Tuttavia, volevo preservare le interruzioni di linea che l'altra soluzione non (pur essendo anche più lunga).
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

So che è stato pubblicato qualche tempo fa, ma ho pensato di provare. Sono uno studente e sono ancora nuovo su questo, ma sembra funzionare.

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

}

Ciao Gina, benvenuta nel sito!
Tynam,

3
Complimenti per una prima soluzione; funziona bene. Il contest con code golf è "il codice più breve possibile", quindi su questo sito è standard fare alcune cose che non faresti mai nel codice normale: tagliare i nomi delle variabili e delle funzioni su un carattere, tagliare gli spazi bianchi e poche altre cose. (Va bene e ci si aspetta che includa anche la versione integrale come hai fatto qui per rendere l'approccio più chiaro.) Fatto ciò, puoi quindi chiederti: "come posso accorciarlo?"
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.")}

Puoi incollarlo in un parco giochi.

Ho provato a spostare il vnel comando di stampa e ho ottenuto:

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, compresso, 321 caratteri

Poiché il codice contiene caratteri non stampabili, invierò invece un hexdump del codice:

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                                       '

Per creare il codice effettivo dal hexdump, inserirlo in un file ed eseguirlo xxd -r hexdump > 12days.rb. Quindi l'esecuzione ruby1.9.3 12.days.rbeseguirà il codice e stamperà i testi. Nota che questo codice richiede Ruby 1.9.3 (perché lo utilizzaZlib.inflate ), quindi non funzionerà con Ruby 1.8.x, 1.9.1 e 1.9.2.

Il codice non compresso è lungo 425 caratteri:

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

Idea: decomprimere e valutare la soluzione Lingua :: EN :: Numbers di JB.

Innanzitutto, incolla questo blocco di testo nel comando perl -e 'use MIME::Base64; print decode_base64 $_ while <>;' >12days.pl. Quindi, esegui il comando 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==

Lo stesso script prende la forma in use Compress::Zlib;$_='...';eval uncompress$_;cui si ...trova la soluzione di carattere 368 di JB dopo essere stato compresso con questo comando e sfuggire a '.

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

La sceneggiatura di Ilmari si lamenta di modificare un valore di sola lettura senza i $_=...;caratteri extra , ma presumibilmente lo farebbe 313 . Puoi salvare molti più byte modificando manualmente la compressione come faceva Ilmari in precedenza, forse raggiungendo circa 310 , ma non mi sono preoccupato.


Perl, 376 (truffando un'altra presentazione) [la mia presentazione originale]

Innanzitutto, crea uno script perl chiamato 12days.pl contenente:

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

Successivamente, reindirizza l'output di qualsiasi altro invio in 12days.txt ed esegui il comando:

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

Vola 12days.plè di circa 376 byte e stampa la canzone. ;) L'utilizzo divertente di rawinflate sposta esattamente sei byte dal documento dati nel codice a partire dall'output di Ilmari.

Inizialmente avevo cercato un modulo di codifica Huffman direttamente, che non è poi così disonesto. Tuttavia, purtroppo CPAN non ha moduli con la tabella entropia inglese delle lettere, che è ciò che vuoi davvero quando comprimi stringhe molto brevi.

Ho scoperto che fortune -m Days\ of\ Christmasneanche questo funziona, purtroppo.


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

Lunghezza ridotta con compressione, 502

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

Non è il tipo di soluzione che mi piace leggere (ancora un altro 64-gzip di base, semplicemente fantastico), ma non vedo davvero alcun motivo per cui tu da solo meriti un punteggio di risposta negativo. Eseguito l'upgrade per apportare un certo equilibrio; chiunque abbia effettuato il downgrade ha richiesto di informarci del perché.
JB,

Molti hanno fornito una soluzione compressa, quindi solo per divertimento ho deciso di metterne anche una. Ma viene inserito anche il mio codice originale, quindi non vedo quale sia il problema. Basta ignorare quello con zip. Vorrei anche sapere perché sono stato sottoposto a downgrade.
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++;}}

Niente più avvertimenti alla compilazione.


1

Java, 608

Primo post su Stack Exchange, secondo tentativo di questo problema.

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 è un po 'complicato per attività come questa, ma l'uso di split ha contribuito a ridurre il sovraccarico di 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

Provalo online!

Se sono consentite nuove righe finali, è possibile salvare quattro 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

Provalo online!

Spiegazione

/// è una lingua in cui l'unica operazione è una sostituzione automodificante. In particolare, l'istruzione /abc/xyz/sostituisce tutte le istanze di abccon xyznel resto del codice sorgente, comprese le altre sostituzioni. Tutti gli altri caratteri vengono semplicemente inviati a STDOUT.

Mentre questo è sufficiente per la completezza di Turing, il golf in /// generalmente consiste nel cominciare con l'output previsto e nell'identificare sottostringhe ripetute che possono essere sostituite con scorciatoie a carattere singolo.

\può essere usato come carattere di escape in schemi, sostituzioni e caratteri letterali per indicare un letterale /o \.


La prima istruzione incontrata è /|/\/\//. Questo significa "sostituisci tutto |con //nel resto del programma". Ciò consente di risparmiare un byte per ogni successiva sostituzione nel programma.


Successivamente, viene effettuata una serie di sostituzioni per comprimere il testo stesso:

  • on the diventa ^.
  • day of christmas \n my true love gave to me \ndiventa %.
  • -a-diventa =.
  • ingdiventa &.
  • evendiventa *.
  • th%diventa +.
  • ^preceduto da due nuove righe (che appare in ogni verso tranne il primo) diventa :.

Successivamente, scriviamo i testi stessi. Questo viene fatto usando sostituzioni Atramite K. Ogni lettera sostitutiva aggiunge una riga alla sostituzione dopo di essa. Ad esempio, Krappresenta a partridge in a pear treee Jrappresentatwo turtle doves \n and K .

In questo modo, ogni verso della canzone è composto da:

  • ^ o :
  • Una stringa che rappresenta l'ordinale corretto (diciamo, el*th)
  • %
  • Una lettera Aattraverso Kche rappresenta i testi corretti.

Tuttavia, poiché la maggior parte degli ordinali finisce th, usiamo la sostituzione th%+per salvare alcuni byte.


0

Ci sono momenti in cui la soluzione più ovvia è anche la più breve, ovvero non potrei più resistere a questo impulso.

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

Una nuova riga aggiunta per la leggibilità.


3
Se questa è una soluzione valida, allora ne ho una ancora più breve scritta in HQ9 + C. (Questo è HQ9 + con un comando in più. Puoi indovinare cosa fa.)
Ilmari Karonen l'

1
Ho preso in considerazione l'idea di offuscare quello perl usando il eval compresstrucco per affermare di aver trovato una regex che si comprime molto bene, ma che gonfia di circa 200 caratteri. lol
Jeff Burdges l'

Il video non funziona ... inoltre, usa x.co , è l'accorciatore di URL più breve di cui sono a conoscenza

0

Java - 1329 caratteri

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

Sono troppo pigro per annullarlo, ma è qui: http://ideone.com/MU9IcP .


-2

SEMPLICE , 1 byte

a

Nota :

Il linguaggio è stato progettato dopo la sfida ed è ancora un WIP.

Come :

Qualsiasi personaggio produrrà i 12 giorni di Natale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.