Стара функція 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
Хіба це не повинно бути складністю колмогорова ?
mniip

6
Ви кажете echoes the following. Ви маєте на увазі, що функція повинна її роздрукувати або повернути?
cjfaure

2
Щоб зробити це справедливим, я думаю, що у цьому питанні повинні бути точні розділові знаки, пробіли та повернення каретки. Але що ви думаєте про великі літери / малі літери? Я думав, що один випадок може бути простішим і уникнути навантаження стандартних додатків base64 або подібних. З іншого боку, єдині великі літери знаходяться на початку рядка, слово MacDonald і в EIEIO, тому може бути цікавіше зробити саме це питання.
Рівень р. Св

4
Це прийнятно для виведення a oinkчи це повинно бути зроблено an oink?
ClickRick

4
@ rybo111: Чи знали ви, що великий Дональд Кнут написав науковий документ про подібні речі? Він був фактично опублікований у справжньому журналі (правда, у квітневому виданні). Більше тут, включаючи посилання на PDF-документ: en.wikipedia.org/wiki/The_Complexity_of_Songs
Том Чантлер

Відповіді:


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
Я передав рядки за двома розділеними параметрами, але, прочитавши виклик, я не побачив причин не передавати рядки у форматі масиву, тому я відредагував свою відповідь. Це не обман, просто заощадження кількох символів, коли це можливо. Нехай @ rybo111 вирішує, підходить це правило чи ні.
Майкл М.

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"], \міняє цей масив попереднім елементом ("bar") і *приєднується до масиву, що призводить до"foo bar baz"

Отже код замінює кожне число в головному рядку рядком, який раніше був у стеку. У нас є тварина і звук, потім "мав", "а" і т. Д. І нарешті ", 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 CJam - мова, яку я створив, sf.net/p/cjam ; Я можу це пояснити, як тільки я закінчу гольф :)
aditsu

1
@Cruncher додав пояснення зараз
aditsu

9
♬ і на ті п'ять він сев'н шість дев'ять, ze eee ro ♬
aditsu

Чи може E-I-бути рядок, який потім повторюється? :)
rybo111

5

Bash + iconv, 128 символів Unicode

Візьмемо нижче функцію body-bash / ascii та обернене кодує в символи unicode:

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

Визначає функцію оболонки m. Телефонувати як:

$ м поні сусід
Старий Макдональд мав ферму, EIEIO,
І на тому фермі у нього був поні, EIEIO,
З сусідом тут і сусідом там,
Тут сусід, там сусід, скрізь сусід,
Старий Макдональд мав ферму, EIEIO!
$ 

Чистий баш, 171 байт (лише для 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. Телефонувати як:

$ м овець бе
Старий Макдональд мав ферму, EIEIO,
І на тому фермі у нього була вівця, EIEIO,
З баа-беа тут і баа-бе там
Тут баа, там баа, скрізь баа бе,
Старий Макдональд мав ферму, 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 = вірно;
Проксі

Хтось визначає, що може ще більше упакувати це?
einsteinsci

1
Раніше це було можливо, #define X defineа потім використовувати #X Y Z. На жаль, ті невпинні дні
МОККС

Що з використанням +замість <<? Або використовувати char*замість string? // Одночасно можна використовувати лише один із них.
Qwertiy

2

Python, 116 символів Unicode

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-байтових злібних блоків прокладений і вдвічі менший до 61-символьної рядка Unicode, інтерпретуючи бітестрінг як UTF-16.

Викличте функцію як

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

Приємно, але там, де корова та му - це рядки в параметрах функції, і, як таке, можна змінити, наприклад, свиню та ойка або овець і беа . Схоже, ваш вихід твердо кодований на корова / му.
Цифрова травма

@DigitalTrauma: Моє розуміння читання не вдається! Виправлено.
nneonneo

це краще :) +1
Цифрова травма

115 . Не потрібно рахувати нижній рядок.
nyuszika7h

@ nyuszika7h Ні, це 116. Ви на початку забули порахувати "UTF-8 BOM" (EF BB BF), що необхідно, щоб Python 2 прийняв джерело, яке не є ASCII. (Це не Python 3, якого немає .decode('zip').)
Anders Kaseorg

1

Пітона, 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 ... Насправді не справжня відповідь, було б просто цікаво подивитися, чи хтось може перемогти це мовою основної мови. ( РЕДАКТ : 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

Ява, 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

Ява - 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

Тревін Евері запропонував це редагування: Java - 243 - анульований рядок ... a) {String c = "a" + a [1], d = c + "" + a [1], e = ", EIEIO", f = "У старого MacDonald була ферма" + e; System.out.print (f + ", \ nА на цій фермі у нього було" + a [0] + e + ", \ nЗ" + d + "тут і" + d + "там , \ nОсь "+ 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");.

Знову-таки, perl потрібно запустити з -M5.010прапором, щоб включити функції 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 символах. (не виконайте це!)

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, використовуючи техніку, створену @subzey і я для 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, і їх не слід вважати двома знаками. Також 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

Ребол, 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;

Безумовно

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 для заміни ключа зі значенням в основному String. Параметри додаються як дві останні заміни на карті. що аргумент 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 байт, без унікоду

У своїй функції я беру єдиний аргумент, який насправді є згубленим char*разом. Кожен рядок закінчується нулем, а в кінці є додатковий нульовий термінатор. Це дозволяє мені перевірити 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]!"

Навіть для мови з малопомітною багаторівневою підкладкою та суворими правилами відступу, Кобра все ще працює досить добре.


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

Пробіл і рядок розділені на рядки:

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 186 символів без унікоду

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 символів

Лічильник знаків : https://mothereff.in/byte-counter , 140 символів, 425 байт в 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!
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.