Erstellen Sie eine Funktion in der von Ihnen gewählten Sprache, die Folgendes ausgibt:
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!
Wo cow
und moo
sind Zeichenfolgen in den Funktionsparametern und als solche können zum Beispiel in pig
und oink
oder sheep
und geändert werden baa
.
Dabei sollten Großbuchstaben, Bindestriche, Satzzeichen, Leerzeichen und Zeilenumbrüche berücksichtigt werden.
Geben Sie möglichst wenige Unicode-Zeichen in Ihren Code ein.
code-golf
kolmogorov-complexity
function
rybo111
quelle
quelle
echoes the following
. Meinen Sie damit, dass die Funktion es ausdrucken oder zurücksenden soll?a oink
oder sollte das gemacht werdenan oink
?Antworten:
Javascript ES6 - 204
Nicht der kürzere, aber wahrscheinlich der am meisten verschleierte.
Wenn Ihr Browser ES6 nicht unterstützt:
Kopieren / Einfügen , dass Code in Ihre Browser - Konsole und versuchen
f('cow','moo')
,f('pig','oink')
,f('sheep','baa')
Wie es funktioniert ?
c
besteht aus 29 Buchstaben plus dem Tier und seinem Klang (nennen wir dies unser Alphabet ).Alle 31 Zeichen passen also in 5 Bits (2 ^ 5 = 32).
Ein Unicode-Zeichen ist 16 Bit lang, sodass 3 Zeichen unseres Alphabets mit einem Füllbit codiert werden können .
Der vollständige Text mit den neuen Zeilen besteht aus 186 Zeichen unseres Alphabets und kann mit 62 Unicode-Zeichen codiert werden.
Beispielsweise,
Old
ist wie folgt codiert:Wenn Sie Probleme beim Lesen einiger Unicode-Zeichen haben, installieren Sie die Schriftart Code2000
quelle
"cow"
und"moo"
sollen die Funktionsparameter sein. Indem Sie den Aufrufer veranlassen, ein Array zu übergeben, sparen Sie Zeichen in der Funktionsdefinition auf Kosten der Zeichenanzahl des aufrufenden Codes. Das riecht für mich nach Betrug. Wenn Sie diesen Ansatz auf das Äußerste bringen, könnten Sie definierenfunction f(a){alert(a)}
(23 Zeichen) und sagen, dass er wie folgt aufgerufen werden mussf("Old MacDonald had a ...")
.CJam - 142 / GolfScript - 144
Verwendung:
"cow""moo"F
Für GolfScript ersetzen Sie
'|
mit"|"
undA
mit10
Erläuterung:
Der Schlüsselteil ist
A,{`/\*}/
:A,{...}/
Führt den Block für jede Zahl von 0 bis 9 aus (A = 10)`
Konvertiert die Zahl in eine Zeichenfolge/\*
Ersetzt eine Zeichenfolge: Wenn wir auf dem Stapel haben,"bar" "foo 1 baz" "1"
dann/
teilt die Zeichenfolge das Ergebnis auf["foo " " baz"]
,\
tauscht dieses Array mit dem vorherigen Element ("bar") und*
schließt sich dem Array an, woraus sich ergibt"foo bar baz"
Der Code ersetzt also jede Zahl in der Hauptzeichenfolge durch eine Zeichenfolge, die sich zuvor auf dem Stapel befunden hat. Wir haben das Tier und den Ton, dann "hatten", "ein" usw. und schließlich ", EIEIO" und die Hauptsaite "10, ...!". Um zu vermeiden, dass zu viele Anführungszeichen verwendet werden, füge ich alle Zeichenfolgen (außer den Parametern) in eine Zeichenfolge ein, teile sie dann auf und lösche das resultierende Array (
'|/~
).Die Hauptzeichenfolge durchläuft die folgenden Transformationen:
ersetzen
"0"
durch", E-I-E-I-O"
:ersetzen
"1"
durch"Old MacDonald765"
:ersetzen
"2"
mit"here"
, dann"3"
mit"68 8"
etc.8 entspricht dem Ton und 9 dem Tier.
quelle
E-I-
eine Zeichenfolge sein, die dann wiederholt wird? :)Bash + Symbolv, 128 Unicode-Zeichen
Nimmt den folgenden Rumpf der Funktion pure-bash / ascii und wandelt ihn in Unicode-Zeichen um:
Definiert eine Shell-Funktion
m
. Anrufen als:Pure Bash, 171 Bytes (nur ASCII)
Ich denke, es ist erwähnenswert, dass der ursprüngliche Vers (mit "cow" und "moo") nur 203 Zeichen enthält.
Definiert die Shell-Funktion
m
. Anrufen als:quelle
C ++ (403)
Okay, das ist ein bisschen langwierig, aber wer mag es nicht, übermäßig zu definieren?
quelle
#define X define
und dann zu verwenden#X Y Z
. Leider sind diese berauschenden IOCCC-Tage längst vorbei ...+
statt<<
? Oder mitchar*
stattstring
? // Nur einer von diesen kann gleichzeitig verwendet werden.Python, 116 Unicode-Zeichen
StackOverflow frisst meine Sonderzeichen, also hier die Datei in base64:
Die Daten werden mit zlib gepackt, wodurch sich wiederholende Zeichenfolgen effizient codiert werden (zlib kann Text im Allgemeinen gut komprimieren). Um die "Unicode-Zeichen" -Regel zu nutzen, wird der 121-Byte-Zlib-Block aufgefüllt und in eine 61-Zeichen-Unicode-Zeichenfolge halbiert, indem der Bytestring als UTF-16 interpretiert wird.
Rufen Sie die Funktion auf als
quelle
.decode('zip')
.)Python, 217
So viel kann man nicht golfen. Ich habe gerade die offensichtliche Front-End-Wiederholung rausgenommen und ...
Javascript, 241 - JSCrush betrügen
Das mit JSCrush gemacht ... keine echte Antwort, es wäre nur interessant zu sehen, ob jemand dies in einer Mainstream-Sprache schlagen kann. ( EDIT : äh)
quelle
Java, 246
Verwendung:
f(new String[]{"cow","moo"});
quelle
Java -
262258Eine weitere Optimierung ist definitiv möglich.
quelle
Perl 5 (UTF-8) - 131 Zeichen, 313 Byte
Das folgende Skript muss als UTF-8 ohne Stückliste gespeichert werden.
Verbrauch:
f("cow", "moo");
.Perl muss mit dem
-M5.010
Flag ausgeführt worden sein, um die Perl 5.10-Funktionen zu aktivieren. ( Dies ist erlaubt .)Mir gefällt die Symmetrie zwischen der Anzahl der Zeichen (131) und der Anzahl der Bytes (313) sehr gut. Es ist sehr yin und yang.
Perl 5 (ASCII) - 181 Zeichen, 181 Bytes
Verbrauch:
f("cow", "moo");
.Auch hier muss Perl mit dem
-M5.010
Flag ausgeführt werden, um die Perl 5.10-Funktionen zu aktivieren.quelle
CJam (Nicht-ASCII) - 77 Zeichen
Verwendung:
"cow""moo"F
Die Zeichenfolge ist meine andere CJam-Lösung, die von Basis 127 auf Basis 56000 konvertiert wurde.
ein UTF-8-Gebietsschema erforderlich.
Übrigens können Sie dies jetzt online unter http://cjam.aditsu.net/ ausprobieren.
quelle
JavaScript: 152 Zeichen / ES6: 149 Zeichen
Hier ist eine JS-Funktion namens "z", die den Job in 214 Zeichen erledigt. (nicht ausführen!)
Ich habe es in Unicode-Zeichen "gepackt" (mit einer Technik, die von @subzey und mir für 140Byte erstellt wurde).
Führen Sie das letzte Snippet aus und rufen
z("cow","moo")
Sie dann auf. Sie erhalten dann die folgende Zeichenfolge:Mehr Infos hier: http://xem.github.io/golfing/en.html#compress
ES6-Version:
quelle
C # - 339 Bytes
Verwendung:
x("cow","moo");
quelle
Rebol,
206202Verwendung:
f "cow" "moo"
quelle
Delphi XE3 (
272252)Ungolfed
quelle
Lua 237
Durch die Definition
c=b.." "..b
kann ich ein Dutzend Zeichen speichern. Durch das Definierend
wie ich, spare ich 23 Zeichen. Ich sehe nicht mehr ein, wie ich das verkürzen kann. Dies wird über aufgerufenf("<animal>","<sound>")
.quelle
Java 8 (411)
Durch den Missbrauch von Lambda wurden die Ersetzungen in eine LinkedhashMap eingefügt, um sie in einer definierten Reihenfolge zu halten. Anschließend wurde mit foreach Lambda der Schlüssel durch den Wert in der Hauptzeichenfolge ersetzt. Parameter werden als die letzten 2 Ersetzungen in der Karte hinzugefügt. Dieses varargs-Argument soll einige Bytes im Methodenkopf entfernen
Ungolfed-Version:
quelle
JavaScript 220
Angerufen von
quelle
Pure C, 298 Bytes, kein Unicode
In meiner Funktion nehme ich ein einziges Argument, das eigentlich ein Haufen
char*
zusammengepackt ist. Jede Zeichenfolge ist nullterminiert und am Ende befindet sich ein zusätzlicher Nullterminator. Dies ermöglicht mir zu überprüfenstrlen(a)
am Ende jeder Schleife , anstatt eine Zählervariable zu behalten.mcdonald.c:
Haupt c:
Ausgabe:
quelle
Cobra - 203
Selbst für eine Sprache mit wenigen bis gar keinen Mehrfachausdrücken und strengen Einrückungsregeln ist Cobra noch recht gut.
quelle
C: 224 Bytes
Mithilfe des printf- Präzisionsspezifizierers können wir dieselbe Zeichenfolge wie die printf-Formatzeichenfolge und zwei der Parameter verwenden.
Mit Leerzeichen und in Zeilen aufgeteilter Zeichenfolge:
quelle
PHP - 272 Zeichen, 272 Bytes
Verbrauch:
m("cow", "moo");
,m("fox", "Hatee-hatee-hatee-ho");
Parameter mit
@#%^<>&*(
Absturz der Ausgabe.quelle
Haskell (282 und immer noch etwas lesbar :))
Die Datei:
quelle
wc -c
Ich bevorzuge jedoch die Verwendung von mothereff.in/byte-counter und stelle sicher, dass am Ende keine Leerzeile steht, es sei denn, das Programm funktioniert.ES6, 2 Lösungen von
179186 Zeichen ohne UnicodeUnd der zweite:
Ich habe einen Benachrichtigungsanruf hinzugefügt (+7 Zeichen).
quelle
JavaScript (E6) 140 Zeichen
Zeichenzähler: https://mothereff.in/byte-counter , 140 Zeichen, 425 Byte in UTF-8
Ursprünglicher ASCII-Code 188 Bytes
Komprimiert mit http://xem.github.io/obfuscatweet/
Test in der FireFox / FireBug-Konsole
Ausgabe
quelle