Stara funkcja MacDonald


16

Utwórz funkcję w wybranym języku, która wyświetli następujące informacje:

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!

Gdzie cowi moosą ciągami w parametrach funkcji i jako takie można je zmienić na pigi oinklub sheepi baa, na przykład.

Należy wziąć pod uwagę wielkie litery, myślniki, znaki interpunkcyjne, spacje i łamanie wierszy.

Staraj się wpisać jak najmniej znaków w kodzie Unicode.


1
Czy nie powinna to być złożoność Kołmogorowa ?
mniip

6
Mówisz echoes the following. Czy masz na myśli, że funkcja powinna go wydrukować lub zwrócić?
cjfaure

2
Aby to było sprawiedliwe, myślę, że powinna zawierać dokładną interpunkcję, spacje i znaki powrotu karetki. Ale co myślisz o wielkich / małych literach? Myślałem, że pojedynczy przypadek może być łatwiejszy i uniknąć obciążenia standardowymi aplikacjami base64 lub podobnego. Podsumowując, jedyne wielkie litery znajdują się na początku wiersza, słowo MacDonald i w EIEIO, więc może być bardziej interesujące, aby zrobić to dokładnie na pytanie.
Level River St

4
Czy produkcja jest akceptowalna, a oinkczy taka powinna być an oink?
ClickRick

4
@ rybo111: Czy zdawałeś sobie sprawę, że wielki Donald Knuth napisał artykuł naukowy na ten temat? Został opublikowany w prawdziwym czasopiśmie (co prawda w kwietniowym wydaniu). Więcej tutaj, w tym link do pliku PDF artykułu: en.wikipedia.org/wiki/The_Complexity_of_Songs
Tom Chantler

Odpowiedzi:


15

JavaScript ES6 - 204

Staraj się wpisać jak najmniej znaków w kodzie Unicode .

Nie krótszy, ale prawdopodobnie najbardziej zaciemniony.

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

Jeśli Twoja przeglądarka nie obsługuje 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)}

Kopiuj / wklej ten kod do konsoli przeglądarki i spróbuj f('cow','moo'), f('pig','oink'),f('sheep','baa')

Jak to działa ?

cto tablica 29 liter plus zwierzę i jego dźwięk (nazwijmy to naszym alfabetem ).
Zatem wszystkie 31 znaków mieści się w 5 bitach (2 ^ 5 = 32).
Znak Unicode ma długość 16 bitów, więc może zakodować 3 znaki naszego alfabetu za pomocą bitu wypełniającego.
Pełny tekst z nowymi wierszami to 186 znaków naszego alfabetu , można go zakodować przy pomocy 62 znaków Unicode.

Na przykład Oldjest zakodowany w następujący sposób:

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

Jeśli masz problemy z odczytaniem niektórych znaków Unicode, zainstaluj czcionkę Code2000


2
"cow"i "moo"mają być parametrami funkcji. Pozwalając wywołującemu przekazać tablicę, zapisujesz znaki w definicji funkcji kosztem dodania do liczby znaków kodu wywołującego. Pachnie mi to oszustwem. Biorąc to podejście do skrajności, możesz zdefiniować function f(a){alert(a)}(23 znaki) i powiedzieć, że należy go nazwać jak f("Old MacDonald had a ...").
tobyink

1
Przekazałem ciągi w dwóch oddzielnych parametrach, ale po przeczytaniu wyzwania nie widziałem powodu, aby nie przekazywać ciągów w formacie tablicowym, więc zredagowałem swoją odpowiedź. To nie jest oszustwo, wystarczy zaoszczędzić kilka znaków, jeśli to możliwe. Niech @ rybo111 zdecyduje, czy pasuje to do reguły, czy nie.
Michael M.

1
@tobyink Użyłem w regułach terminu „ciąg” (nie tablica), więc przypuszczam, że masz rację. Myślę jednak, że „oszustwo” jest nieco surowe!
rybo111

2
Dlaczego ma tyle głosów? To ponad 200 i nawet najkrótsze rozwiązanie JavaScript.
aditsu

Cóż, dobrze i dobrze wyjaśnione, też mam mój głos
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;

Sposób użycia: "cow""moo"F
Dla GolfScript zastąpić '|z "|"oraz Az10

Wyjaśnienie:

Kluczową częścią jest A,{`/\*}/:
A,{...}/wykonuje blok dla każdej liczby od 0 do 9 (A = 10)
`konwertuje liczbę na ciąg
/\*znaków zastępuje ciąg znaków: jeśli mamy na stosie, "bar" "foo 1 baz" "1"to /dzieli wynik w wyniku ["foo " " baz"], \zamienia tę tablicę na poprzedni element („bar”) i *dołącza do tablicy, co powoduje"foo bar baz"

Zatem kod zastępuje każdą liczbę w ciągu głównym ciągiem, który wcześniej znajdował się na stosie. Mamy zwierzę i dźwięk, potem „miał”, „a” itd., Wreszcie „EIEIO” i główny ciąg „10, ...!”. Aby uniknąć używania zbyt wielu cudzysłowów, umieściłem wszystkie ciągi (oprócz parametrów) w jednym ciągu, a następnie podzieliłem go i zrzuciłem wynikową tablicę ( '|/~)

Główny ciąg przechodzi następujące transformacje:

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

wymienić "0"z ", 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!

wymienić "1"z "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!

wymienić "2"z "here", a następnie "3"z "68 8"etc.

8 odpowiada dźwiękowi, a 9 zwierzęciu.


Czy możesz to wyjaśnić? Nie wiem nawet, czym jest CJam
Cruncher

@Cruncher CJam to język, który stworzyłem, sf.net/p/cjam ; Mogę to wyjaśnić, kiedy skończę grać w golfa :)
aditsu

1
@Cruncher dodał teraz wyjaśnienie
aditsu

9
On i na tych pięciu on sev'n six nine, ze eee ro ♬
aditsu

Czy może E-I-być ciąg, który jest następnie powtarzany? :)
rybo111

5

Bash + iconv, 128 znaków Unicode

Pobiera poniższą treść funkcji pure-bash / ascii i koduje wstecznie w znakach Unicode:

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

Definiuje funkcję powłoki m. Zadzwoń jako:

Kucyk rżnięty
Stary MacDonald miał farmę, EIEIO,
A na tej farmie miał kucyka, EIEIO,
Z sąsiadem tutaj i sąsiadem,
Tutaj sąsiedzi, sąsiedzi, wszędzie sąsiedzi,
Stary MacDonald miał farmę, EIEIO!
$ 

Pure Bash, 171 bajtów (tylko ascii)

Myślę, że warto zauważyć, że oryginalny wiersz (z „krową” i „muczeniem”) ma tylko 203 znaki.

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

Definiuje funkcję powłoki m. Zadzwoń jako:

$ ba owiec
Stary MacDonald miał farmę, EIEIO,
A na tej farmie miał owcę, EIEIO,
Z baa baa tutaj i baa baa tam,
Tu baa, tam baa, wszędzie baa baa,
Stary MacDonald miał farmę, EIEIO!
$

4

C ++ (403)

Dobra, to trochę długa szansa, ale kto nie lubi przesadnego definiowania?

#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;
Prokurent

Jakieś definicje, które mogłyby dodatkowo spakować to ciaśniej?
einsteinsci

1
Kiedyś było to możliwe, #define X definea następnie używać #X Y Z. Niestety te mocne dni
IOCCC

Co powiesz na używanie +zamiast <<? Lub za pomocą char*zamiast string? // Tylko jeden z nich może być używany jednocześnie.
Qwertiy

2

Python, 116 znaków Unicode

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

StackOverflow zjada jednak moje znaki specjalne, więc oto plik w base64:

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

Dane są pakowane przy użyciu zlib, który skutecznie koduje powtarzające się ciągi znaków (zlib jest ogólnie dobry w kompresji tekstu). Aby skorzystać z reguły „znaków Unicode”, 121-bajtowa porcja zlib jest wypełniana i zmniejszana o połowę do 61-znakowego ciągu Unicode, interpretując bajtowanie jako UTF-16.

Wywołaj funkcję jako

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

Fajnie, ale gdzie krowa i muczenie są ciągami w parametrach funkcji i jako takie można je zmienić na przykład na świnię i oink lub owcę i baa . Wygląda na to, że twoje wyjście jest zakodowane na stałe w krowie / muczeniu.
Cyfrowa trauma

@DigitalTrauma: Moje czytanie ze zrozumieniem kończy się niepowodzeniem! Naprawiony.
nneonneo

to lepiej :) +1
Cyfrowa trauma

115 . Nie trzeba liczyć końcowego znaku nowej linii.
nyuszika7h

@ nyuszika7h Nie, to 116. Na początku zapomniałeś policzyć „UTF-8 BOM” (EF BB BF), co jest konieczne, aby Python 2 mógł zaakceptować źródło inne niż ASCII. (To nie jest Python 3, który nie ma .decode('zip').)
Anders Kaseorg 30.04.16

1

Python, 217

Tak naprawdę nie można tak bardzo grać w golfa. Właśnie wyjąłem rażące powtórzenie z przodu i ...

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

Zrobił to z JSCrush ... to nie jest prawdziwa odpowiedź, po prostu ciekawie byłoby zobaczyć, czy ktoś może pokonać to w głównym nurcie języka. ( EDYCJA : 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+"!");}

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

Dalsza optymalizacja jest zdecydowanie możliwa.


Możesz użyć printf
aditsu

Trevin Avery zasugerował tę edycję: Java - 243 - void String ... a) {String c = "a" + a [1], d = c + "" + a [1], e = ", EIEIO", f = „Stary MacDonald miał farmę” + e; System.out.print (f + ”, \ nA na tej farmie miał„ + a [0] + e + ”, \ nZ„ + d + ”tutaj i„ + d + ”tam , \ nTutaj "+ c +", tam "+ c +" ', wszędzie "+ d +", \ n "+ f +"! ");} Dalsza optymalizacja jest zdecydowanie możliwa
Justin

1

Perl 5 (UTF-8) - 131 znaków, 313 bajtów

Poniższy skrypt należy zapisać jako UTF-8 bez BOM.

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

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

Perl musi być uruchomiony z -M5.010flagą, aby włączyć funkcje Perla 5.10. ( To jest dozwolone .)

Podoba mi się symetria liczby znaków (131) i liczby bajtów (313). To bardzo yin i yang.

Perl 5 (ASCII) - 181 znaków, 181 bajtów

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

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

Ponownie, perl musi być uruchomiony z -M5.010flagą, aby włączyć funkcje Perla 5.10.



Właściwie codegolf.stackexchange.com/a/26628/12469 był moim punktem wyjścia. Przetestowałem kilka dodatkowych zmiennych, które dodatkowo skróciły długość, a następnie zastosowałem sztuczkę UTF16, z której korzysta kilka innych implementacji.
tobyink

1

CJam (nie ASCII) - 77 znaków

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

Stosowanie: "cow""moo"F

Ciąg jest moim innym rozwiązaniem CJam przekonwertowanym z bazy 127 na bazę 56000.
Może być wymagane ustawienie regionalne UTF-8.

Przy okazji, teraz możesz wypróbować to online na http://cjam.aditsu.net/


1

JavaScript: 152 znaki / ES6: 149 znaków

Oto funkcja JS o nazwie „z”, która wykonuje zadanie w 214 znakach. (nie wykonuj tego!)

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

„Spakowałem” go do znaków Unicode przy użyciu techniki stworzonej przez @subzey i I dla 140byt.es).

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

wykonaj ten ostatni fragment, a następnie wywołaj z("cow","moo"), a otrzymasz następujący ciąg:

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

Więcej informacji tutaj: http://xem.github.io/golfing/en.html#compress

Wersja ES6:

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

Myślę, że nie skopiowałeś / wkleiłeś rzeczy poprawnie, twój kod wydaje się mieć ponad 250 znaków - ups, może nie, ale mój edytor tekstu zachowuje się dziwnie, zbadam.
aditsu

Och, większość twoich postaci pochodzi z niektórych planet astralnych (prawdopodobnie dlatego są one tutaj liczone jako 2 postacie) ... i również nieprzydzielone. To trochę rozciąga zasady :)
aditsu

Cóż, nie sądzę, że to oszustwo: te symbole są znakami Unicode i nie powinny być liczone jako 2 znaki. Ponadto Twitter liczy każdy z nich jako 1 znak. Jeśli skopiujesz wersję ES6 w tweecie, będzie ona oznaczać, że jest za długa o 9 znaków. A więc 149 to :)
xem

1

C # - 339 bajtów

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

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

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

Nie golfił

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

Definiując c=b.." "..b, mogę zapisać kilkanaście znaków. Określając to, dco robię, zapisuję 23 znaki. Nie rozumiem już, jak mogę to skrócić. Nazywa się to 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];}

Nadużywając lambda, umieściłem zamienniki w LinkedhashMap, aby utrzymać je w określonej kolejności, a następnie użyłem lambda foreach do zastąpienia klucza wartością w głównym ciągu. parametry są dodawane jako ostatnie 2 zamienniki na mapie. argumentem varargs jest golenie niektórych bajtów w nagłówku metody

Wersja bez golfa:

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

Nazwany przez

f('cow', 'moo');

0

Czysty C, 298 bajtów, bez Unicode

W mojej funkcji biorę pojedynczy argument, który w rzeczywistości char*jest spakowany. Każdy ciąg jest zakończony zerem, a na końcu znajduje się dodatkowy terminator. To pozwala mi sprawdzać strlen(a)na końcu każdej pętli, zamiast utrzymywać zmienną licznika.

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

Wynik:

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

Nawet w przypadku języka z wieloma liniowaniami i ścisłymi zasadami wcięć Cobra nadal radzi sobie całkiem nieźle.


0

C: 224 bajty

Korzystając z printf dokładności , możemy użyć tego samego łańcucha, jak zarówno łańcucha formatu printf, jak i dwóch parametrów.

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

Z białą spacją i ciągiem podzielonym na linie:

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 znaków, 272 bajtów

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

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

Parametry z @#%^<>&*(awarią wyjścia.


0

Haskell (282 i wciąż nieco czytelny :))

wc -c oldmacdonald.hs
     282 oldmacdonald.hs

Plik:

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

To 281, zwykle nie liczy się końcowego znaku nowej linii, chyba że jest to makro preprocesora C lub coś innego, co wymaga zakończenia nowej linii. W większości przypadków możesz po prostu odjąć 1 od liczby bajtów zwróconych przez wc -c, ale wolę używać mothereff.in/byte-counter i upewniać się , że na końcu nie ma pustej linii, chyba że jest to wymagane do działania programu.
nyuszika7h

0

ES6, 2 rozwiązania z 179 186 znaków bez żadnego 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]))

I drugi:

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

Dodałem połączenie alarmowe (+7 znaków).


Myślę, że na razie jest to najkrótsze rozwiązanie spośród tych, które nie są jednorożcami.
Qwertiy

0

JavaScript (E6) 140 znaków

Licznik znaków : https://mothereff.in/byte-counter , 140 znaków, 425 bajtów w UTF-8

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

Oryginalny kod ASCII 188 bajtów

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

Skompresowany za pomocą http://xem.github.io/obfuscatweet/

Przetestuj w konsoli FireFox / FireBug

f('mosquito','zzz')

Wynik

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!
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.