Letra da música 12 Days of Christmas

17

Eu pensei que este seria um desafio divertido para todos e estou curioso para ver as soluções que as pessoas apresentam.

Imprimir a letra "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.

Regras

  • Você não precisa se preocupar com capitalização; todo o texto não diferencia maiúsculas de minúsculas
  • Você pode ignorar sensivelmente qualquer pontuação: hífens podem ser espaços e vírgulas e pontos podem ser ignorados
  • Deve haver uma linha em branco entre cada verso
  • Você deve ordenar seus números: " primeiro dia de Natal", " quatro pássaros cantando", etc.
macek
fonte
3
Você pode fornecer a versão completa de cada linha? Estou acostumado a "meu verdadeiro amor me deu " e o uso de diferentes versões pode afetar as soluções.
Matthew Leia
Atualizado letras completas.
macek
Isso significa que "você pode soltar letras maiúsculas" ou "todo o texto não diferencia maiúsculas de minúsculas" de não se preocupar com letras maiúsculas?
JB
Além disso, na linha de ignorar pontuação, podemos trocar pontuação por espaço em branco (e reciprocamente)?
JB
11
@macek: melhor, mas o lado latente da minha pergunta era: posso imprimir hífens em vez de espaços também?
JB

Respostas:

23

Brainfuck - 2.974

Estou bastante orgulhoso deste. Isso soa como um número bastante grande, mas lembre-se de que eu não usei nenhuma biblioteca de compactação externa e nenhum texto original está no meu programa em lugar algum. Nenhuma das outras submissões pode dizer isso. Tudo isso é codificado manualmente. Geradores de texto mais ingênuos dão mais de 39 mil para este texto, então eu diria que essa é uma melhoria significativa.

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

Infelizmente, isso tem cerca de 600 caracteres a mais que sua própria saída, mas tanto faz. Ele mantém os caracteres c, h, m, r, w em uma matriz e usa isso para imprimir todo o texto. Duas matrizes à direita de doze espaços controlam cada dia em que estamos contando e para quais itens podemos produzir. Talvez eu consiga otimizá-lo um pouco, reorganizando o mapa de memória para colocar os caracteres de impressão entre as duas matrizes de contagem para evitar cadeias tão longas de <<<<<<<e >>>>>>, mas isso daria muito trabalho nesse momento. Eu também poderia provavelmente escolher alguns caracteres iniciais melhores com análise de frequência para minimizar o incremento / decremento, mas tanto faz.

Isso depende das células de quebra automática de 8 bits para funcionar corretamente.

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..>>>>>.<<<<<-->->--->>>>>>>>>>>>>>>>>>>-]
   <<<<<<<<<<<<<<<<<<<<<<..>>>>>>>->+
   [>+>>>>>>>>>>>>>[>]+[<]<<<<<<<<<<<<<-]>[<+>-]<<
]
captncraig
fonte
11
Eu toleraria comentários em linha sobre envios desse tamanho (sem contar a pontuação do golfe). Marcou com +1 de qualquer maneira.
JB
Coisa certa. Adicionada versão ungolfed. Para os números dos dias, apenas um bit é definido entre doze e, após a saída, define os próximos dias. Para itens, a próxima à última linha define n bits em uma linha alta e todas as saídas ativas são obtidas.
captncraig
10

Perl, 438291 caracteres

Inspirado pelo uso da compactação DEFLATE por Jeff Burdges , pelo código Ruby compactado do Ventero e pelo uso de Lingua :: EN :: Numbers pela JB , consegui compactar minha entrada para 291 caracteres (bem, bytes), incluindo o código de descompressão. Como o programa contém alguns caracteres não imprimíveis, eu o forneci no formato MIME Base64 :

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

Para descriptografar o programa, você pode usar o seguinte script auxiliar Perl:

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

Salve a saída em um arquivo nomeado 12days.ple execute-o com perl -M5.01 12days.pl. Como observado, você precisa ter o módulo Lingua :: EN :: Numbers instalado para que o código funcione.

Caso você esteja se perguntando, a parte legível do código simplesmente se parece com isso:

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

onde ...significa 254 bytes de RFC 1950 compactado código Perl. Descompactado, o código tem 361 caracteres e fica assim:

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

Escrever esse código era um tipo estranho de exercício de golfe: a repetição maximizada e a minimização do número de caracteres distintos usados ​​são muito mais importantes do que minimizar a contagem bruta de caracteres quando a métrica relevante é o tamanho após a compactação .

Para extrair os últimos caracteres, escrevi um programa simples para tentar pequenas variações desse código e encontrar o que comprime melhor. Para compactação, usei o utilitário KZIP de Ken Silverman , que normalmente produz melhores rações de compactação (ao custo da velocidade) do que o Zlib padrão, mesmo nas configurações de compactação máxima. Obviamente, como o KZIP cria apenas arquivos ZIP, tive que extrair o fluxo DEFLATE bruto do arquivo e envolvê-lo em um cabeçalho e soma de verificação RFC 1950. Aqui está o código que usei para isso:

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 isso parece um kluge horrível, é porque é exatamente o que é.


Para interesse histórico, aqui está minha solução original de 438 caracteres, que gera uma saída melhor, incluindo quebras de linha e pontuação:

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

Destaques desta versão o par de regexps s/e?t? .*/th/,s/vt/ft/ , que constroem os ordinais de 4 a 12 a partir dos cardeais no início das linhas de presentes.

Obviamente, esse código também pode ser compactado usando o truque Zlib descrito acima, mas acontece que simplesmente compactar a saída é mais eficiente, produzindo o seguinte programa de 338 bytes (no formato Base64, novamente):

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

Eu também tenho um arquivo gzip de 312 bytes da letra, construído a partir do mesmo fluxo DEFLATE. Suponho que você possa chamá-lo de "script zcat". :)

Ilmari Karonen
fonte
Parece que você pode substituir ringspor rGspara salvar 2 caracteres
macek
@macek: Na minha versão original, não consegui, porque estava substituindo Gpor ing,, mas acontece que adicionar vírgulas mais tarde é realmente mais curto. Obrigado!
Ilmari Karonen
Como você evita o erro 'modificação de um valor somente leitura'?
precisa saber é o seguinte
@JeffBurdges: Na versão original? Atribuindo as strings a uma matriz primeiro.
Ilmari Karonen
"Modificação de um valor somente leitura tentada na /opt/local/lib/perl5/5.12.3/Compress/Zlib.pm linha 357." Evitei esse problema atribuindo-o $_na minha atualização abaixo.
precisa saber é o seguinte
10

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

As facilidades internas para formatar ordinais são úteis, mas a maior parte da compactação vem do fato de poder usar a mesma lista de argumentos repetidamente, ignorando cada vez menos argumentos a cada execução.

Conforme comprovado pelo coredump nos comentários, as instalações internas ainda podem ser bem utilizadas pelos cardeais.

JB
fonte
Talvez você poderia comprimir um pouco mais, uma vez que as linhas começar com "doze", "onze", "dez", ...
coredump
Talvez seja. Qual a sua sugestão?
JB
11
Eu primeiro esperava que o número restante de argumentos pudesse ser usado, mas li as especificações e não consigo. A falta que tenho é de 333 caracteres:(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
Agora estamos a falar. Meu sonho teria sido compartilhar o contador de saltos com o ordinal, mas não encontrei uma maneira curta de fazer isso.
JB
7

JavaScript 570

Esta é a minha primeira vez jogando golfe. JavaScript 570

var l=["first","second","third","fourth","fifth","sixth","seventh","eigth","nineth","tenth","eleventh","twelth","Two turtle doves","Three french hens","Four calling birds","Five golden rings","Six geese-a-laying","Seven swans-a-swimming","Eight maids-a-milking","Nine ladies dancing","Ten lords-a-leaping","Eleven pipers piping","Twelve drummers drumming"];var b = "<br/>";for(var i=0;i<12;i++){var p="On the "+l[i]+"day of Christmas"+b+"My true love gave to me"+b;for(var x=i;x>0;x--)p+=l[13+x]+b;if(i>0)p+="and ";p+="a partridge in a pear tree"+b+b;document.write(p);}
Silabsoft
fonte
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:])

No entanto, coloquei o 'e' na mesma linha das pombas, em vez da perdiz.

Daan
fonte
11
Você cometeu o mesmo erro de ortografia que eu: é "décimo segundo"
Andrew Shepherd
Bem, isso me salva outro personagem então ... Obrigado!
Daan
5

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

ou de uma forma mais legível (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

alguém teve uma idéia de como contornar o reverso? não consegui encontrar uma solução

kev
fonte
Gosto do seu truque com * para representar "ing". Você deve conseguir baixá-lo para cerca de 440: use em 12.timesvez de (0..11).each; faça um único put com dois argumentos em vez de dois put com um argumento; use a notação% w () para a matriz dos dias do Natal. Finalmente, você pode se livrar do reverso invertendo a lista, adicionando um ^ extra ao final da string e usando em [-i..-1]vez de [0..i].
Wayne Conrad
você não pode mudar "drumming" para "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"
}

Esta é a minha primeira tentativa e tenho certeza de que poderia ser muito mais curta. As quebras de linha são para facilitar a leitura. Possui três matrizes importantes, uma das quais contém o nome para cada dia @s, uma das quais lista todos os presentes (exceto o primeiro) @ae uma que lista os presentes que já foram dados @b. O principal mecanismo é que, a cada dia, ele imprime @be depois transfere um presente adicional de @apara @b.

Agradecimentos a Andrew por 500-> 485

PhiNotPi
fonte
você pode substituir ringspor r$1spara economizar mais 1 char
macek
@macek Não posso fazer isso porque o perl interpretará o scomo parte do nome da variável e a variável $isnão existe. (Na verdade, são i em vez de uns, btw)
PhiNotPi
eigth->eighth
Mateus Leia
Você poderia substituir $i, por exemplo, $;para contornar isso. Ninguém nunca usa $;para o propósito a que se destina.
Ilmari Karonen
@IlmariKaronen Eu segui seu conselho, mas corrigi um erro de digitação, para que a contagem de caracteres permanecesse a mesma.
PhiNotPi
5

Vim - 578 pressionamentos de tecla

Decidi tentar vim-golf isso, pois esse é o tipo de coisa que pode ser vim-golfed.

Comece inserindo a estrutura - a linha "X day of Christmas" um total de 12 vezes (89 pressionamentos de teclas):

                                         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

Em seguida, execute uma série de macros que inserirão os números 2 a 12 nos respectivos locais em que precisam estar para a letra (172 pressionamentos de teclas):

                                      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

O "dw" na segunda linha é livrar-se do primeiro "e", porque não vai para lá.

Em seguida, faça uma série de substituições pelo número de coisas que o amor verdadeiro deu (319 pressionamentos de tecla):

                                       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, finalmente, substituindo cada ocorrência de Xpor um número ordinal:

                         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 nós terminamos!


Tenho certeza de que houve outras otimizações que eu perdi, mas acho que é muito bom mesmo.

Joe Z.
fonte
Ah, eu esqueci as fugas.
Joe Z.
Você pode deixar de fora o / g com as substituições, assim::%s/2/two turtle doves,
therealfarfetchd
4

C (644)

Contagem não inclui espaços em branco usados ​​para apresentação.

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

A saída é como:

On the first day of Christmas my true love gave to me A partridge in a pear tree

...

On the twelfth day of Christmas my true love gave to me Twelve drummers drumming Eleven pipers piping Ten lords-a-leaping Nine ladies dancing Eight maids-a-milking Seven swans-a-swimming Six geese-a-laying Five golden rings Four calling birds Three french hens Two turtle doves and A partridge in a pear tree
Matthew Read
fonte
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' '
        )
    )
 }

Obrigado a Daan pela idéia de dividir uma string concatenada.

Originalmente, eu incluí uma declaração de mudança para colocar o "e" na perdiz para todos, exceto o primeiro verso. Mas, como a pergunta nos absolve da pontuação, podemos simplesmente acrescentar o "e" às ​​pombas.

Isso resulta em feeds de linha da seguinte maneira:

On the first day of christmas my true love gave to me a partridge in a pear tree

On the second day of christmas my true love gave to me two turtle doves and a partridge in a pear tree

On the third day of christmas my true love gave to me three french hens two turtle doves and a partridge in a pear tree
Andrew Shepherd
fonte
Décimo segundo, não doze.
Joey Adams
@Joey Adams - Obrigado por me corrigir e me dando um caráter menos :-)
Andrew Shepherd
4

Perl, 368 389 (sem unicode / compactação)

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

Aproveita Lingua :: PT :: Números , embora eu não esteja 100% convencido de que é uma boa ideia quando vejo os comprimentos dos nomes dos módulos e identificadores. Precisa do Perl 5.10 ou posterior, execute a partir da linha de comando com um-E switch.

Editar: pequenas melhorias: pare de usar uma matriz, use melhor o $_espaço em branco desnecessário.

JB
fonte
+1, Legal! Alguém pode reclamar sobre o uso de um módulo não padrão, mas se estamos permitindo que qualquer idioma seja usado (incluindo idiomas para fins especiais como o GolfScript), não vejo por que "Perl + Lingua :: EN :: Numbers" não seria ' não seja um idioma válido para uma solução. Escrever um módulo "Acme :: 12Days" e enviá-lo ao CPAN provavelmente está enganando. :)
Ilmari Karonen
@Ilmari Karonen quando as pessoas reclamam, eu geralmente renomeio o idioma para "CPAN". Não acontece frequentemente.
JB
2
Ilmari, Golfscript não é uma linguagem para fins especiais.
Joey #
2
Mais como uma linguagem de propósito "acidentalmente geral": D
JB
11
Caro senhor, por que as pessoas não podem mais jogar seu próprio código?
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})]

Isso imprime a letra como indicado na pergunta com várias linhas por verso. Podemos salvar alguns caracteres se esse requisito não existir.

Joey
fonte
+1 porcaria Holey. Você conseguiu isso trabalhando com feeds de linha, bem como o "E" aparecendo na última linha.
Andrew Shepherd
Bem, imprimir um texto diferente nunca foi uma opção, e o "E" na última linha usa o mesmo truque que todos os outros. Ainda assim, eu queria preservar quebras de linha que a outra solução não faz (embora também seja mais longa).
Joey #
3

C # (528)

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

Java, 2062

Sei que isso foi publicado há um tempo, mas pensei em tentar. Eu sou um estudante e ainda sou novo nisso, mas parece funcionar.

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
fonte
Olá Gina, bem-vindo ao site!
Tynam
3
Parabéns pela primeira solução; funciona bem. O concurso com código de golfe é o 'código mais curto possível'; portanto, neste site é padrão fazer algumas coisas que você nunca faria no código normal: cortar nomes de variáveis ​​e funções em um caractere, cortar espaços em branco e outras coisas. (Tudo bem, e espera-se, incluir também a versão completa, como você fez aqui para tornar a abordagem mais clara.) Feito isso, você pode se perguntar: "como posso tornar isso mais curto?"
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.")}

Você pode colar isso em um playground.

Tentei mover o vcomando de impressão e obtive:

Playground execution failed: <EXPR>:20:1: error: expression was too complex to be solved in reasonable time; consider breaking up the expression into distinct sub-expressions
Krys Jurgowski
fonte
1

Ruby 1.9.3, compactado, 321 caracteres

Como o código contém caracteres não imprimíveis, postarei um hexdump do código:

0000000: 2363 6f64 696e 673a 6269 6e61 7279 0a72  #coding:binary.r
0000010: 6571 7569 7265 277a 6c69 6227 3b65 7661  equire'zlib';eva
0000020: 6c20 5a6c 6962 2e69 6e66 6c61 7465 2778  l Zlib.inflate'x
0000030: da2d 90db 6ac3 300c 86ef f714 a163 b042  .-..j.0......c.B
0000040: 15e8 5ea7 f442 8be5 58cc 8720 39cd 42db  ..^..B..X.. 9.B.
0000050: 3dfb e4a4 3792 f559 c7ff fcd5 574e a4f7  =...7..Y....WN..
0000060: 073f a6b9 eaa1 64a8 81e0 fdfe b17c 7a16  .?....d......|z.
0000070: ad9d d250 b2eb 6a60 719d 2fb3 d4d0 79f6  ...P..j`q./...y.
0000080: 6695 7f9b a51b 65f3 c463 3097 b905 7547  f.....e..c0...uG
0000090: f1f5 5717 8a56 71bc f0f5 090e 5728 1e86  ..W..Vq.....W(..
00000a0: 20ac 35a1 bea5 15aa cc04 b1dc 0846 3453   .5..........F4S
00000b0: 0b24 3a9c 6c87 5669 c0c9 9c12 89ee 0fce  .$:.l.Vi........
00000c0: e3ab 374c 3c35 6cae 411b 6b5d c429 2044  ..7L<5l.A.k].) D
00000d0: c28d d942 d61a 1d93 5563 1eb6 e2b6 2b24  ...B....Uc....+$
00000e0: e42d 3371 fc69 74bb 0474 c1dc a82e bc4f  .-3q.it..t.....O
00000f0: b233 6124 526a 4d71 6dc8 73db b444 67f9  .3a$RjMqm.s..Dg.
0000100: 6240 3761 60c0 182d 826f 934a 4d31 2102  b@7a`..-.o.JM1!.
0000110: 2f94 8700 81b2 91a5 4035 01a3 1d64 b7da  /[email protected]..
0000120: 1413 1661 42a9 c26e 24e0 6c33 2642 3141  ...aB..n$.l3&B1A
0000130: 888e 973f ee7b 385f 4fd3 f31f be35 9d6f  ...?.{8_O....5.o
0000140: 27                                       '

Para criar o código real do hexdump, coloque-o em um arquivo e execute xxd -r hexdump > 12days.rb . A execução ruby1.9.3 12.days.rbexecutará o código e imprimirá a letra. Observe que esse código requer o Ruby 1.9.3 (porque usaZlib.inflate ), portanto, não funcionará com o Ruby 1.8.x, 1.9.1 e 1.9.2.

O código não compactado tem 425 caracteres:

12.times{|i|puts"on-the-#{%w(first second third fourth fifth sixth seventh eighth ninth tenth eleventh twelfth)[i]}-day-of-christmas
my-true-love-gave-to-me",%w(twelve-drummers-drumming eleven-pipers-piping ten-lords-a-leaping nine-ladies-dancing eight-maids-a-milking seven-swans-a-swimming six-geese-a-laying five-golden-rings four-calling-birds three-french-hens two-turtle-doves-and a-partridge-in-a-pear-tree)[~i..-1],p}
Ventero
fonte
1

Perl, 319/313

Idéia: Descompacte e avalie a solução Lingua :: EN :: Numbers da JB.

Primeiro, cole este bloco de texto no comando perl -e 'use MIME::Base64; print decode_base64 $_ while <>;' >12days.pl. Em seguida, execute o 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==

O script em si assume o formato use Compress::Zlib;$_='...';eval uncompress$_;onde ...está a solução 368 char do JB após ser compactado com este comando e escapar de a '.

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

O script de Ilmari reclama sobre a modificação de um valor somente leitura sem os $_=...;caracteres extras , mas presumivelmente ele faria isso 313 . Você pode economizar mais alguns bytes ajustando a compactação manualmente, como o Ilmari fez antes, talvez atingindo 310 ou mais , mas eu não me incomodei.


Perl, 376 (trapaceando outra finalização) [meu envio original]

Primeiro, crie um script perl chamado 12days.plcontendo:

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

Em seguida, canalize a saída de qualquer outra submissão 12days.txte execute o comando:

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

O Vola 12days.pltem cerca de 376 bytes e imprime a música. ;) O uso divertido de rawinflate move precisamente seis bytes do documento de dados para o código a partir da saída de Ilmari.

Originalmente, comecei a procurar diretamente um módulo de codificação Huffman, o que não é tão desonesto. No entanto, infelizmente o CPAN não possui módulos com a tabela de entropia de letras em inglês, que é o que você realmente deseja ao compactar strings muito curtas.

Descobri que fortune -m Days\ of\ Christmasisso também não funciona, infelizmente.

Jeff Burdges
fonte
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";

Comprimento reduzido com compressão, 502

eval(gzuncompress(base64_decode('eNpVkE1u3DAMhfc+BWEI8AzqDtJtg7QHCYKCsWiLrX4MUjPOAD58KE829UIyP5Hge8/lF/pYY/F0GvZhHGYWrbvSVLLfa2Dx+1yuUsM+82yn8kc76UbZbuIl2JW5FfWB4tdb3SjaxHB+dtv/OzB7QFhRqrBfCDi3klCgCtHFJgtU2xkJfLmRmg7jMAvlKUCgrIcmmDBGzgu8m0pDfCNYSvSUQQxr0woLkRLg94h3Yw/hoBtmNagbp9Tw4QMSsm84cfzXqNkiiOiZFDzmqTEzCbHI0RcJ12P6sAwrryTarqPR7JsgL9eUGj5+7MHymIsQTuHkzLeC45df7u+ZplCgLxlqIHD51fGbLb1DmWEKwloT6tilu2V0NVWWC6jlDLVAoq6/aJU/QmvEiU6Ofw/DzyNni3sYOT3S78euH1EE79Z6M1V0elQauY1t49Po+NuPs32Xvuv650+BSMT/')));
Vladimir
fonte
Não é o tipo de solução que eu gosto de ler (mais uma base-64 / gzip, simplesmente ótima), mas realmente não vejo nenhuma razão pela qual você merece uma resposta negativa com isso. Votado para trazer algum equilíbrio; quem recusou o pedido é solicitado a nos informar o porquê.
JB
Muitos forneceram uma solução compactada, então, apenas por diversão, decidi colocar uma também. Mas meu código original também foi postado, então não vejo qual é o problema. Apenas ignore o compactado. Eu também gostaria de saber por que estava sendo votado.
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++;}}

Não há mais aviso na compilação.

MARTIN Damien
fonte
1

Java, 608

Primeiro post no Stack Exchange, segunda tentativa neste 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 é um pouco complicado para tarefas como essa, mas o uso da divisão ajudou a reduzir a sobrecarga da String.

Ben I.
fonte
1

/// , 439 bytes

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

Experimente online!

Se novas linhas à direita forem permitidas, você poderá salvar quatro bytes:

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

Experimente online!

Explicação

/// é uma linguagem em que a única operação é uma substituição auto-modificável. Em particular, a instrução /abc/xyz/substitui todas as instâncias de abccomxyz no restante do código-fonte, incluindo outras substituições. Quaisquer outros caracteres são simplesmente enviados para STDOUT.

Embora isso seja suficiente para a conclusão de Turing, o golfe em /// geralmente consiste em começar com a saída pretendida e identificar substrings repetidos que podem ser substituídos por atalhos de caractere único.

\pode ser usado como um caractere de escape em padrões, substituições e caracteres literais para significar um literal /ou \.


A primeira instrução encontrada é /|/\/\//. Isso significa "substituir tudo |por //no restante do programa". Isso economiza um byte para todas as substituições subseqüentes no programa.


Depois disso, um conjunto de substituições é feito para compactar o próprio texto:

  • on the torna-se ^.
  • day of christmas \n my true love gave to me \ntorna-se %.
  • -a-torna-se =.
  • ingtorna-se &.
  • eventorna-se *.
  • th%torna-se +.
  • ^precedido por duas novas linhas (que aparecem em todos os versículos, mas o primeiro) se torna :.

Depois disso, escrevemos as letras em si. Isso é feito usando substituições Aatravés K. Cada substituição de letra adiciona uma linha à substituição após ela. Por exemplo, Krepresenta a partridge in a pear treee Jrepresentatwo turtle doves \n and K .

Dessa maneira, cada verso da música é composto de:

  • ^ ou :
  • Uma sequência que representa o ordinal correto (digamos el*th)
  • %
  • Uma carta Aatravés de Kque representa as letras corretas.

No entanto, como a maioria dos ordinais termina em th, usamos a substituição th%+para salvar alguns bytes.

Esolanging Fruit
fonte
0

Há momentos em que a solução mais óbvia também é a mais curta, ou seja, eu não conseguia mais resistir a esse desejo.

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

Uma nova linha adicionada para facilitar a leitura.

Jeff Burdges
fonte
3
Se essa é uma solução válida, tenho uma ainda mais curta, escrita em HQ9 + C. (Isso é HQ9 + com um comando extra que você pode adivinhar o que ele faz..)
Ilmari Karonen
11
Eu considerei ofuscar o perl usando o eval compresstruque para afirmar que encontrei um regex que se comprime muito bem, mas que contém cerca de 200 caracteres. lol
Jeff Burdges
O vídeo não funciona ... também, o uso x.co , é o mais curto encurtador de url Estou ciente
0

Java - 1329 caracteres

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

Estou com preguiça de desfazer isso, mas está aqui: http://ideone.com/MU9IcP .

Hosch250
fonte
-2

SIMPLES , 1 byte

a

Nota :

O idioma foi desenvolvido após o desafio e ainda é um WIP.

Quão :

Qualquer caractere produzirá os 12 dias do Natal.

Muhammad Salman
fonte