Ancienne fonction MacDonald


16

Créez une fonction dans la langue de votre choix qui imprime ce qui suit:

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!

cowet où moosont les chaînes dans les paramètres de fonction, et en tant que telles, peuvent être changées en piget oinkou sheepet baaet par exemple.

Il doit prendre en compte les majuscules, les tirets, la ponctuation, les espaces et les sauts de ligne.

Essayez de taper le moins de caractères Unicode dans votre code.


1
Cela ne devrait-il pas être une complexité kolmogorov ?
mniip

6
Vous dites echoes the following. Voulez-vous dire que la fonction doit l'imprimer ou la renvoyer?
cjfaure

2
Pour rendre cela juste, je pense que cela devrait avoir la ponctuation exacte, les espaces et les retours chariot dans la question. Mais que pensez-vous des majuscules / minuscules? Je pensais qu'un seul cas pourrait être plus facile et éviter une charge d'applications standard de base64 ou similaire. Dans l'ensemble, les seules capitales se trouvent au début de la ligne, le mot MacDonald et dans l'EIEIO, il peut donc être plus intéressant de le faire exactement selon la question aussi.
Level River St

4
Est-il acceptable de produire a oinkou devrait-on le faire an oink?
ClickRick

4
@ rybo111: Saviez-vous que le grand Donald Knuth a écrit un article académique sur ce genre de chose? Il a en fait été publié dans un vrai journal (certes dans l'édition d'avril). Plus ici, y compris un lien vers le PDF du document: en.wikipedia.org/wiki/The_Complexity_of_Songs
Tom Chantler

Réponses:


15

Javascript ES6 - 204

Essayez de taper le moins de caractères Unicode dans votre code.

Pas le plus court mais probablement le plus obscur.

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

Si votre navigateur ne prend pas en charge 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)}

Copier / Coller ce code dans votre console de navigateur et essayez f('cow','moo'), f('pig','oink'),f('sheep','baa')

Comment ça fonctionne ?

cest un tableau de 29 lettres plus l'animal et son son (appelons cela notre alphabet ).
Ainsi, tous les 31 caractères tiennent sur 5 bits (2 ^ 5 = 32).
Un caractère Unicode mesure 16 bits, il peut donc coder 3 caractères de notre alphabet avec un bit de remplissage.
Le texte complet avec les nouvelles lignes est de 186 caractères de notre alphabet , il peut être encodé avec 62 caractères Unicode.

Par exemple, Oldest codé comme ceci:

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

Si vous rencontrez des problèmes pour lire certains caractères Unicode, installez la police Code2000


2
"cow"et "moo"sont censés être les paramètres de la fonction. En demandant à l'appelant de passer un tableau, vous enregistrez des caractères dans la définition de fonction au détriment de l'ajout au nombre de caractères du code appelant. Cela me sent comme une triche. En prenant cette approche à l'extrême, vous pouvez définir function f(a){alert(a)}(23 caractères) et dire qu'elle doit être appelée comme f("Old MacDonald had a ...").
tobyink

1
J'avais passé les chaînes en deux paramètres séparés mais après avoir lu le défi, je ne voyais aucune raison de ne pas passer les chaînes au format tableau, j'ai donc édité ma réponse. Ce n'est pas de la triche, il suffit de sauvegarder quelques caractères quand c'est possible. Laissez @ rybo111 décider si cela correspond ou non à la règle.
Michael M.

1
@tobyink J'ai utilisé le terme "chaîne" (pas un tableau) dans les règles, donc je suppose que vous avez raison. Je pense que «tricher» est un peu dur, cependant!
rybo111

2
Pourquoi cela a-t-il autant de votes? C'est plus de 200 et ce n'est même pas la solution javascript la plus courte.
aditsu

Bien entendu et bien expliqué, mon vote aussi
edc65

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;

Utilisation: "cow""moo"F
Pour GolfScript, remplacez '|par "|"et Apar10

Explication:

La partie clé est A,{`/\*}/:
A,{...}/exécute le bloc pour chaque nombre de 0 à 9 (A = 10)
`convertit le nombre en
/\*chaîne remplace une chaîne: si nous avons sur la pile "bar" "foo 1 baz" "1"puis /divise la chaîne résultant en ["foo " " baz"], \échange ce tableau avec l'élément précédent ("bar") et *rejoint le tableau résultant en"foo bar baz"

Ainsi, le code remplace chaque numéro de la chaîne principale par une chaîne qui se trouvait précédemment sur la pile. Nous avons l'animal et le son, puis "had", "a", etc et enfin ", EIEIO" et la corde principale, "10, ...!". Pour éviter d'utiliser trop de guillemets, j'ai mis toutes les chaînes (sauf les paramètres) dans une seule chaîne, puis je l'ai séparée et j'ai vidé le tableau résultant ( '|/~)

La chaîne principale passe par les transformations suivantes:

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

remplacer "0"par ", 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!

remplacer "1"par "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!

remplacer "2"par "here", puis "3"par "68 8"etc.

8 correspond au son et 9 à l'animal.


Pouvez-vous expliquer cela? Je ne sais même pas ce que CJAM est
Cruncher

@Cruncher CJam est une langue que j'ai créée , sf.net/p/cjam ; Je peux l'expliquer une fois que j'ai fini de jouer au golf :)
aditsu

1
@Cruncher a ajouté une explication maintenant
aditsu

9
♬ et sur ce cinq il sev'n six neuf, ze eee ro ♬
aditsu

Peut E-I-être une chaîne qui est ensuite répétée? :)
rybo111

5

Bash + iconv, 128 caractères Unicode

Prend le corps de la fonction pure-bash / ascii ci-dessous et encode à l'envers en caractères unicode:

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

Définit une fonction shell m. Appelez comme:

$ m poney hennit
Old MacDonald avait une ferme, EIEIO,
Et sur cette ferme, il avait un poney, EIEIO,
Avec un hennissement henni ici et un hennissement hennissement là-bas,
Ici un hennissement, là un hennissement, partout un hennissement hennissement,
Le vieux MacDonald avait une ferme, EIEIO!
$ 

Pure bash, 171 octets (ascii uniquement)

Je pense qu'il vaut la peine de noter que le couplet original (avec "vache" et "moo") n'est que de 203 caractères.

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"!)

Définit la fonction shell m. Appelez comme:

$ m mouton baa
Old MacDonald avait une ferme, EIEIO,
Et sur cette ferme, il avait un mouton, EIEIO,
Avec un baa baa ici et un baa baa là,
Ici un baa, là un baa, partout un baa baa,
Le vieux MacDonald avait une ferme, EIEIO!
$

4

C ++ (403)

D'accord, c'est un peu long, mais qui n'aime pas trop définir?

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

2
this.eyes.bleeding = true;
Proxy

Y a-t-il des définitions qui pourraient emballer encore plus serré?
einsteinsci

1
Auparavant, il était possible de l' #define X defineutiliser, puis de l'utiliser #X Y Z. Malheureusement, ces jours grisants de l'IOCCC sont désormais révolus ...
nneonneo

Que diriez-vous d'utiliser +au lieu de <<? Ou en utilisant char*au lieu de string? // Un seul d'entre eux peut être utilisé en même temps.
Qwertiy

2

Python, 116 caractères Unicode

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

StackOverflow mange mes caractères spéciaux, alors voici le fichier en base64:

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

Les données sont compressées à l'aide de zlib, qui code efficacement les chaînes répétées (zlib est bon pour compresser du texte en général). Pour tirer parti de la règle des "caractères Unicode", le bloc zlib de 121 octets est rembourré et réduit de moitié en une chaîne Unicode de 61 caractères en interprétant le bytestring comme UTF-16.

Appelez la fonction comme

f(cow='pig', moo='oink')

Bien, mais où vache et moo sont des chaînes dans les paramètres de fonction, et en tant que tels, peuvent être changés en porc et oink ou mouton et baa, par exemple . Il semble que votre sortie soit codée en dur pour cow / moo.
Digital Trauma

@DigitalTrauma: Ma compréhension de la lecture échoue! Fixé.
nneonneo

c'est mieux :) +1
Digital Trauma

115 . Pas besoin de compter la nouvelle ligne de fin.
nyuszika7h

@ nyuszika7h Non, c'est 116. Vous avez oublié de compter la "BOM UTF-8" (EF BB BF) au début, ce qui est nécessaire pour permettre à Python 2 d'accepter une source non ASCII. (Ce n'est pas Python 3, qui n'en a pas .decode('zip').)
Anders Kaseorg

1

Python, 217

Vous ne pouvez pas vraiment beaucoup jouer au golf. Je viens de supprimer la répétition frontale flagrante et ...

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 - Triche JSCrush

Fabriqué avec JSCrush ... pas vraiment une vraie réponse, il serait juste intéressant de voir si quelqu'un peut battre cela dans un langage courant. ( MODIFIER : euh)

_='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(_)

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+"!");}

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


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+"!");}

Une optimisation supplémentaire est certainement possible.


Vous pouvez utiliser printf
aditsu

Trevin Avery a suggéré cette modification: Java - 243 - void String ... a) {String c = "a" + a [1], d = c + "" + a [1], e = ", EIEIO", f = "Old MacDonald avait une ferme" + e; System.out.print (f + ", \ nEt sur cette ferme, il y avait" + a [0] + e + ", \ nAvec" + d + "ici et" + d + "là , \ nIci "+ c +", là "+ c +" ', partout "+ d +", \ n "+ f +"! ");} Une optimisation supplémentaire est définitivement possible
Justin

1

Perl 5 (UTF-8) - 131 caractères, 313 octets

Le script ci-dessous doit être enregistré au format UTF-8 sans nomenclature.

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

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

Perl doit avoir été exécuté avec l' -M5.010indicateur pour activer les fonctionnalités de Perl 5.10. ( C'est permis .)

J'aime bien la symétrie du nombre de caractères (131) et du nombre d'octets (313). C'est très yin et yang.

Perl 5 (ASCII) - 181 caractères, 181 octets

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

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

Encore une fois, perl doit avoir été exécuté avec l' -M5.010indicateur pour activer les fonctionnalités de Perl 5.10.



En fait, codegolf.stackexchange.com/a/26628/12469 était mon point de départ. J'ai testé quelques variables supplémentaires qui réduisent davantage la longueur, puis j'ai appliqué l'astuce UTF16 que plusieurs autres implémentations utilisent.
tobyink

1

CJam (non ASCII) - 77 caractères

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

Usage: "cow""moo"F

La chaîne est mon autre solution CJam convertie de la base 127 à la base 56000.
Une locale UTF-8 peut être requise.

Au fait, vous pouvez maintenant essayer ceci en ligne sur http://cjam.aditsu.net/


1

JavaScript: 152 caractères / ES6: 149 caractères

Voici une fonction JS appelée "z" qui fait le travail en 214 caractères. (ne l'exécutez pas!)

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

Je l'ai "emballé" en caractères unicode en utilisant une technique créée par @subzey et moi pour 140byt.es).

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

exécutez ce dernier extrait, puis appelez z("cow","moo"), et vous obtiendrez cette chaîne:

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

Plus d'informations ici: http://xem.github.io/golfing/en.html#compress

Version ES6:

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

Je pense que vous n'avez pas copié-collé correctement, votre code semble avoir plus de 250 caractères - oups, peut-être pas, mais mon éditeur de texte se comporte étrangement, je vais enquêter.
aditsu

Oh, la plupart de vos personnages viennent de certains plans astraux (c'est probablement pourquoi ils sont comptés comme 2 personnages ici) ... et non alloués aussi. Cela
étire

Eh bien, je ne pense pas que ce soit de la triche: ces symboles sont des caractères Unicode, et ne devraient pas compter comme 2 caractères. De plus, Twitter compte chacun d'eux comme 1 caractère. Si vous copiez la version ES6 dans un tweet, cela indique qu'elle est trop longue de 9 caractères. Alors, 149 c'est :)
xem

1

C # - 339 octets

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+"!");

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


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]]

Usage: f "cow" "moo"


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;

Non golfé

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;

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

En définissant c=b.." "..b , je peux enregistrer une douzaine de caractères. En définissant dcomme je le fais, j'enregistre 23 caractères. Je ne vois plus comment raccourcir cela. Cela s'appelle via f("<animal>","<sound>").


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

En abusant de lambda, mis les remplacements dans un LinkedhashMap pour les garder dans un ordre défini, puis utilisé un foreach lambda pour remplacer la clé par la valeur dans la chaîne principale. les paramètres sont ajoutés en tant que 2 derniers remplacements dans la carte. cet argument varargs est de raser certains octets dans l'en-tête de la méthode

Version non golfée:

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

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+'!');}

Appelé par

f('cow', 'moo');

0

C pur, 298 octets, pas d'unicode

Dans ma fonction, je prends un seul argument, qui est en fait un tas de char*emballés ensemble. Chaque chaîne est terminée par null et il y a un terminateur null supplémentaire à la fin. Cela me permet de vérifierstrlen(a) à la fin de chaque boucle, plutôt que de conserver une variable de compteur.

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

principal c:

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

Production:

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!

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]!"

Même pour une langue avec peu ou pas de lignes multiples et des règles strictes d'indentation, Cobra se débrouille toujours assez bien.


0

C: 224 octets

En utilisant le spécificateur de précision printf , nous pouvons utiliser la même chaîne que la chaîne de format printf et deux des paramètres.

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

Avec un espace blanc et la chaîne divisée en lignes:

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

0

PHP - 272 caractères, 272 octets

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

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

Les paramètres avec @#%^<>&*(plantent la sortie.


0

Haskell (282 et encore quelque peu lisible :))

wc -c oldmacdonald.hs
     282 oldmacdonald.hs

Le fichier:

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 "#)
(#)=(++)

C'est 281, vous ne comptez généralement pas la nouvelle ligne de fin, sauf s'il s'agit d'une macro de préprocesseur C ou de quelque chose d'autre qui nécessite une terminaison de nouvelle ligne. Dans la plupart des cas, vous pouvez simplement soustraire 1 du nombre d'octets renvoyé par wc -c, mais je préfère utiliser mothereff.in/byte-counter et m'assurer qu'il n'y a pas de ligne vide à la fin, sauf si le programme fonctionne.
nyuszika7h

0

ES6, 2 solutions de 179 186 caractères sans 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]))

Et le deuxième:

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]))

J'ai ajouté un appel d'alerte (+7 caractères).


Je pense que c'est la solution la plus courte des solutions non unicodées pour l'instant.
Qwertiy

0

JavaScript (E6) 140 caractères

Compteur de caractères: https://mothereff.in/byte-counter , 140 caractères, 425 octets en UTF-8

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

Code ASCII d'origine 188 octets

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]))

Compressé avec http://xem.github.io/obfuscatweet/

Test dans la console FireFox / FireBug

f('mosquito','zzz')

Production

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!
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.