Função MacDonald antiga

16

Crie uma função no idioma escolhido que imprima o seguinte:

Old MacDonald had a farm, E-I-E-I-O,
And on that farm he had a cow, E-I-E-I-O,
With a moo moo here and a moo moo there,
Here a moo, there a moo, everywhere a moo moo,
Old MacDonald had a farm, E-I-E-I-O!

Onde cowe moosão seqüências de caracteres nos parâmetros de função e, como tal, podem ser alterados para pige oinkou sheepe baa, por exemplo.

Deve levar em conta letras maiúsculas, hífens, pontuação, espaços e quebras de linha.

Procure digitar a menor quantidade de caracteres Unicode no seu código.

rybo111
fonte
11
Isso não deveria ser complexidade kolmogorov ?
Mniip 5/05
6
Você diz echoes the following. Você quer dizer que a função deve imprimi-la ou devolvê-la?
Cjfaure 5/05
2
Para tornar isso justo, acho que deve ter a pontuação exata, os espaços e os retornos de carro na pergunta. Mas o que você acha das letras maiúsculas / minúsculas? Eu pensei que um único caso poderia ser mais fácil e evitar uma carga de aplicativos padrão de base64 ou similar. Em resumo, as únicas maiúsculas estão no início da linha, a palavra MacDonald e no EIEIO, portanto, pode ser mais interessante fazer isso exatamente de acordo com a pergunta.
Level River St
4
É aceitável produzir a oinkou deve ser feito para ser an oink?
ClickRick 5/05
4
@ rybo111: Você sabia que o grande Donald Knuth escreveu um artigo acadêmico sobre esse tipo de coisa? Na verdade, foi publicado em um jornal real (reconhecidamente na edição de abril). Mais aqui, incluindo um link para o PDF do artigo: en.wikipedia.org/wiki/The_Complexity_of_Songs
Tom Chantler

Respostas:

15

Javascript ES6 - 204

Procure digitar a menor quantidade de caracteres Unicode no seu código.

Não é o mais curto, mas provavelmente o mais ofuscado.

f=(a,b)=>{for(c=[b,a].concat('!,-ADEHIMOWacdefhilmnortvwy \n'.split(o='')),i=62;i;o+=c[e>>10]+c[e/32&31]+c[e&31])e='ⱞᄤ⒇瓤抣瘭㾭癍㚏᫶⦮函࿋Π疽䌐獲樘ྰ㞠戝晐}疽䌐࿈䌐眲Π疽㛏戝癐Π疽伲࿌⒋ფᲉѽ疽䦯䨝抽瘭䦹容㾷碶ᅣᲉᄤྦྷ㜕㞱㗽㾲妴㣗畍⺏'.charCodeAt(--i);alert(o)}

Se o seu navegador não suportar o ES6:

function f(a,b){for(c=[b,a].concat('!,-ADEHIMOWacdefhilmnortvwy \n'.split(o='')),i=62;i;o+=c[e>>10]+c[e/32&31]+c[e&31])e='ⱞᄤ⒇瓤抣瘭㾭癍㚏᫶⦮函࿋Π疽䌐獲樘ྰ㞠戝晐}疽䌐࿈䌐眲Π疽㛏戝癐Π疽伲࿌⒋ფᲉѽ疽䦯䨝抽瘭䦹容㾷碶ᅣᲉᄤྦྷ㜕㞱㗽㾲妴㣗畍⺏'.charCodeAt(--i);alert(o)}

Copiar / colar esse código em consola seu navegador e tente f('cow','moo'), f('pig','oink'),f('sheep','baa')

Como funciona ?

cé uma matriz de 29 letras mais o animal e seu som (vamos chamar isso de nosso alfabeto ).
Portanto, todos os 31 caracteres cabem em 5 bits (2 ^ 5 = 32).
Um caractere Unicode tem 16 bits de comprimento, portanto pode codificar 3 caracteres do nosso alfabeto com um bit de preenchimento.
O texto completo com as novas linhas tem 186 caracteres do nosso alfabeto , ele pode ser codificado com 62 caracteres Unicode.

Por exemplo, Oldé codificado assim:

alphabet value         O      l      d
alphabet index         11     20     15
unicode           0  01011  10100  01111  ===> \u2e8f (⺏)

Se você tiver problemas para ler alguns caracteres Unicode, instale a fonte Code2000

Michael M.
fonte
2
"cow"e "moo"devem ser os parâmetros de função. Ao fazer com que o chamador passe uma matriz, você está salvando caracteres na definição da função à custa de adicionar à contagem de caracteres do código de chamada. Isso cheira como uma trapaça para mim. Tomando essa abordagem ao extremo, você pode definir function f(a){alert(a)}(23 caracteres) e dizer que precisa ser chamado assim f("Old MacDonald had a ...").
6114 tobyink
11
Eu havia passado as strings em dois parâmetros separados, mas depois de ler o desafio, não vi razão para não passar as strings no formato de matriz, então editei minha resposta. Isso não é trapaça, basta salvar alguns caracteres quando possível. Vamos @ rybo111 decidir se isso se encaixa na regra ou não.
Michael M.
11
@tobyink Eu usei o termo 'string' (não array) nas regras, então suponho que você esteja certo. Eu acho que 'trapaça' é um pouco duro, no entanto!
Rybo111
2
Por que isso tem tantos votos? É mais de 200 e nem mesmo a solução javascript mais curta.
Aditsu
Whell thgth e bem explicado, também tenho o meu voto
edc65 25/10/14
5

CJam - 142 / GolfScript - 144

{" had| a |farm|68, |68 8|here|Old MacDonald765|, E-I-E-I-O|10,
And on that 5 he7690,
With3 2 and3 t2,
Here4t24everyw23,
10!"'|/~A,{`/\*}/}:F;

Uso: "cow""moo"F
Para GolfScript, substitua '|por "|"eA por10

Explicação:

A parte principal é A,{`/\*}/:
A,{...}/executa o bloco para cada número de 0 a 9 (A = 10)
`converte o número em string
/\*e substitui uma string: se tivermos na pilha "bar" "foo 1 baz" "1", /dividimos a string resultando em ["foo " " baz"], \troca essa matriz pelo item anterior ("bar") e* junta-se à matriz, resultando em"foo bar baz"

Portanto, o código substitui cada número na cadeia principal por uma cadeia anteriormente na pilha. Nós temos o animal e o som, então "tivemos", "a", etc e, finalmente, ", EIEIO" e a corda principal, "10, ...!". Para evitar o uso de muitas aspas, coloquei todas as strings (exceto os parâmetros) em uma string, depois a dividi e joguei a matriz resultante ('|/~ )

A cadeia principal passa pelas seguintes transformações:

10,
And on that 5 he7690,
With3 2 and3 t2,
Here4t24everyw23,
10!

substitua "0"por ", E-I-E-I-O":

1, E-I-E-I-O,
And on that 5 he769, E-I-E-I-O,
With3 2 and3 t2,
Here4t24everyw23,
1, E-I-E-I-O!

substitua "1"por "Old MacDonald765":

Old MacDonald765, E-I-E-I-O,
And on that 5 he769, E-I-E-I-O,
With3 2 and3 t2,
Here4t24everyw23,
Old MacDonald765, E-I-E-I-O!

substitua "2"por "here"e depois "3"por"68 8" etc.

8 corresponde ao som e 9 ao animal.

aditsu
fonte
Você pode explicar isso? Eu não sei mesmo o que CJam é
Cruncher
O @Cruncher CJam é uma linguagem que eu criei , sf.net/p/cjam ; Eu posso explicar isso uma vez eu terminar golfe it :)
aditsu
11
@Cruncher adicionou explicação agora
aditsu 5/05
9
♬ e nesses cinco ele setenta e seis nove, ze eee ro ♬
aditsu 05/05
Pode E-I-ser uma string que é então repetida? :)
rybo111
5

Bash + iconv, 128 caracteres Unicode

Pega o corpo da função pure-bash / ascii abaixo e codifica reversamente em caracteres unicode:

m()(c=`iconv -t unicode<<<㵳⁜屡␠ਲ㵨敨敲攊ⰽ⁜ⵅⵉⵅⵉ੏㵯伢摬䴠捡潄慮摬栠摡愠映牡⑭≥攊档␢Ɐ䄊摮漠桴瑡映牡敨栠摡愠␠␱ⱥ圊瑩⑨⁳㈤␠⁨湡⑤⁳㈤琠栤ਬ效敲猤‬⑴⑨ⱳ攠敶祲⑷⑨⁳㈤ਬ漤™ਠ`
eval "${c:2}")

Define uma função de shell m. Ligue como:

$ m pony neigh
O velho MacDonald tinha uma fazenda, EIEIO,
E naquela fazenda ele tinha um pônei, EIEIO,
Com um vizinho aqui e outro aqui,
Aqui um relincho, há um relincho, em todo lugar um relincho,
O velho MacDonald tinha uma fazenda, EIEIO!
$ 

Pure bash, 171 bytes (somente ascii)

Eu acho que vale a pena notar que o verso original (com "vaca" e "moo") tem apenas 203 caracteres.

m()(s=\ a\ $2
h=here
e=,\ E-I-E-I-O
o="Old MacDonald had a farm$e"
echo "$o,
And on that farm he had a $1$e,
With$s $2 $h and$s $2 t$h,
Here$s, t$h$s, everyw$h$s $2,
$o"!)

Define a função shell m. Ligue como:

$ m baa de ovelha
O velho MacDonald tinha uma fazenda, EIEIO,
E naquela fazenda ele tinha uma ovelha, EIEIO,
Com um baa baa aqui e um baa baa lá,
Aqui uma baa, lá uma baa, em todo lugar uma baa baa,
O velho MacDonald tinha uma fazenda, EIEIO!
$
Trauma Digital
fonte
4

C ++ (403)

Tudo bem, isso é um tiro no escuro, mas quem não gosta de definir demais?

#define O ", E-I-E-I-O"
#define E O<<","
#define I "Old MacDonald had a farm"
#define H(a) "And on that farm he had a "<<a<<E
#define D(s) s<<" "<<s
#define W(s) "With a "<<D(s)<<" here and a "<<D(s)<<" there,"
#define V(s) "Here a "<<s<<", there a "<<s<<", everywhere a "<<D(s)<<","
#define F I<<O<<"!"
#define N endl
void m(string a, string s){cout<<I<<E<<N<<H(a)<<N<<W(s)<<N<<V(s)<<N<<F<<N;}
einsteinsci
fonte
2
this.eyes.bleeding = true;
Proxy
Alguma definição que poderia embalar ainda mais isso?
Einsteinsci #
11
Costumava ser possível #define X define e depois usar #X Y Z. Infelizmente, esses dias IOCCC inebriantes agora são passado longo ...
nneonneo
Que tal usar + vez de <<? Ou usando em char*vez de string? // Apenas um deles pode ser usado ao mesmo tempo.
Qwertiy
2

Python, 116 caracteres Unicode

def f(**a):print u'鱸쿳光䷰癌쿉ы㊲匒ሔ툕謒畲尔㵵䅵忘쮇⼱ⅅ伿⒡넣Ⰴ邩ઑ꩕醪徜妮ꊌ㰺⒳Ⰳ鮕꾟ౙ㎧譒ᕒ끒镈롴쀼怪㪢愐腤닔ꋔ狊兔Ⲹ㾗꽡Ȩ똀䝸å'.encode('u16')[2:].decode('zip')%a

O StackOverflow está comendo meus caracteres especiais, então aqui está o arquivo em base64:

77u/ZGVmIGYoKiphKTpwcmludCB1J+mxuOy/s+WFieS3sOeZjOy/idGL44qy5YyS4YiU7YiV6KyS55Wy5bCU47W15IW15b+Y7K6H4ryx4oWF5Ly/4pKh64Sj4rCE6YKp4KqR6qmV6Yaq5b6c5aau6oqM47C64pKz4rCD6a6V6r6f4LGZ446n6K2S4ZWS74yS64GS6ZWI7pKA66G07IC85oCq46qi5oSQ6IWk64uU6ouU54uK5YWU4rK4476X6r2hyKjrmIDknbjDpScuZW5jb2RlKCd1MTYnKVsyOl0uZGVjb2RlKCd6aXAnKSVh

Os dados são compactados usando o zlib, que codifica com eficiência sequências repetidas (o zlib é bom para compactar texto em geral). Para tirar proveito da regra "Caracteres Unicode", o pedaço de zlib de 121 bytes é preenchido e dividido pela metade em uma cadeia de caracteres Unicode de 61 caracteres, interpretando a sequência de bytes como UTF-16.

Chame a função como

f(cow='pig', moo='oink')
nneonneo
fonte
Bom, mas Onde cow e moo são strings nos parâmetros de função e, como tal, podem ser alterados para pig e oink ou sheep e baa, por exemplo . Parece que sua saída está codificada para cow / moo.
Digital Trauma
@DigitalTrauma: Minha compreensão de leitura falha! Fixo.
Nneonneo
isso é melhor :) +1
Digital Trauma
115 . Não há necessidade de contar a nova linha à direita.
nyuszika7h
@ nyuszika7h Não, é 116. Você esqueceu de contar a “UTF-8 BOM” (EF BB BF) no início, o que é necessário para permitir que o Python 2 aceite fontes não ASCII. (Isto não é Python 3, que não tem .decode('zip').)
Anders Kaseorg
1

Python, 217

Você não pode realmente jogar tanto. Acabei de tirar a repetição flagrante do front-end e ...

m,f="Old MacDonald had a farm, E-I-E-I-O",lambda x,y:m+",\nAnd on that farm he had a %s, E-I-E-I-O,\nWith a %shere and a %sthere,\nHere a %s, there a %s, everywhere a %s %s,\n%s!"%((x,)+((y+' ')*2,)*2+(y,)*4+(m,))

Javascript, 241 - fraude JSCrush

Feito isso com JSCrush ... não é realmente uma resposta real, seria interessante ver se alguém consegue superar isso em uma linguagem convencional. ( EDIT : uh)

_='var f=function(c,a){var b=a "+a;return"Anon that he hadcWith  and tHere  t   everyw!"};OlMacDonalhaa a "+, O,\\nhere+"b farm a, d E-I-';for(Y in $=' ')with(_.split($[Y]))_=join(pop());eval(_)
cjfaure
fonte
1

Java, 246

void f(String[] a){String o="Old MacDonald had a farm",e=", E-I-E-I-O",x=" a "+a[1],s=x+" "+a[1];System.out.print(o+e+",\nAnd on that farm he had a "+a[0]+e+",\nWith"+s+" here and"+s+" there,\nHere"+x+", there"+x+", everywhere"+s+",\n"+o+e+"!");}

Uso: f(new String[]{"cow","moo"});

Gayuha
fonte
1

Java - 262 258

void m(String...s){String b=s[1],c=b+" "+b,d="E-I-E-I-O",e="Old MacDonald had a farm, "+d;System.out.print(e+",\n"+"And on that farm he had a "+s[0]+", "+d+",\nWith a "+c+" here and a "+c+" there,\nHere a "+b+", there a "+b+", everywhere a "+c+",\n"+e+"!");}

Otimização adicional é definitivamente possível.

Ypnypn
fonte
Você pode usar o printf
aditsu
Trevin Avery sugeriu esta edição: Java - 243 - void String ... a) {String c = "a" + a [1], d = c + "" + a [1], e = ", EIEIO", f = "Old MacDonald tinha um farm" + e; System.out.print (f + ", \ nEle possuía um" + a [0] + e + ", \ nCom" + d + "aqui e" + d + "ali , \ nAqui "+ c +", existe "+ c +" ', em todos os lugares "+ d +", \ n "+ f +"! ");} Otimização adicional é definitivamente possível
Justin
1

Perl 5 (UTF-8) - 131 caracteres, 313 bytes

O script abaixo precisa ser salvo como UTF-8 sem BOM.

use utf8;use Encode;eval encode ucs2,'獵戠晻③㴤∮灯瀻⑥㴢Ⱐ䔭䤭䔭䤭伢㬤漽≏汤⁍慣䑯湡汤⁨慤⁡⁦慲洤攢㬤ⰽ≥牥⁡∻獡礢⑯Ⰺ䅮搠潮⁴桡琠晡牭⁨攠桡搠愠䁟⑥Ⰺ坩瑨⁡③③⁨␬湤⁡③③⁴桥牥Ⰺ䠤Ⱔ戬⁴栤Ⱔ戬⁥癥特睨␬③③Ⰺ⑯™紱';

Uso: f("cow", "moo");.

O Perl precisa ter sido executado com o -M5.010sinalizador para ativar os recursos do Perl 5.10. ( Isso é permitido .)

Eu gosto bastante da simetria da contagem de caracteres (131) e da contagem de bytes (313). É muito yin e yang.

Perl 5 (ASCII) - 181 caracteres, 181 bytes

sub f{$b=$".pop;$e=", E-I-E-I-O";$o="Old MacDonald had a farm$e";$,="ere a";say"$o,
And on that farm he had a @_$e,
With a$b$b h$,nd a$b$b there,
H$,$b, th$,$b, everywh$,$b$b,
$o!"}

Uso: f("cow", "moo");.

Novamente, o perl precisa ter sido executado com o -M5.010sinalizador para ativar os recursos do Perl 5.10.

tobyink
fonte
Hmm, parece familiar codegolf.stackexchange.com/a/26633/11259 ;-)
Digital Trauma
Na verdade, codegolf.stackexchange.com/a/26628/12469 foi o meu ponto de partida. Testei algumas variáveis ​​extras que diminuíram ainda mais o comprimento e, em seguida, apliquei o truque UTF16 usado por várias das outras implementações.
7278 tobyink
1

CJam (não ASCII) - 77 caracteres

"啝裢樃濿䶹讄團챤鋚䖧雿ꆪꆵ䷶텸紎腕Խꍰ搓᩟童䚯⤭刧损⬛豳Ẍ퍾퓱郦퉰怈䡞௳閶蚇⡾쇛蕟猲禼࿆艹蹚㞿䛴麅鞑椢⧨餎쏡첦휽嬴힡ݷ녣㯂鐸㭕"56e3b127b:c~

Uso: "cow""moo"F

A string é minha outra solução CJam convertida da base 127 para a base 56000.
Um de idioma UTF-8 pode ser necessário.

A propósito, agora você pode tentar isso on-line em http://cjam.aditsu.net/

aditsu
fonte
1

JavaScript: 152 caracteres / ES6: 149 caracteres

Aqui está uma função JS chamada "z" que faz o trabalho em 214 caracteres. (não execute!)

function z(a,b){c=' a '+b;d=c+' '+b;e=', E-I-E-I-O';f='Old MacDonald had a farm'+e;return(f+',\nAnd on that farm he had a '+a+e+',\nWith'+d+' here and'+d+' there,\nHere'+c+', there'+c+', everywhere'+d+',\n'+f+'!')}

Eu o "empacotei" em caracteres unicode usando uma técnica criada por @subzey e eu para 140byt.es).

eval(unescape(escape('𩡵𫡣𭁩𫱮𘁺𚁡𛁢𚑻𨰽𙰠𨐠𙰫𨠻𩀽𨰫𙰠𙰫𨠻𩐽𙰬𘁅𛑉𛑅𛑉𛑏𙰻𩠽𙱏𫁤𘁍𨑣𡁯𫡡𫁤𘁨𨑤𘁡𘁦𨑲𫐧𚱥𞱲𩑴𭑲𫠨𩠫𙰬𧁮𠑮𩀠𫱮𘁴𪁡𭀠𩡡𬡭𘁨𩐠𪁡𩀠𨐠𙰫𨐫𩐫𙰬𧁮𥱩𭁨𙰫𩀫𙰠𪁥𬡥𘁡𫡤𙰫𩀫𙰠𭁨𩑲𩐬𧁮𢁥𬡥𙰫𨰫𙰬𘁴𪁥𬡥𙰫𨰫𙰬𘁥𭡥𬡹𭱨𩑲𩐧𚱤𚰧𛁜𫠧𚱦𚰧𘐧𚑽').replace(/uD./g,'')))

execute o último trecho, chame z("cow","moo")e você obterá esta sequência:

Old MacDonald had a farm, E-I-E-I-O,
And on that farm he had a cow, E-I-E-I-O
With a moo moo here and a moo moo there,
Here a moo, there a moo, everywhere a moo moo,
Old MacDonald had a farm, E-I-E-I-O!"

Mais informações aqui: http://xem.github.io/golfing/en.html#compress

Versão ES6:

eval(unescape(escape('𮠽𚁡𛁢𚐽🡻𨰽𙰠𨐠𙰫𨠻𩀽𨰫𙰠𙰫𨠻𩐽𙰬𘁅𛑉𛑅𛑉𛑏𙰻𩠽𙱏𫁤𘁍𨑣𡁯𫡡𫁤𘁨𨑤𘁡𘁦𨑲𫐧𚱥𞱲𩑴𭑲𫠨𩠫𙰬𧁮𠑮𩀠𫱮𘁴𪁡𭀠𩡡𬡭𘁨𩐠𪁡𩀠𨐠𙰫𨐫𩐫𙰬𧁮𥱩𭁨𙰫𩀫𙰠𪁥𬡥𘁡𫡤𙰫𩀫𙰠𭁨𩑲𩐬𧁮𢁥𬡥𙰫𨰫𙰬𘁴𪁥𬡥𙰫𨰫𙰬𘁥𭡥𬡹𭱨𩑲𩐧𚱤𚰧𛁜𫠧𚱦𚰧𘐧𚑽').replace(/uD./g,'')))
xem
fonte
Eu acho que você não copiou e colou as coisas corretamente, seu código parece ter mais de 250 caracteres - oops, talvez não, mas meu editor de texto está se comportando de maneira estranha, investigarei.
Aditsu
Ah, a maioria dos seus personagens é de alguns planos astrais (é provavelmente por isso que eles são contados como 2 caracteres aqui) ... e não alocados também. Esta é esticar um pouco as regras :)
aditsu
Bem, eu não acho que isso seja trapaça: esses símbolos são caracteres unicode e não devem contar como 2 caracteres. Além disso, o Twitter conta cada um deles como 1 caractere. Se você copiar a versão ES6 em um tweet, ele diz que é muito longo em 9 caracteres. Então, 149 é :)
xem
1

C # - 339 bytes

void x(string c, string d){var a="Old MacDonald had a farm";var b=", E-I-E-I-O";var f=" a ";var g=" there";Debug.WriteLine(a+b+",");Debug.WriteLine("And on that farm he had"+f+c+b+",");Debug.WriteLine("With"+f+d+" "+d+" here and"+f+d+" "+d+g+",");Debug.WriteLine("Here"+f+d+","+g+f+d+", everywhere"+f+d+" "+d+",");Debug.WriteLine(a+b+"!");

Uso: x("cow","moo");

tsavinho
fonte
1

Rebol, 206 202

f: func[a b][print reword{$o$e,
And on that farm he had a $a$e,
With a $b $b here and a $b $b there,
Here a $b, there a $b, everywhere a $b $b,
$o$e!}[e", E-I-E-I-O"o"Old MacDonald had a farm"a a b b]]

Uso: f "cow" "moo"

draegtun
fonte
0

Delphi XE3 ( 272 252)

procedure k(a,s:string);const o='Old MacDonald had a farm';e=', E-I-E-I-O';n=','#13#10;begin s:=' '+s;write(o+e+n+'And on that farm he had a '+a+e+n+'With a'+s+s+' here and a'+s+s+' there'+n+'Here a'+s+', there a'+s+' every where a'+s+s+n+o+e+'!');end;

Ungolfed

procedure k(a,s:string);
const
  o='Old MacDonald had a farm';
  e=', E-I-E-I-O';
  n=','#13#10;
begin
  s:=' '+s;
  write(o+e+n+'And on that farm he had a '+a+e+n+'With a'+s+s+' here and a'+s+s+' there'+n+'Here a'+s+', there a'+s+' every where a'+s+s+n+o+e+'!');
end;
Teun Pronk
fonte
0

Lua 237

function f(a,b)c=b.." "..b;d="Old MacDonald had a farm, E-I-E-I-O"print(d..",\nAnd on that farm he had a "..a..", E-I-E-I-O,\nWith a "..c.." here and a "..c.." there,\nHere a "..b..", there a "..b..", everywhere a "..c..",\n"..d.."!")end

Ao definir c=b.." "..b, posso salvar uma dúzia de caracteres. Ao definir dcomo eu faço, salvo 23 caracteres. Não vejo mais como diminuir isso. Isso é chamado via f("<animal>","<sound>").

Kyle Kanos
fonte
0

Java 8 (411)

String m(String...m){LinkedHashMap<String,String>n=new LinkedHashMap<>();n.put("/","( * #, -");n.put("#","farm");n.put("-","E-I-E-I-O");n.put("+","here");n.put("*","had a");n.put("(","Old MacDonald");n.put("|"," a )");n.put(")","moo");n.put("moo",m[1]);n.put("cow",m[0]);m[0]="/,\nAnd on that # he * cow, -,\nWith|) + and|) t+,\nHere|, t+|, everyw+|),\n/!";n.forEach((k,v)->m[0]=m[0].replace(k,v));return m[0];}

Abusando do lambda, colocou as substituições em um LinkedhashMap para mantê-las em uma ordem definida e, em seguida, usou um lambda foreach para substituir a chave pelo valor na String principal. Os parâmetros são adicionados como 2 últimas substituições no mapa. esse argumento varargs é cortar alguns bytes no cabeçalho do método

Versão não destruída:

String m(String... m)
{
    LinkedHashMap<String, String> n = new LinkedHashMap<>();
    n.put("/", "( * #, -");
    n.put("#", "farm");
    n.put("-", "E-I-E-I-O");
    n.put("+", "here");
    n.put("*", "had a");
    n.put("(", "Old MacDonald");
    n.put("|", " a )");
    n.put(")", "moo");
    n.put("moo", m[1]);
    n.put("cow", m[0]);
    m[0] = "/,\nAnd on that # he * cow, -,\nWith|) + and|) t+,\nHere|, t+|, everyw+|),\n/!";
    n.forEach((k, v) -> m[0] = m[0].replace(k, v));
    return m[0];
}
masterX244
fonte
0

JavaScript 220

function f(a,b){c=' a '+b;d=c+' '+b;e=', E-I-E-I-O';f='Old MacDonald had a farm'+e;console.log(f+',\nAnd on that farm he had a '+a+e+',\nWith'+d+' here and'+d+' there,\nHere'+c+', there'+c+', everywhere'+d+',\n'+f+'!');}

Chamado por

f('cow', 'moo');
Trevin Avery
fonte
0

C puro, 298 bytes, sem unicode

Na minha função, adotei um único argumento, que na verdade é um monte de char*pacotes. Cada sequência é terminada em nulo e há um terminador nulo extra no final. Isso me permite verificarstrlen(a) no final de cada loop, em vez de manter uma variável de contador.

mcdonald.c:

m(char*a){while(strlen(a)){printf("Old MacDonald had a farm, E-I-E-I-O\nAnd on that farm he had a %s, E-I-E-I-O,\nWith a ",a);a+=strlen(a)+1;printf("%s %s here and a %s %s there,\nHere a %s, there a %s, everywhere a %s %s,\nOld MacDonald had a farm, E-I-E-I-O!\n",a,a,a,a,a,a,a,a);a+=strlen(a)+1;}}

main.c:

int m(char *v);
int main(int argc, char **argv) {
    m("cow\0moo\0programmer\0meh\0\0");
    return 0;
}

Resultado:

clang main.c mcdonald.c && ./a.out
Old MacDonald had a farm, E-I-E-I-O
And on that farm he had a cow, E-I-E-I-O,
With a moo moo here and a moo moo there,
Here a moo, there a moo, everywhere a moo moo,
Old MacDonald had a farm, E-I-E-I-O!
Old MacDonald had a farm, E-I-E-I-O
And on that farm he had a programmer, E-I-E-I-O,
With a meh meh here and a meh meh there,
Here a meh, there a meh, everywhere a meh meh,
Old MacDonald had a farm, E-I-E-I-O!
wjl
fonte
0

Cobra - 203

def f(a,b)
    d=" a [b] "+b
    e=", E-I-E-I-O"
    m="Old MacDonald had a farm[e]"
    print "[m],\nAnd on that farm he had a [a][e],\nWith[d] here and[d] there,\nHere a [b], there a [b], everywhere[d],\n[m]!"

Mesmo para um idioma com regras de recuo múltiplo e estrito, o Cobra ainda se sai muito bem.

Furioso
fonte
0

C: 224 bytes

Usando o especificador de precisão printf , podemos usar a mesma string que a string de formato printf e dois dos parâmetros.

o(char*x,char*y){char*f="Old MacDonald had a farm, E-I-E-I-O,\nAnd on that farm he had a %s%.13sWith a %s %s here and a %s %s there,\nHere a %s, there a %s, everywhere a %s %s,\n%.35s!\n";printf(f,x,f+24,y,y,y,y,y,y,y,y,f);}

Com espaço em branco e a sequência dividida em linhas:

o(char* x, char* y)
{
    char* f=
        "Old MacDonald had a farm, E-I-E-I-O,\n"
        "And on that farm he had a %s%.13s"
        "With a %s %s here and a %s %s there,\n"
        "Here a %s, there a %s, everywhere a %s %s,\n"
        "%.35s!\n";

    printf(f,x,f+24,y,y,y,y,y,y,y,y,f);
}
David Yaw
fonte
0

PHP - 272 caracteres, 272 bytes

function m($q,$w){for($e="@&And on that farm he had^<%&With *h# and*th#&H(th(everywh#^> >&@!",$r=1;;$e=$r){$r=str_replace(["@","#","^","%","<",">","&","*","("],["Old MacDonald had^farm%","ere"," a ",", E-I-E-I-O",$q,$w,",\n","^> > ","#^>, "],$e);if($e==$r)break;}echo $e;}

Uso: m("cow", "moo");,m("fox", "Hatee-hatee-hatee-ho");

Parâmetros com @#%^<>&*(falha na saída.

Lanche
fonte
0

Haskell (282 e ainda um pouco legível :))

wc -c oldmacdonald.hs
     282 oldmacdonald.hs

O arquivo:

main=mapM putStrLn[s"cow""moo",s"pig""oink",s"sheep""baa"]
s c m=o#",\nAnd on that farm he had"#b c#e#let n=m#" "#m in",\nWith"#b n#" here and"#b n#" there,\nHere"#b m#", there"#b m#", everywhere"#b n#",\n"#o#"!\n"
o="Old MacDonald had a farm"#e
e=", E-I-E-I-O"
b=(" a "#)
(#)=(++)
linhaça
fonte
É 281, você normalmente não conta a nova linha à direita, a menos que seja uma macro do pré-processador C ou outra coisa que exija o término da nova linha. Na maioria dos casos, você pode subtrair 1 da contagem de bytes retornada por wc -c, mas eu prefiro usar mothereff.in/byte-counter e garantir que não haja uma linha vazia no final, a menos que seja necessário para o programa funcionar.
nyuszika7h
0

ES6, 2 soluções de 179 186 caracteres sem nenhum unicode

f=(a,b)=>alert("325And on that farm he had a025With a11 h4nd a11 th45H41, th41, everywh411532!".replace(/\d/g,x=>[" "+a," "+b,", E-I-E-I-O","Old MacDonald had a farm","ere a",",\n"][x]))

E o segundo:

f=(a,b)=>alert("3625And on7at6 he ha8025With a11 h4n811745H41,741, everywh4115362!".replace(/\d/g,x=>(` ${a}0 ${b}0, E-I-E-I-O0Old MacDonald had a0ere a0,\n0 farm0 th0d a`).split(0)[x]))

Adicionei chamada de alerta (+7 caracteres).

Qwertiy
fonte
Eu acho que é a solução mais curta dos não-unicodificados por enquanto.
Qwertiy
0

Caracteres JavaScript (E6) 140

Contador de caracteres: https://mothereff.in/byte-counter , 140 caracteres, 425 bytes em UTF-8

eval(unescape(escape('𩠽𚁡𛁢𚐽🡡𫁥𬡴𚀧𜀱𜠵𠑮𩀠𫱮𘀶𨑴𜐳𩐳𨑤𝰠𞐲𝑗𪐶𘁡𞀸𜰴𝱮𩀠𨐸𞀠𝠴𝑈𝀷𞀬𘀶𝀷𞀬𘁥𭡥𬡹𭱨𝀷𞀸𝐰𜐲𘐧𛡲𩑰𫁡𨱥𚀯𧁤𛱧𛁣🐾𚀧𣱬𩀠𣑡𨱄𫱮𨑬𩀠𪁡𩀠𨐰𘁦𨑲𫐰𛀠𡐭𢐭𡐭𢐭𣰰𘁨𜁥𬡥𜀬𧁮𜁴𪀰𘁡𜀠𙰫𨠫𜀫𨐩𛡳𬁬𪑴𚀰𚑛𨱝𚐩𒠠').replace(/uD./g,'')))

Código ASCII original 188 bytes

f=(a,b)=>alert('0125And on 6at13e3ad7 925Wi6 a88347nd a88 645H478, 6478, everywh47885012!'.replace(/\d/g,c=>('Old MacDonald had a0 farm0, E-I-E-I-O0 h0ere0,\n0th0 a0 '+b+0+a).split(0)[c]))

Compactado com http://xem.github.io/obfuscatweet/

Teste no console do FireFox / FireBug

f('mosquito','zzz')

Resultado

Old MacDonald had a farm, E-I-E-I-O,
And on that farm he had a mosquito, E-I-E-I-O,
With a zzz zzz here and a zzz zzz there,
Here a zzz, there a zzz, everywhere a zzz zzz,
Old MacDonald had a farm, E-I-E-I-O!
edc65
fonte