Fungsi MacDonald lama


16

Buat fungsi dalam bahasa yang Anda pilih yang mencetak yang berikut:

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!

Di mana cowdan di mana moostring dalam parameter fungsi, dan karenanya, dapat diubah ke pigdan oinkatau sheepdan baa, misalnya.

Ini harus memperhitungkan huruf kapital, tanda hubung, tanda baca, spasi, dan jeda baris.

Bertujuan untuk mengetik jumlah karakter Unicode paling sedikit dalam kode Anda.


1
Bukankah seharusnya ini kompleksitas-kolmogorov ?
mniip

6
Anda mengatakan echoes the following. Apakah maksud Anda fungsi harus mencetaknya atau mengembalikannya?
cjfaure

2
Untuk membuat ini adil, saya pikir ini harus memiliki tanda baca, spasi, dan carriage return yang tepat dalam pertanyaan. Tapi bagaimana menurut Anda tentang huruf besar / kecil? Saya pikir satu case mungkin lebih mudah dan menghindari beban aplikasi standar base64 atau sejenisnya. Secara seimbang, satu-satunya huruf kapital ada di awal baris, kata MacDonald dan dalam EIEIO, jadi mungkin lebih menarik untuk membuatnya tepat sesuai pertanyaan juga.
Level River St

4
Apakah bisa diterima a oinkatau harus dibuat an oink?
ClickRick

4
@ rybo111: Apakah Anda sadar bahwa Donald Knuth yang hebat menulis makalah akademis tentang hal semacam ini? Itu sebenarnya diterbitkan dalam jurnal nyata (diakui dalam edisi April). Lebih lanjut di sini termasuk tautan ke PDF makalah: en.wikipedia.org/wiki/The_Complexity_of_Songs
Tom Chantler

Jawaban:


15

Javascript ES6 - 204

Bertujuan untuk mengetik jumlah karakter Unicode paling sedikit dalam kode Anda.

Bukan yang lebih pendek tapi mungkin yang paling membingungkan.

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

Jika browser Anda tidak mendukung 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)}

Copy / Paste kode tersebut ke konsol browser Anda dan coba f('cow','moo'), f('pig','oink'),f('sheep','baa')

Bagaimana itu bekerja ?

cadalah deretan 29 huruf plus hewan dan suaranya (sebut saja ini alfabet kami ).
Jadi, semua 31 karakter cocok dalam 5 bit (2 ^ 5 = 32).
Karakter Unicode panjangnya 16 bit, sehingga dapat mengkodekan 3 karakter alfabet kami dengan padding bit.
Teks lengkap dengan baris baru adalah 186 karakter alfabet kami , dapat dikodekan dengan 62 karakter Unicode.

Misalnya, Olddikodekan seperti ini:

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

Jika Anda memiliki masalah untuk membaca beberapa karakter Unicode, instal font Code2000


2
"cow"dan "moo"seharusnya menjadi parameter fungsi. Dengan membuat penelepon melewati array, Anda menyimpan karakter dalam definisi fungsi dengan mengorbankan penambahan ke jumlah karakter kode panggilan. Baunya seperti curang bagi saya. Mengambil bahwa pendekatan yang ekstrim Anda bisa menentukan function f(a){alert(a)}(23 karakter) dan mengatakan bahwa itu harus disebut seperti f("Old MacDonald had a ...").
tobyink

1
Saya telah melewati string dalam dua parameter yang terpisah tetapi setelah membaca tantangan, saya tidak melihat alasan untuk tidak meneruskan string dalam format array, jadi saya mengedit jawaban saya. Ini tidak curang, hanya menyimpan beberapa karakter jika memungkinkan. Biarkan @ rybo111 memutuskan apakah ini cocok dengan aturan atau tidak.
Michael M.

1
@tobyink Saya memang menggunakan istilah 'string' (bukan array) dalam aturan, jadi saya kira Anda benar. Saya pikir 'curang' agak keras, meskipun!
rybo111

2
Mengapa ini memiliki begitu banyak suara? Ini lebih dari 200 dan bahkan bukan solusi javascript terpendek.
aditsu

Whall thththth dan well menjelaskan juga
pilihanku

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;

Penggunaan: "cow""moo"F
Untuk GolfScript ganti '|dengan "|"dan Adengan10

Penjelasan:

Bagian kuncinya adalah A,{`/\*}/:
A,{...}/mengeksekusi blok untuk setiap angka dari 0 hingga 9 (A = 10)
`mengubah angka
/\*menjadi string yang diganti string: jika kita memiliki di stack "bar" "foo 1 baz" "1"kemudian /membagi string yang dihasilkan ["foo " " baz"], \menukar array ini dengan item sebelumnya ("bar") dan *bergabung dengan array yang menghasilkan"foo bar baz"

Jadi kode tersebut menggantikan setiap angka dalam string utama dengan string yang sebelumnya ada di stack. Kami memiliki hewan dan suaranya, lalu "memiliki", "a", dll dan akhirnya ", EIEIO" dan string utama, "10, ...!". Untuk menghindari menggunakan terlalu banyak tanda kutip, saya meletakkan semua string (kecuali parameter) dalam satu string, kemudian membaginya dan membuang array yang dihasilkan ( '|/~)

String utama melewati transformasi berikut:

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

ganti "0"dengan ", 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!

ganti "1"dengan "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!

ganti "2"dengan "here", lalu "3"dengan "68 8"dll.

8 sesuai dengan suara, dan 9 untuk binatang.


Bisakah Anda jelaskan ini? Aku bahkan tidak tahu apa itu CJam
Cruncher

@Cruncher CJam adalah bahasa yang saya buat, sf.net/p/cjam ; Saya bisa menjelaskannya setelah saya selesai bermain golf :)
aditsu

1
@Cruncher menambahkan penjelasan sekarang
aditsu

9
♬ dan pada tanggal lima ia menemukan enam sembilan, ia ee ro ♬
aditsu

Bisa E-I-berupa string yang kemudian diulang? :)
rybo111

5

Bash + iconv, 128 karakter Unicode

Membawa tubuh fungsi pure-bash / ascii di bawah ini dan melakukan reverse-encode ke karakter unicode:

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

Menentukan fungsi shell m. Panggil sebagai:

$ m pony neigh
Old MacDonald memiliki sebuah peternakan, EIEIO,
Dan di peternakan itu dia punya kuda poni, EIEIO,
Dengan tetangga di sini dan tetangga di sana,
Di sini tetangga, di sana tetangga, di mana saja tetangga,
Old MacDonald punya pertanian, EIEIO!
$ 

Bash murni, 171 byte (hanya ascii)

Saya pikir perlu dicatat bahwa ayat aslinya (dengan "sapi" dan "moo") hanya 203 karakter.

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

Menentukan fungsi shell m. Panggil sebagai:

$ m domba baa
Old MacDonald memiliki sebuah peternakan, EIEIO,
Dan di peternakan itu dia punya domba, EIEIO,
Dengan baa baa di sini dan baa baa di sana,
Di sini baa, ada baa, di mana-mana baa baa,
Old MacDonald punya pertanian, EIEIO!
$

4

C ++ (403)

Baiklah, ini agak sulit, tetapi siapa yang tidak suka mendefinisikan-terlalu?

#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

Adakah definisi yang lebih lanjut bisa mengemas ini lebih ketat?
einsteinsci

1
Dulu mungkin untuk #define X definedan kemudian digunakan #X Y Z. Sedihnya, hari-hari IOCCC yang memabukkan itu sudah lama berlalu ...
nneonneo

Bagaimana kalau menggunakan +bukan <<? Atau menggunakan char*bukan string? // Hanya satu yang bisa digunakan secara bersamaan.
Qwertiy

2

Python, 116 karakter Unicode

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

StackOverflow memakan karakter khusus saya, jadi inilah file di base64:

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

Data dikemas menggunakan zlib, yang secara efisien mengkodekan string yang diulang (zlib bagus dalam mengompresi teks pada umumnya). Untuk mengambil keuntungan dari aturan "karakter Unicode", potongan zlib 121-byte diisi dan dibelah dua menjadi string Unicode 61-karakter dengan menginterpretasikan bytestring sebagai UTF-16.

Panggil fungsi sebagai

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

Bagus, tetapi di mana sapi dan moo adalah string dalam parameter fungsi, dan dengan demikian, dapat diubah menjadi babi dan oink atau domba dan baa, misalnya . Sepertinya output Anda hardcoded ke cow / moo.
Digital Trauma

@DigitalTrauma: Pemahaman bacaan saya gagal! Tetap.
nneonneo

itu lebih baik :) +1
Trauma Digital

115 . Tidak perlu menghitung baris tambahan.
nyuszika7h

@ nyuszika7h Tidak, ini 116. Anda lupa menghitung "UTF-8 BOM" (EF BB BF) di awal, yang diperlukan untuk membiarkan Python 2 menerima sumber non-ASCII. (Ini bukan Python 3, yang tidak punya .decode('zip').)
Anders Kaseorg

1

Python, 217

Anda tidak bisa bermain golf sebanyak ini. Saya hanya mengambil pengulangan front-end terang-terangan dan ...

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

Membuat ini dengan JSCrush ... bukan jawaban yang benar-benar nyata, itu hanya akan menarik untuk melihat apakah ada yang bisa mengalahkan ini dalam bahasa mainstream. ( 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(_)

1

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

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


1

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

Optimalisasi lebih lanjut sangat mungkin dilakukan.


Anda dapat menggunakan printf
aditsu

Trevin Avery menyarankan suntingan ini: Java - 243 - void String ... a) {String c = "a" + a [1], d = c + "" + a [1], e = ", EIEIO", f = "Old MacDonald memiliki sebuah peternakan" + e; System.out.print (f + ", \ nDan di farm itu ia memiliki" + a [0] + e + ", \ nDengan" + d + "di sini dan" + d + "di sana , \ nDi sini "+ c +", di sana "+ c +" ', di mana-mana "+ d +", \ n "+ f +"! ");} Optimalisasi lebih lanjut mungkin dilakukan
Justin

1

Perl 5 (UTF-8) - 131 karakter, 313 byte

Skrip di bawah ini perlu disimpan sebagai UTF-8 tanpa BOM.

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

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

Perl harus dijalankan dengan -M5.010bendera untuk mengaktifkan fitur Perl 5.10. ( Ini diizinkan .)

Saya sangat menyukai simetri jumlah karakter (131) dan byte byte (313). Ini sangat Yin dan Yang.

Perl 5 (ASCII) - 181 karakter, 181 byte

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

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

Sekali lagi, perl perlu dijalankan dengan -M5.010flag untuk mengaktifkan fitur Perl 5.10.



Sebenarnya codegolf.stackexchange.com/a/26628/12469 adalah titik awal saya. Saya menguji beberapa variabel tambahan yang mengurangi panjang lebih jauh, dan kemudian menerapkan trik UTF16 yang digunakan beberapa implementasi lainnya.
tobyink

1

CJam (non-ASCII) - 77 karakter

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

Pemakaian: "cow""moo"F

String tersebut adalah solusi CJam saya yang lain yang dikonversi dari base 127 ke base 56000. Lokal
UTF-8 mungkin diperlukan.

Omong-omong, sekarang Anda dapat mencoba ini secara online di http://cjam.aditsu.net/


1

JavaScript: 152 karakter / ES6: 149 karakter

Berikut adalah fungsi JS yang disebut "z" yang melakukan pekerjaan dalam 214 karakter. (jangan lakukan itu!)

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

Saya "mengemas" dalam karakter unicode menggunakan teknik yang dibuat oleh @subzey dan I untuk 140byt.es).

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

jalankan potongan terakhir itu, lalu panggil z("cow","moo"), dan Anda akan mendapatkan string ini:

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

Info lebih lanjut di sini: http://xem.github.io/golfing/en.html#compress

Versi ES6:

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

Saya pikir Anda tidak menyalin-menempelkan hal-hal dengan benar, kode Anda tampaknya memiliki lebih dari 250 karakter - ya, mungkin tidak, tetapi editor teks saya bertingkah aneh, saya akan menyelidiki.
aditsu

Oh, sebagian besar karakter Anda berasal dari beberapa bidang astral (mungkin itulah sebabnya mereka dihitung sebagai 2 karakter di sini) ... dan tidak teralokasi juga. Ini sedikit memperluas aturan :)
aditsu

Yah, saya tidak berpikir ini curang: simbol-simbol itu adalah kode unicode, dan tidak boleh dihitung sebagai 2 karakter. Juga, Twitter menghitung masing-masing sebagai 1 char. Jika Anda menyalin versi ES6 dalam tweet, dikatakan terlalu panjang 9 karakter. Jadi, 149 ya :)
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+"!");

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

Pemakaian: 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;

Tidak disatukan

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

Dengan mendefinisikan c=b.." "..b, saya dapat menyimpan selusin karakter. Dengan mendefinisikan dseperti yang saya lakukan, saya menyimpan 23 karakter. Saya tidak mengerti bagaimana saya bisa mempersingkat ini lagi. Ini disebut 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];}

Menyalahgunakan lambda, memasukkan penggantian dalam LinkedhashMap untuk menjaga mereka dalam urutan yang ditentukan kemudian menggunakan lambda foreach untuk mengganti kunci dengan nilai dalam String utama. parameter ditambahkan sebagai 2 penggantian terakhir di peta. argumen varargs adalah untuk memangkas beberapa byte di header metode

Versi tidak disatukan:

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

Dipanggil oleh

f('cow', 'moo');

0

Pure C, 298 bytes, tidak ada unicode

Dalam fungsi saya, saya mengambil satu argumen, yang sebenarnya adalah sekelompok yang char*dikemas bersama. Setiap string diakhiri nol, dan ada terminator null tambahan di akhir. Ini memungkinkan saya untuk memeriksastrlen(a) di akhir setiap loop, daripada menjaga variabel counter.

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

Keluaran:

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

Bahkan untuk bahasa dengan sedikit-ke-tidak multi-lapisan, dan aturan lekukan yang ketat, Cobra masih cukup baik.


0

C: 224 byte

Dengan menggunakan specifier presisi printf , kita dapat menggunakan string yang sama seperti string format printf dan sebagai dua parameter.

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

Dengan spasi putih dan tali terbagi menjadi beberapa baris:

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 karakter, 272 byte

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

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

Parameter dengan @#%^<>&*(crash output.


0

Haskell (282 dan masih bisa dibaca :))

wc -c oldmacdonald.hs
     282 oldmacdonald.hs

Berkas:

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

Ini 281, Anda biasanya tidak menghitung trailing newline, kecuali jika itu adalah makro preprocessor C atau sesuatu yang membutuhkan penghentian baris baru. Dalam kebanyakan kasus, Anda bisa mengurangi 1 dari jumlah byte yang dikembalikan oleh wc -c, tetapi saya lebih suka menggunakan mothereff.in/byte-counter dan memastikan tidak ada garis kosong di bagian akhir kecuali diperlukan program untuk bekerja.
nyuszika7h

0

ES6, 2 solusi dari 179 186 karakter tanpa 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]))

Dan yang kedua:

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

Saya telah menambahkan panggilan lansiran (+7 karakter).


Saya pikir, ini solusi terpendek dari yang non-unicoded untuk saat ini.
Qwertiy

0

JavaScript (E6) 140 karakter

Penghitung karakter: https://mothereff.in/byte-counter , 140 chars, 425 bytes di UTF-8

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

Kode ASCII asli 188 byte

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

Dikompresi dengan http://xem.github.io/obfuscatweet/

Tes di konsol FireFox / FireBug

f('mosquito','zzz')

Keluaran

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!
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.