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 cow
i moo
są ciągami w parametrach funkcji i jako takie można je zmienić na pig
i oink
lub sheep
i 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.
code-golf
kolmogorov-complexity
function
rybo111
źródło
źródło
echoes the following
. Czy masz na myśli, że funkcja powinna go wydrukować lub zwrócić?a oink
czy taka powinna byćan oink
?Odpowiedzi:
JavaScript ES6 - 204
Nie krótszy, ale prawdopodobnie najbardziej zaciemniony.
Jeśli Twoja przeglądarka nie obsługuje ES6:
Kopiuj / wklej ten kod do konsoli przeglądarki i spróbuj
f('cow','moo')
,f('pig','oink')
,f('sheep','baa')
Jak to działa ?
c
to 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
Old
jest zakodowany w następujący sposób:Jeśli masz problemy z odczytaniem niektórych znaków Unicode, zainstaluj czcionkę Code2000
źródło
"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ć jakf("Old MacDonald had a ...")
.CJam - 142 / GolfScript - 144
Sposób użycia:
"cow""moo"F
Dla GolfScript zastąpić
'|
z"|"
orazA
z10
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:
wymienić
"0"
z", E-I-E-I-O"
:wymienić
"1"
z"Old MacDonald765"
:wymienić
"2"
z"here"
, a następnie"3"
z"68 8"
etc.8 odpowiada dźwiękowi, a 9 zwierzęciu.
źródło
E-I-
być ciąg, który jest następnie powtarzany? :)Bash + iconv, 128 znaków Unicode
Pobiera poniższą treść funkcji pure-bash / ascii i koduje wstecznie w znakach Unicode:
Definiuje funkcję powłoki
m
. Zadzwoń jako:Pure Bash, 171 bajtów (tylko ascii)
Myślę, że warto zauważyć, że oryginalny wiersz (z „krową” i „muczeniem”) ma tylko 203 znaki.
Definiuje funkcję powłoki
m
. Zadzwoń jako:źródło
C ++ (403)
Dobra, to trochę długa szansa, ale kto nie lubi przesadnego definiowania?
źródło
#define X define
a następnie używać#X Y Z
. Niestety te mocne dni+
zamiast<<
? Lub za pomocąchar*
zamiaststring
? // Tylko jeden z nich może być używany jednocześnie.Python, 116 znaków Unicode
StackOverflow zjada jednak moje znaki specjalne, więc oto plik w base64:
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
źródło
.decode('zip')
.)Python, 217
Tak naprawdę nie można tak bardzo grać w golfa. Właśnie wyjąłem rażące powtórzenie z przodu i ...
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)
źródło
Java, 246
Stosowanie:
f(new String[]{"cow","moo"});
źródło
Java -
262258Dalsza optymalizacja jest zdecydowanie możliwa.
źródło
Perl 5 (UTF-8) - 131 znaków, 313 bajtów
Poniższy skrypt należy zapisać jako UTF-8 bez BOM.
Stosowanie:
f("cow", "moo");
.Perl musi być uruchomiony z
-M5.010
flagą, 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
Stosowanie:
f("cow", "moo");
.Ponownie, perl musi być uruchomiony z
-M5.010
flagą, aby włączyć funkcje Perla 5.10.źródło
CJam (nie ASCII) - 77 znaków
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/
źródło
JavaScript: 152 znaki / ES6: 149 znaków
Oto funkcja JS o nazwie „z”, która wykonuje zadanie w 214 znakach. (nie wykonuj tego!)
„Spakowałem” go do znaków Unicode przy użyciu techniki stworzonej przez @subzey i I dla 140byt.es).
wykonaj ten ostatni fragment, a następnie wywołaj
z("cow","moo")
, a otrzymasz następujący ciąg:Więcej informacji tutaj: http://xem.github.io/golfing/en.html#compress
Wersja ES6:
źródło
C # - 339 bajtów
Stosowanie:
x("cow","moo");
źródło
Rebol,
206202Stosowanie:
f "cow" "moo"
źródło
Delphi XE3 (
272252)Nie golfił
źródło
Lua 237
Definiując
c=b.." "..b
, mogę zapisać kilkanaście znaków. Określając to,d
co robię, zapisuję 23 znaki. Nie rozumiem już, jak mogę to skrócić. Nazywa się to viaf("<animal>","<sound>")
.źródło
Java 8 (411)
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:
źródło
JavaScript 220
Nazwany przez
źródło
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:
main.c:
Wynik:
źródło
Kobra - 203
Nawet w przypadku języka z wieloma liniowaniami i ścisłymi zasadami wcięć Cobra nadal radzi sobie całkiem nieźle.
źródło
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.
Z białą spacją i ciągiem podzielonym na linie:
źródło
PHP - 272 znaków, 272 bajtów
Stosowanie:
m("cow", "moo");
,m("fox", "Hatee-hatee-hatee-ho");
Parametry z
@#%^<>&*(
awarią wyjścia.źródło
Haskell (282 i wciąż nieco czytelny :))
Plik:
źródło
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.ES6, 2 rozwiązania z
179186 znaków bez żadnego UnicodeI drugi:
Dodałem połączenie alarmowe (+7 znaków).
źródło
JavaScript (E6) 140 znaków
Licznik znaków : https://mothereff.in/byte-counter , 140 znaków, 425 bajtów w UTF-8
Oryginalny kod ASCII 188 bajtów
Skompresowany za pomocą http://xem.github.io/obfuscatweet/
Przetestuj w konsoli FireFox / FireBug
Wynik
źródło