ฟังก์ชั่นเก่าของ MacDonald


16

สร้างฟังก์ชั่นในภาษาที่คุณเลือกซึ่งจะพิมพ์สิ่งต่อไปนี้:

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!

ที่ไหนcowและmooเป็นสตริงในพารามิเตอร์ฟังก์ชั่นและเช่นสามารถเปลี่ยนเป็นpigและoinkหรือหรือsheepและbaaตัวอย่างเช่น

ควรคำนึงถึงตัวพิมพ์ใหญ่, เครื่องหมายขีดคั่น, เครื่องหมายวรรคตอน, ช่องว่างและตัวแบ่งบรรทัด

มุ่งหวังที่จะพิมพ์จำนวนอักขระ Unicode น้อยที่สุดในรหัสของคุณ


1
สิ่งนี้ไม่ควรเป็นความซับซ้อนของ kolmogorovใช่หรือไม่
mniip

6
echoes the followingคุณบอกว่า คุณหมายถึงฟังก์ชั่นควรพิมพ์หรือส่งคืนหรือไม่?
cjfaure

2
เพื่อให้งานนี้ออกมาฉันคิดว่าสิ่งนี้ควรมีเครื่องหมายวรรคตอนช่องว่างและการรับคืนของคำถาม แต่คุณคิดอย่างไรกับตัวพิมพ์ใหญ่ / ตัวพิมพ์เล็ก? ฉันคิดว่ากรณีเดียวอาจง่ายกว่าและหลีกเลี่ยงการโหลดแอปพลิเคชันมาตรฐานของ base64 หรือที่คล้ายกัน ในเรื่องของความสมดุลเมืองหลวงเพียงแห่งเดียวอยู่ที่จุดเริ่มต้นของบรรทัดคำ MacDonald และใน EIEIO ดังนั้นจึงอาจน่าสนใจมากขึ้นที่จะทำสิ่งนั้นตามคำถาม
เลเวลริเวอร์เซนต์

4
มันเป็นที่ยอมรับในการส่งออกa oinkหรือที่ควรจะเป็นan oink?
ClickRick

4
@ rybo111: คุณรู้ไหมว่า Donald Knuth ผู้ยิ่งใหญ่เขียนบทความเกี่ยวกับสิ่งนี้? มันถูกตีพิมพ์ในวารสารจริง (เป็นที่ยอมรับในฉบับเดือนเมษายน) เพิ่มเติมที่นี่รวมถึงลิงก์ไปยัง PDF ของเอกสาร: en.wikipedia.org/wiki/The_Complexity_of_Songs
Tom Chantler

คำตอบ:


15

Javascript ES6 - 204

ตั้งเป้าที่จะพิมพ์Unicodeในจำนวนที่น้อยที่สุดในรหัสของคุณ

ไม่สั้นลง แต่อาจดูสับสนที่สุด

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

หากเบราว์เซอร์ของคุณไม่รองรับ 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)}

คัดลอก / วางโค้ดที่เป็นเบราว์เซอร์และคอนโซลลองของคุณf('cow','moo'),f('pig','oink') ,f('sheep','baa')

มันทำงานอย่างไร ?

cเป็นอาร์เรย์ของตัวอักษร 29 ตัวบวกกับสัตว์และเสียงของมัน (ให้เรียกว่าตัวอักษรของเรา)
ดังนั้นตัวละครทั้งหมด 31 ตัวพอดีใน 5 บิต (2 ^ 5 = 32)
อักขระ Unicode เป็น 16 บิตนานจึงสามารถเข้ารหัส 3 ตัวอักษรของเราตัวอักษรที่มีบิตช่องว่างภายใน
ข้อความเต็มกับบรรทัดใหม่คือ 186 ตัวอักษรของเราตัวอักษรก็สามารถเข้ารหัสด้วย 62 ตัวอักษร Unicode

ตัวอย่างเช่นOldมีการเข้ารหัสเช่นนี้:

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

หากคุณมีปัญหาในการอ่านตัวอักษร Unicode บางตัวให้ติดตั้งแบบอักษร Code2000


2
"cow"และ"moo"ควรจะเป็นพารามิเตอร์ฟังก์ชั่น ด้วยการทำให้ผู้เรียกผ่านอาร์เรย์คุณกำลังบันทึกอักขระภายในนิยามฟังก์ชันโดยมีค่าใช้จ่ายในการเพิ่มจำนวนตัวอักษรของรหัสการโทร กลิ่นนี้เหมือนโกงฉัน การใช้วิธีที่รุนแรงที่คุณสามารถกำหนดfunction f(a){alert(a)}(23 ตัวอักษร) f("Old MacDonald had a ...")และบอกว่าจะต้องมีการเรียกว่าเหมือน
tobyink

1
ฉันผ่านสตริงในพารามิเตอร์ที่แยกกันสองตัว แต่หลังจากอ่านความท้าทายฉันไม่เห็นเหตุผลที่จะไม่ผ่านสตริงในรูปแบบอาร์เรย์ดังนั้นฉันจึงแก้ไขคำตอบของฉัน นี่ไม่ใช่การโกงเพียงบันทึกสองสามตัวอักษรเมื่อเป็นไปได้ Let @ rybo111 ตัดสินใจว่าสิ่งนี้เหมาะสมกับกฎหรือไม่
Michael M.

1
@tobyink ฉันใช้คำว่า 'string' (ไม่ใช่อาร์เรย์) ในกฎดังนั้นฉันคิดว่าคุณพูดถูก ฉันคิดว่า 'การโกง' นั้นค่อนข้างรุนแรง
rybo111

2
ทำไมถึงมีคะแนนเสียงมากมาย เป็นมากกว่า 200 และไม่ใช่แม้แต่โซลูชัน javascript ที่สั้นที่สุด
aditsu

เธออธิบายและอธิบายอย่างดีดังนั้นฉันต้องโหวตด้วย
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;

การใช้งาน: "cow""moo"F
สำหรับ GolfScript แทนที่'|ด้วย"|"และAด้วย10

คำอธิบาย:

ส่วนสำคัญคือA,{`/\*}/:
A,{...}/ดำเนินการบล็อกสำหรับแต่ละหมายเลข 0-9 (A = 10)
`แปลงหมายเลขที่สตริง
/\*ไม่สตริงแทนที่: ถ้าเรามีในสแตก"bar" "foo 1 baz" "1"แล้ว/แยกสตริงที่เกิดขึ้นใน["foo " " baz"], \แลกเปลี่ยนอาร์เรย์นี้กับรายการก่อนหน้า ("บาร์") และ*รวมอาร์เรย์เข้าด้วยกัน"foo bar baz"

ดังนั้นรหัสจะแทนที่ตัวเลขแต่ละตัวในสตริงหลักด้วยสตริงที่อยู่บนสแต็กก่อนหน้านี้ เรามีสัตว์และเสียงจากนั้น "มี", "a", ฯลฯ และสุดท้าย ", EIEIO" และสายอักขระหลัก "10, ... !" เพื่อหลีกเลี่ยงการใช้อัญประกาศมากเกินไปฉันใส่สตริงทั้งหมด (ยกเว้นพารามิเตอร์) ในหนึ่งสายแล้วแยกมันออกแล้วทิ้งอาร์เรย์ผลลัพธ์ ( '|/~)

สายหลักจะต้องผ่านการแปลงต่อไปนี้:

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

แทนที่"0"ด้วย", 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!

แทนที่"1"ด้วย"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!

แทนที่"2"ด้วย"here"แล้ว"3"ด้วย"68 8"ฯลฯ

8 สอดคล้องกับเสียงและ 9 ต่อสัตว์


คุณอธิบายได้ไหม ฉันไม่รู้ด้วยซ้ำว่า CJam คืออะไร
Cruncher

@Cruncher CJam เป็นภาษาที่ฉันทำsf.net/p/cjam ; ฉันสามารถอธิบายได้เมื่อฉันเล่นกอล์ฟจนเสร็จ :) :)
aditsu

1
@Cruncher เพิ่มคำอธิบายแล้ว
aditsu

9
♬และในห้านั้นเขาอายุเจ็ดสิบเก้า, ze eee ro ♬
aditsu

สามารถE-I-เป็นสตริงที่ทำซ้ำแล้ว? :)
rybo111

5

Bash + iconv, อักขระ Unicode 128 ตัว

รับฟังก์ชั่นฟังก์ชั่น pure-bash / ascii ด้านล่างและเข้ารหัสแบบย้อนกลับเป็นตัวอักษร unicode:

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

mกำหนดฟังก์ชั่นเชลล์ โทรเป็น:

$ m pony neigh
Old MacDonald มีฟาร์ม EIEIO
และในฟาร์มนั้นเขามีม้าตัวหนึ่ง EIEIO
ด้วยเพื่อนบ้านที่นี่และเพื่อนบ้านของฉัน
ที่นี่ใกล้ ๆ มีที่อยู่หนึ่งที่ทุกที่ใกล้ที่หนึ่ง
Old MacDonald มีฟาร์ม EIEIO!
$ 

Pure bash, 171 bytes (เฉพาะ ascii)

ฉันคิดว่ามันคุ้มค่าที่จะเห็นว่าข้อเดิม (กับ "วัว" และ "หมู่") เป็นเพียง 203 ตัวอักษร

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

mกำหนดฟังก์ชั่นเปลือก โทรเป็น:

$ m แกะบา
Old MacDonald มีฟาร์ม EIEIO
และในฟาร์มนั้นเขามีแกะ EIEIO
ด้วย Baa Baa ที่นี่และ Baa Baa ที่นั่น
ที่นี่ Baa มี Baa ทุกที่ Baa Baa
Old MacDonald มีฟาร์ม EIEIO!
$

4

C ++ (403)

เอาล่ะนี่เป็นช็อตเล็กน้อย แต่ใครไม่ชอบการกำหนดมากเกินไป?

#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

มีคำจำกัดความใดที่สามารถเพิ่มเติมความเข้มงวดในเรื่องนี้มากขึ้น?
einsteinsci

1
จะใช้เป็นไปได้ที่จะและการใช้งานแล้ว#define X define #X Y Zน่าเศร้าที่วันของ IOCCC ที่ผ่านมาเหล่านี้ได้ผ่านพ้นไปนานแล้ว ...
พ.ย.

แล้วใช้+แทน<<อะไร หรือใช้char*แทนstring? // หนึ่งในนั้นสามารถใช้ได้พร้อมกัน
Qwertiy

2

Python, 116 Unicode chars

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

StackOverflow กำลังกินอักขระพิเศษของฉันดังนั้นนี่คือไฟล์ใน base64:

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

ข้อมูลถูกบีบอัดโดยใช้ zlib ซึ่งจะเข้ารหัสโค้ดที่ซ้ำกันได้อย่างมีประสิทธิภาพ (zlib นั้นดีในการบีบอัดข้อความโดยทั่วไป) เพื่อใช้ประโยชน์จากกฎ "อักขระ Unicode" ก้อนขนาด 121- ไบต์ zlib จะถูกเพิ่มและแบ่งครึ่งให้เป็นสตริง Unicode ที่มีความยาว 61 ตัวอักษรโดยการตีความค่า bytestring เป็น UTF-16

เรียกใช้ฟังก์ชันเป็น

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

ดี แต่ไหนวัวและหมู่สตริงในพารามิเตอร์ของฟังก์ชั่นและเป็นเช่นนี้สามารถเปลี่ยนเป็นหมูและหมูหรือแกะและ Baa ยกตัวอย่างเช่น ดูเหมือนว่าเอาต์พุตของคุณจะถูกเข้ารหัสเป็นวัว / หมู่
Digital Trauma

@DigitalTrauma: ความเข้าใจในการอ่านของฉันล้มเหลว! แก้ไขแล้ว.
nneonneo

ดีกว่านั้น :) +1
บาดเจ็บทางดิจิทัล

115 . ไม่จำเป็นต้องนับขึ้นบรรทัดใหม่
nyuszika7h

@ nyuszika7h ไม่มันเป็น 116 คุณลืมที่จะนับ“ UTF-8 BOM” (EF BB BF) ที่จุดเริ่มต้นซึ่งจำเป็นต้องให้ Python 2 ยอมรับแหล่งที่ไม่ใช่ ASCII (นี่ไม่ใช่ Python 3 ซึ่งไม่มี.decode('zip'))
Anders Kaseorg

1

Python 217

คุณไม่สามารถเล่นกอล์ฟได้มากขนาดนี้ ฉันเพิ่งเอาการทำซ้ำส่วนหน้าที่โจ่งแจ้งและ ...

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

ทำสิ่งนี้ด้วย JSCrush ... ไม่ใช่คำตอบที่แท้จริงจริง ๆ มันน่าสนใจที่จะเห็นว่ามีใครสามารถเอาชนะสิ่งนี้ในภาษาหลักได้ไหม ( แก้ไข : เอ่อ)

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

การใช้งาน: 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+"!");}

การเพิ่มประสิทธิภาพเพิ่มเติมเป็นไปได้แน่นอน


คุณสามารถใช้ printf
aditsu

Trevin Avery แนะนำการแก้ไขนี้: Java - 243 - void String ... a) {String c = "a" + a [1], d = c + "" + a [1], e = ", EIEIO", f = "Old MacDonald มีฟาร์ม" + e; System.out.print (f + ", \ n และในฟาร์มนั้นเขามี" + a [0] + e + ", \ n ด้วย" + d + "ที่นี่และ" + d + "ที่นั่น \ nHere "+ C +" มี "+ C +' ทุกที่ "+ D +" \ n "+ F +"");} การเพิ่มประสิทธิภาพต่อไปเป็นไปได้แน่นอน!
จัสติน

1

Perl 5 (UTF-8) - 131 อักขระ, 313 ไบต์

สคริปต์ด้านล่างจะต้องบันทึกเป็น UTF-8 โดยไม่มี BOM

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

การใช้งาน: f("cow", "moo");.

Perl ต้องมีการรันพร้อมกับ-M5.010ค่าสถานะเพื่อเปิดใช้งานฟีเจอร์ Perl 5.10 ( สิ่งนี้ได้รับอนุญาต )

ฉันชอบความสมมาตรของจำนวนตัวละคร (131) และจำนวนไบต์ (313) มันหยินและหยางมาก

Perl 5 (ASCII) - 181 ตัวอักษร, 181 ไบต์

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

การใช้งาน: f("cow", "moo");.

อีกครั้งต้องได้รับการเรียก-M5.010ใช้ Perl กับธงเพื่อเปิดใช้งานคุณสมบัติ Perl 5.10



ที่จริงcodegolf.stackexchange.com/a/26628/12469คือจุดเริ่มต้นของฉัน ฉันทดสอบตัวแปรพิเศษสองสามตัวที่ลดความยาวลงไปอีกจากนั้นใช้เคล็ดลับ UTF16 ที่การใช้งานอื่น ๆ หลายอย่างใช้
tobyink

1

CJam (ไม่ใช่ ASCII) - 77 ตัวอักษร

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

การใช้งาน: "cow""moo"F

สตริงคือโซลูชัน CJam อื่น ๆ ของฉันที่แปลงจากฐาน 127 เป็นฐาน 56000
อาจจำเป็นต้องใช้ตำแหน่งที่ตั้ง UTF-8

ตอนนี้คุณสามารถลองออนไลน์ได้ที่http://cjam.aditsu.net/


1

JavaScript: 152 ตัวอักษร / ES6: 149 ตัวอักษร

นี่คือฟังก์ชัน JS ชื่อ "z" ที่ทำงานใน 214 chars (อย่าดำเนินการ!)

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

ฉัน "แพ็ค" ใน unicode chars โดยใช้เทคนิคที่สร้างขึ้นโดย @subzey และ I สำหรับ 140byt.es)

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

เรียกใช้ข้อมูลโค้ดสุดท้ายจากนั้นโทรz("cow","moo")และคุณจะได้รับสตริงนี้:

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

ข้อมูลเพิ่มเติมได้ที่นี่: http://xem.github.io/golfing/en.html#compress

รุ่น ES6:

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

ฉันคิดว่าคุณไม่ได้คัดลอกสิ่งที่ถูกต้องรหัสของคุณดูเหมือนจะมีมากกว่า 250 ตัวอักษร - อาจจะไม่ แต่โปรแกรมแก้ไขข้อความของฉันทำงานผิดปกติฉันจะตรวจสอบ
aditsu

โอ้ตัวละครส่วนใหญ่ของคุณมาจากเครื่องบินคล้ายดาว (นั่นอาจเป็นเหตุผลว่าทำไมพวกเขาถึงถูกนับเป็น 2 ตัวอักษรที่นี่) ... และไม่ได้ถูกจัดสรรด้วย นี่เป็นการยืดกฏเล็กน้อย :)
aditsu

ฉันไม่คิดว่านี่เป็นการโกง: สัญลักษณ์เหล่านั้นเป็นตัวอักษรแบบ Unicode และไม่ควรนับเป็น 2 ตัวอักษร นอกจากนี้ Twitter นับว่าพวกเขาแต่ละคนเป็น 1 อักขระ หากคุณคัดลอกเวอร์ชัน ES6 ในทวีตแสดงว่ามันยาวเกินไป 9 ตัวอักษร ดังนั้น 149 เป็น :)
xem

1

C # - 339 ไบต์

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

การใช้งาน: 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]]

การใช้งาน: 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

ลัวะ 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

โดยการกำหนดc=b.." "..bฉันสามารถบันทึกตัวละครโหล โดยการกำหนดdเช่นฉันฉันบันทึก 23 ตัวอักษร ฉันไม่เห็นว่าฉันจะย่อขนาดนี้ให้สั้นลงได้อย่างไร 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];}

การใช้แลมบ์ดาในทางที่ถูกต้องนั้นจะทำการแทนที่ใน LinkedhashMap เพื่อให้ em อยู่ในลำดับที่กำหนดจากนั้นใช้แลมบ์ดา foreach เพื่อแทนที่คีย์ด้วยค่าในสตริงหลัก มีการเพิ่มพารามิเตอร์เป็นการแทนที่ 2 ครั้งล่าสุดในแผนที่ อาร์กิวเมนต์ varargs นั้นคือการโกนบางไบต์ในส่วนหัวของวิธีการ

เวอร์ชันที่ไม่ถูกปรับแต่ง:

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

เรียกได้ว่า

f('cow', 'moo');

0

เพียว C, 298 ไบต์, ไม่มี Unicode

ในฟังก์ชั่นของฉันฉันใช้อาร์กิวเมนต์เดียวซึ่งอันที่จริงแล้วเป็นกลุ่มchar*ที่อัดแน่นกัน แต่ละสตริงสิ้นสุดด้วยค่า null และมีจุดสิ้นสุดค่า null พิเศษในตอนท้าย สิ่งนี้ทำให้ฉันตรวจสอบstrlen(a)ที่จุดสิ้นสุดของแต่ละลูปแทนที่จะเก็บตัวแปรตัวนับไว้

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

เอาท์พุท:

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

คอบร้า - 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]!"

แม้สำหรับภาษาที่มีหลายแบบไม่มีซับในและกฎการย่อหน้าที่เข้มงวด Cobra ยังคงทำได้ค่อนข้างดี


0

C: 224 ไบต์

โดยใช้printfระบุความแม่นยำเราสามารถใช้สตริงเดียวกันกับทั้งสตริงรูปแบบ printf และเป็นพารามิเตอร์สองตัว

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

ด้วย white space และสตริงแบ่งออกเป็นบรรทัด:

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 ตัวอักษร, 272 ไบต์

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

การใช้งาน: m("cow", "moo"); ,m("fox", "Hatee-hatee-hatee-ho");

พารามิเตอร์ที่@#%^<>&*(ขัดข้องกับเอาต์พุต


0

Haskell (282 และยังอ่านค่อนข้าง :))

wc -c oldmacdonald.hs
     282 oldmacdonald.hs

ไฟล์:

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 หรืออย่างอื่นที่ต้องการการยกเลิกการขึ้นบรรทัดใหม่ ในกรณีส่วนใหญ่คุณสามารถลบ 1 จากจำนวนไบต์ที่ส่งคืนโดยwc -cแต่ฉันชอบใช้mothereff.in/byte-counterและทำให้แน่ใจว่าไม่มีบรรทัดว่างเปล่าในตอนท้ายยกเว้นในกรณีที่โปรแกรมจำเป็นต้องทำงาน
nyuszika7h

0

ES6, 2 โซลูชัน179 179ตัวอักษรโดยไม่มี 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]))

และครั้งที่สอง:

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

ฉันได้เพิ่มการโทรแจ้งเตือน (+7 ตัวอักษร)


ฉันคิดว่ามันเป็นวิธีแก้ปัญหาที่สั้นที่สุดจากตอนที่ไม่ได้เข้ารหัส
Qwertiy

0

JavaScript (E6) 140 ตัวอักษร

ตัวนับ Char: https://mothereff.in/byte-counter , 140 chars, 425 bytes ใน UTF-8

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

รหัส ASCII ดั้งเดิม 188 ไบต์

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/

ทดสอบในคอนโซล FireFox / FireBug

f('mosquito','zzz')

เอาท์พุต

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!
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.