Старая функция Макдональда

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.

Следует учитывать заглавные буквы, дефисы, знаки пунктуации, пробелы и переносы строк.

Стремитесь набрать наименьшее количество символов Юникода в вашем коде.

rybo111
источник
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

Стремитесь набрать наименьшее количество символов Юникода в вашем коде.

Не короче, но, вероятно, самый запутанный.

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 Я использовал термин «строка» (не массив) в правилах, так что, я полагаю, вы правы. Я думаю, что "обман" немного грубоват!
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"

Таким образом, код заменяет каждое число в основной строке строкой, которая ранее находилась в стеке. У нас есть животное и звук, затем «has», «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 - животному.

aditsu
источник
Вы можете это объяснить? Я даже не знаю , что CJam это
Кранчер
@Cruncher CJam - это язык, который я создал, sf.net/p/cjam ; Я могу это объяснить, как только закончу играть в гольф :)
aditsu
1
@Cruncher добавил объяснение сейчас
aditsu
9
♬ и на эти пять он семь шесть девять, зее эээ ро ad
адицу
Может E-I-быть строка, которая затем повторяется? :)
rybo111
5

Bash + iconv, 128 символов Юникода

Принимает нижеследующее тело функции pure-bash / ascii и выполняет обратное кодирование в символы unicode:

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

Определяет функцию оболочки m. Звоните как:

$ m пони ржать
У старого Макдональда была ферма, EIEIO,
И на той ферме у него был пони, EIEIO,
С ржать ржать здесь и ржать ржать там,
Здесь ржут, там ржут, везде ржут ржут,
У старого Макдональда была ферма, EIEIO!
$ 

Чистый bash, 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. Звоните как:

$ m баран баа
У старого Макдональда была ферма, EIEIO,
И на той ферме у него была овца, EIEIO,
С баа баа здесь и баа баа там,
Здесь Baa, там Baa, везде Baa Baa,
У старого Макдональда была ферма, EIEIO!
$
Цифровая травма
источник
4

С ++ (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;}
einsteinsci
источник
2
this.eyes.bleeding = true;
Прокси
Какие-нибудь определения, которые могли бы еще упаковать это крепче?
einsteinsci
1
Раньше было возможно, #define X defineа затем использовать #X Y Z. К сожалению, эти опрометчивые дни IOCCC давно прошли ...
nneonneo
Как насчет использования +вместо <<? Или используя 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 хорош для сжатия текста в целом). Чтобы воспользоваться преимуществом правила «символы Юникода», 121-байтовый блок zlib дополняется и делится пополам на 61-символьную строку Юникода, интерпретируя строку байтов как UTF-16.

Вызовите функцию как

f(cow='pig', moo='oink')
nneonneo
источник
Хорошо, но где корова и му являются строками в параметрах функции и, как таковые, могут быть заменены, например, на свинью и хрюшу или овцу и баа . Похоже, ваш вывод жестко запрограммирован на корову / му.
Цифровая травма
@DigitalTrauma: мое понимание прочитанного не удалось! Исправлена.
nneonneo
это лучше :) +1
Цифровая травма
115 . Не нужно считать завершающий перевод строки.
nyuszika7h
@ nyuszika7h Нет, это 116. Вы забыли посчитать «UTF-8 BOM» (EF BB BF) в начале, что необходимо для того, чтобы Python 2 мог принимать не-ASCII-источник. (Это не Python 3, которого нет .decode('zip').)
Андерс Касорг
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 ... не совсем реальный ответ, просто было бы интересно посмотреть, сможет ли кто-нибудь победить это на общепринятом языке. ( РЕДАКТИРОВАТЬ : э-э)

_='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(_)
cjfaure
источник
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"});

Gayuha
источник
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+"!");}

Дальнейшая оптимизация определенно возможна.

Ypnypn
источник
Вы могли бы использовать printf
aditsu
Тревин Эйвери предложил это редактирование: Java - 243 - void String ... a) {String c = "a" + a [1], d = c + "" + a [1], e = ", EIEIO", f = «У старого Макдональда была ферма» + 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 без спецификации.

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.

tobyink
источник
Хм, выглядит знакомо codegolf.stackexchange.com/a/26633/11259 ;-)
Цифровая травма
На самом деле 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/

aditsu
источник
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+'!')}

Я «упаковал» его в символы Юникода, используя технику, созданную @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,'')))
XEM
источник
Я думаю, что вы неправильно копировали и вставляли, ваш код, похоже, содержит более 250 символов - упс, может быть, и нет, но мой текстовый редактор ведет себя странно, я исследую.
aditsu
О, большинство ваших персонажей принадлежат к некоторым астральным планам (возможно, поэтому их здесь считают за 2 персонажа) ... и тоже нераспределенным. Это немного растягивает правила :)
aditsu
Ну, я не думаю, что это обман: эти символы являются символами Юникода и не должны считаться 2 символами. Кроме того, Твиттер считает каждого из них как 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");

tsavinho
источник
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"

draegtun
источник
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, чтобы сохранить их в определенном порядке, затем использовал лямбда-выражение 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];
}
masterX244
источник
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!
WJL
источник
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 все еще работает довольно хорошо.

Οurous
источник
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 "#)
(#)=(++)
Linse
источник
Это 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
источник
Я думаю, это самое короткое решение из нешифрованных на данный момент.
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!
edc65
источник