Eski MacDonald işlevi


16

Seçtiğiniz dilde aşağıdakileri yazdıran bir işlev oluşturun:

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!

Nerede cowve moofonksiyon parametrelerinde dizeleri vardır ve örneğin, değiştirilebilir pigve oinkya sheepve baaörneğin.

Büyük harfleri, kısa çizgileri, noktalama işaretlerini, boşlukları ve satır sonlarını dikkate almalıdır.

Kodunuzda en az sayıda Unicode karakter yazmayı hedefleyin.


1
Bu kolmogorov karmaşıklığı olmamalı mı ?
9:28

6
Diyorsun echoes the following. Fonksiyonun çıktısını alması veya geri göndermesi mi demek istediniz?
cjfaure

2
Bunu adil yapmak için, bunun soruda kesin noktalama işaretleri, boşluklar ve taşıma dönüşleri olması gerektiğini düşünüyorum. Ama büyük / küçük harf hakkında ne düşünüyorsun? Tek bir vakanın daha kolay olabileceğini düşündüm ve base64 veya benzeri standart uygulamalardan kaçının. Dengede, sadece büyük harfler satırın başında, MacDonald kelimesinde ve EIEIO'dadır, bu yüzden bunu soru başına tam olarak yapmak daha ilginç olabilir.
Level River St

4
Çıktı kabul edilebilir mi a oinkyoksa yapılmalı an oinkmı?
ClickRick

4
@ rybo111: Büyük Donald Knuth'un bu tür şeyler hakkında akademik bir makale yazdığının farkında mıydınız? Aslında gerçek bir dergide yayınlandı (kuşkusuz Nisan baskısında). Makalenin PDF'sine
Tom Chantler

Yanıtlar:


15

Javascript ES6 - 204

Kodunuzda en az sayıda Unicode karakter yazmayı hedefleyin .

Daha kısa değil, muhtemelen en şaşkın.

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

Tarayıcınız ES6'yı desteklemiyorsa:

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

Kopya / tarayıcı konsoluna bu kodu yapıştırın ve deneyin f('cow','moo'), f('pig','oink'),f('sheep','baa')

Nasıl çalışır ?

c29 harfli bir dizi artı hayvan ve sesi (buna alfabe diyelim ).
Yani, 31 karakterin tümü 5 bite sığar (2 ^ 5 = 32).
Unicode karakter 16 bit uzunluğundadır, bu nedenle alfabemizin 3 karakterini dolgu biti ile kodlayabilir .
Yeni satırlı tam metin alfabemizin 186 karakteridir, 62 Unicode karakterle kodlanabilir.

Örneğin, Oldşu şekilde kodlanır:

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

Bazı Unicode karakterlerini okumakta zorlanıyorsanız , Code2000 fontunu yükleyin


2
"cow"ve "moo"fonksiyon parametreleri olması gerekiyordu. Arayanın bir diziyi geçmesini sağlayarak, arama kodunun karakter sayısına ekleme pahasına işlev tanımı içindeki karakterleri kaydedersiniz. Bu benim için bir hile gibi kokuyor. Bu yaklaşımı aşarak tanımlayabiliyorsunuz function f(a){alert(a)}(23 karakter) ve bunun böyle adlandırılması gerektiğini söyleyebilirsiniz f("Old MacDonald had a ...").
tobyink

1
Dizeleri iki ayrı parametrede geçirdim, ancak meydan okumayı okuduktan sonra dizeleri dizi biçiminde geçmemek için hiçbir neden görmedim, bu yüzden cevabımı düzenledim. Bu hile değil, mümkün olduğunda birkaç karakter tasarrufu sağlar. @ Rybo111'in kurala uyup uymadığına karar verelim.
Michael M.

1
@tobyink Kurallarda 'string' (dizi değil) terimini kullandım, bu yüzden haklısın. Bence 'hile' biraz sert!
rybo111

2
Bunun neden bu kadar çok oyu var? 200'ün üzerinde ve en kısa javascript çözümü bile değil.
aditsu, SE'nin


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;

Kullanımı: "cow""moo"F
For GolfScript yerini '|ile "|"ve Aile10

Açıklama:

Önemli bir parçasıdır A,{`/\*}/:
A,{...}/0 ila 9 (= 10 A) her numara için blok yürütür
`dizeye numara çevirir
/\*bir dize yerine kalır: yığında varsa "bar" "foo 1 baz" "1"o /sonuçlanan dize böler ["foo " " baz"], \swap önceki madde ile bu dizi ("bar") ile *sonuçlanan diziye katılır"foo bar baz"

Böylece kod, ana dizedeki her sayıyı daha önce yığında bulunan bir dize ile değiştirir. Biz hayvan ve ses var, sonra "vardı", "a", vb ve nihayet ", EIEIO" ve ana dizi, "10, ...!". Çok fazla tırnak kullanmaktan kaçınmak için, tüm dizeleri (parametreler hariç) bir dizeye koydum, sonra böldüm ve elde edilen diziyi ( '|/~)

Ana dize şu dönüşümlerden geçer:

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

yerine "0"sahip ", 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!

yerine "1"sahip "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!

yerine "2"ile "here", daha sonra "3"birlikte "68 8"vs.

8, sese karşılık gelir ve 9, hayvana karşılık gelir.


Bunu açıklayabilir misin? CJam'ın ne olduğunu bile bilmiyorum
Cruncher

@Cruncher CJam benim yaptığım bir dildir, sf.net/p/cjam ; Ben golf bittikten sonra açıklayabilirim :)
aditsu çıkmak SE çünkü EVIL

1
@Cruncher şimdi bir açıklama ekledi
aditsu çıkıldı çünkü SE EVIL

9
♬ ve bu beş o sev'n altı dokuz, ze eee ro ♬
aditsu çıkmak çünkü SE EVIL

E-I-Daha sonra tekrarlanan bir dize olabilir mi? :)
rybo111

5

Bash + iconv, 128 Unicode karakter

Aşağıdaki pure-bash / ascii fonksiyon gövdesini alır ve unicode karakterlere ters kodlar:

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

Kabuk işlevini tanımlar m. Şu şekilde arayın:

$ m midilli komşu
Yaşlı MacDonald'ın bir çiftliği vardı, EIEIO,
Ve o çiftlikte bir midilli vardı, EIEIO,
Neigh neigh ne burada ve neigh neigh orada,
Burada bir komşu, bir komşu, her yerde bir komşu komşu,
Yaşlı MacDonald'ın bir çiftliği vardı, EIEIO!
$ 

Saf bash, 171 bayt (yalnızca ASCII)

Orijinal ayetin ("inek" ve "moo" ile) sadece 203 karakter olduğunu belirtmek gerekir.

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

Kabuk işlevini tanımlar m. Şu şekilde arayın:

$ m koyun baa
Yaşlı MacDonald'ın bir çiftliği vardı, EIEIO,
Ve o çiftlikte bir koyunu vardı, EIEIO,
Burada bir baa baa ve orada bir baa baa ile,
İşte bir baa, bir baa, her yerde bir baa baa,
Yaşlı MacDonald'ın bir çiftliği vardı, EIEIO!
$

4

C ++ (403)

Pekala, bu biraz uzun bir atış, ama kim aşırı tanımlamayı sevmiyor?

#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 = doğru;
Vekil

Bu sıkılığı daha fazla paketleyebilecek tanımlar var mı?
einsteinsci

1
Eskiden mümkün #define X defineve sonra kullanılabilirdi #X Y Z. Ne yazık ki, o kafa IOCCC günleri uzun zaman geçmiş ...
nneonneo

Bunun +yerine kullanmaya ne dersiniz <<? Veya char*yerine string? // Bunlardan yalnızca biri aynı anda kullanılabilir.
Qwertiy

2

Python, 116 Unicode karakter

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

StackOverflow özel karakterlerimi yiyor, bu yüzden base64'deki dosya:

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

Veriler, yinelenen dizeleri etkili bir şekilde kodlayan zlib kullanılarak paketlenir (zlib, genel olarak metni sıkıştırmakta iyidir). "Unicode karakterleri" kuralından yararlanmak için, 121 baytlık zlib parçası doldurulur ve baytlamayı UTF-16 olarak yorumlayarak 61 karakterlik bir Unicode dizesine yarıya bölünür.

İşlevi şu şekilde çağır:

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

Güzel, ancak İnek ve moo'nun işlev parametrelerinde dizeler olduğu ve örneğin domuz ve oink veya koyun ve baa olarak değiştirilebilir . Çıktınızın inek / moo'ya sabit kodlanmış olduğu anlaşılıyor.
Dijital Travma

@DigitalTrauma: Okuma anlayışım başarısız! Sabit.
nneonneo

thats better :) +1
Dijital Travma

115 . Sondaki yeni satırı saymanıza gerek yok.
nyuszika7h

@ nyuszika7h Hayır, 116. Python 2'nin ASCII olmayan bir kaynağı kabul etmesini sağlamak için başlangıçta “UTF-8 BOM” (EF BB BF) saymayı unuttunuz. (Bu Python 3 değil, sahip değil .decode('zip').)
Anders Kaseorg

1

Python, 217

Gerçekten bu kadar golf olamaz. Sadece açık ön uç tekrarını çıkardım ve ...

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

Bunu JSCrush ile yaptım ... gerçekten gerçek bir cevap değil, sadece herkesin bunu ana dilde dövüp dövemeyeceğini görmek ilginç olurdu. ( DÜZENLEME : 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

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

Kullanımı: 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+"!");}

Daha fazla optimizasyon kesinlikle mümkündür.


Printf

Trevin Avery bu düzenlemeyi önerdi: Java - 243 - geçersiz String ... a) {String c = "a" + a [1], d = c + "" + a [1], e = ", EIEIO", f = "Eski MacDonald'ın bir çiftliği vardı" + e; System.out.print (f + ", \ nVe bu çiftlikte" + a [0] + e + "vardı, \ nBurada" + d + "ve orada" + d + "vardı , \ nBurada "+ c +", orada "+ c +" ', her yerde "+ d +", \ n "+ f +"! ");} Daha fazla optimizasyon kesinlikle mümkündür
Justin

1

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

Aşağıdaki komut dosyasının, Malzeme Listesi olmadan UTF-8 olarak kaydedilmesi gerekir.

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

Kullanımı: f("cow", "moo");.

Perl -M5.0105.10 özelliklerini etkinleştirmek için Perl bayrağı ile çalıştırılmalıdır . ( Buna izin verilir .)

Karakter sayısı (131) ve bayt sayısı (313) simetrisini çok seviyorum. Çok yin ve yang.

Perl 5 (ASCII) - 181 karakter, 181 bayt

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

Kullanımı: f("cow", "moo");.

Yine, -M5.010Perl 5.10 özelliklerini etkinleştirmek için perl bayrağı ile çalıştırılmış olmalıdır .



Aslında codegolf.stackexchange.com/a/26628/12469 benim başlangıç noktamdı . Uzunluğu daha da azaltan birkaç ekstra değişkeni test ettim ve daha sonra diğer uygulamalardan birkaçının kullandığı UTF16 hilesini uyguladım.
tobyink

1

CJam (ASCII dışı) - 77 karakter

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

Kullanımı: "cow""moo"F

Dize, baz 127'den 56000 tabanına dönüştürülen diğer CJam çözümüm .
Bir UTF-8 yerel ayarı gerekebilir.

Bu arada, şimdi çevrimiçi olarak http://cjam.aditsu.net/ adresinden deneyebilirsiniz.


1

JavaScript: 152 karakter / ES6: 149 karakter

İşte 214 karakterdeki işi yapan "z" adında bir JS işlevi. (yürütme!)

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

140byt.es için @subzey ve I tarafından oluşturulan bir tekniği kullanarak unicode karakterlerde "paketledim".

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

bu son parçacığı yürütün, sonra arayın z("cow","moo")ve şu dizeyi alırsınız:

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

Daha fazla bilgi için: http://xem.github.io/golfing/en.html#compress

ES6 sürümü:

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

Sanırım şeyleri doğru bir şekilde kopyalayıp yapıştırmadınız, kodunuz 250'den fazla karaktere sahip görünüyor - ayy, belki değil, ama metin düzenleyicim garip davranıyor, araştıracağım.
aditsu, SE

Oh, karakterlerin çoğu bazı astral uçaklardan (muhtemelen bu yüzden burada 2 karakter olarak sayılıyorlar) ... ve ayrılmamışlar. Bu kuralları biraz
geriyor

Bunun hile olduğunu sanmıyorum: bu semboller unicode karakterlerdir ve 2 karakter olarak sayılmamalıdır. Ayrıca, Twitter her birini 1 karakter olarak sayar. ES6 sürümünü bir tweet'te kopyalarsanız, 9 karakterden çok uzun olduğunu söylüyor. Yani, 149 bu :)
xem

1

C # - 339 Bayt

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

Kullanımı: x("cow","moo");


1

Rebol'un, 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]]

Kullanımı: 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;

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;

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

Tanımlayarak c=b.." "..b, bir düzine karakteri kaydedebilirim. dYaptığım gibi tanımlayarak 23 karakter kaydediyorum. Bunu nasıl kısaltabileceğimi görmüyorum. Buna via denir 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];}

Lambda'yı kötüye kullanmak, değiştirmeleri emirleri tanımlanmış bir sırada tutmak için LinkedhashMap'e yerleştirdikten sonra, anahtarı ana String'deki değerle değiştirmek için bir foreach lambda kullandı. parametreler haritadaki son 2 yedek olarak eklenir. varargs argümanının yöntem başlığındaki bazı baytları tıraş etmek olduğunu

Ungolfed sürümü:

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

Arayan

f('cow', 'moo');

0

Saf C, 298 bayt, unicode yok

Benim fonksiyonumda tek bir argüman alıyorum, bu aslında bir sürü char*birlikte paketlenmiş. Her dize null sonlandırılır ve sonunda fazladan bir null sonlandırıcı bulunur. Bu kontrol etmeme izin veriyorstrlen(a) bir sayaç değişkeni tutmak yerine her bir döngünün sonunda .

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

Çıktı:

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

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

Çok astarlı ve çok katmanlı olmayan ve katı girinti kurallarına sahip bir dil için bile, Cobra hala oldukça iyi.


0

C: 224 bayt

Printf duyarlık belirtecini kullanarak, hem printf biçimi dizesiyle hem de parametrelerden ikisiyle aynı dizeyi kullanabiliriz.

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

Beyaz boşluk ve dize satırlara ayrıldığında:

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 bayt

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

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

@#%^<>&*(Çıktı çökme parametreleri .


0

Haskell (282 ve yine de biraz okunabilir :))

wc -c oldmacdonald.hs
     282 oldmacdonald.hs

Dosya:

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

281, C önişlemci makrosu veya yeni satır sonlandırması gerektiren başka bir şey olmadığı sürece genellikle sondaki yeni satırı saymazsınız. Çoğu durumda, yalnızca döndürülen bayt sayısından 1 çıkarabilirsiniz wc -c, ancak mothereff.in/byte-counter kullanmayı ve programın çalışması için gerekli olmadıkça sonunda boş satır olmadığından emin olmayı tercih ederim .
nyuszika7h

0

ES6, unicode olmadan 179 186 karakterlik 2 çözüm

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

Ve ikinci:

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

Uyarı çağrısı ekledim (+7 karakter).


Sanırım şu an unicoded olmayanlardan en kısa çözüm.
Qwertiy

0

JavaScript (E6) 140 karakter

Karakter sayacı: https://mothereff.in/byte-counter , 140 karakter, UTF-8'de 425 bayt

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

Orijinal ASCII kodu 188 bayt

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

Http://xem.github.io/obfuscatweet/ ile sıkıştırılmış

FireFox / FireBug konsolunda test

f('mosquito','zzz')

Çıktı

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!
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.