Wie wir alle wissen, ist die Zelda-Serie eine der besten, die jemals gemacht wurden. Lassen Sie uns zu Ehren ein paar Lieder auf der Okarina spielen.
Herausforderung:
Schreiben Sie ein Programm, das bei gegebenem Song die Partitur für diesen bestimmten Song als Standard ausgibt.
Eingang:
Das Lied, dessen Punktzahl Sie ausgeben müssen, wird durch eine eindeutige Kombination von drei Zeichen angegeben, wie unten dargestellt:
zel - Zelda's Lullaby
sas - Saria's Song
eps - Epona's Song
sos - Sun's Song
sot - Song of Time
sst - Song of Storms
Bonus Songs, jeweils -7%:
mof - Minuet of Forest
bof - Bolero of Fire
sow - Serenade of Water
nos - Nocturne of Shadow
ros - Requiem of Spirit
pol - Prelude of Light
Bonussong 2, -8%:
scs - Scarecrow's song
Wie wir alle wissen, ist das Lied der Vogelscheuche ein Lied, das Sie selbst komponieren. Dieses Lied muss acht Noten haben. Geben Sie eine Partitur aus, die Sie selbst zusammengestellt haben und die sich von allen anderen Partituren unterscheidet.
Wenn Sie sich dazu entschließen, alle Songs einzuschließen, erhalten Sie einen Bonus von -50% auf Ihre Byte-Punktzahl.
Ausgabe:
Die Anmerkungen in der Ausgabe werden durch die folgenden Zeichen symbolisiert:
^
<
>
V
A
Geben Sie eine Partitur im folgenden Format aus:
-^-^-^-^-^-^-^-^-
-<-<-<-<-<-<-<-<-
->->->->->->->->-
-V-V-V-V-V-V-V-V-
-A-A-A-A-A-A-A-A-
Es ist nur eine Note pro Spalte zulässig. Der Einfachheit halber habe ich eine weitere Zeile zu den ursprünglichen vier Zeilen hinzugefügt.
Jede Note entspricht einer anderen Zeile:
^: ----------------
<: ----------------
>: ----------------
V: ----------------
A: ----------------
Die Ausgabe wird auf stdout geschrieben. Nachgestellte Zeilenumbrüche sind zulässig.
Beispiele:
Input (Zeldas Wiegenlied):
zel
Ausgabe:
---^-----^-------
-<-----<---------
----->----->-----
-----------------
-----------------
Eingabe (Bolero of Fire):
bof
Ausgabe:
-----------------
-----------------
--------->--->---
-V---V-----V---V-
---A---A---------
Hinweis Spickzettel:
zel
<^><^>
sas
V><V><
eps
^<>^<>
sos
>V^>V^
sot
>AV>AV
sst
AV^AV^
mof
A^<><>
bof
VAVA>V>V
sow
AV>><
nos
<>>A<>V
ros
AVA>VA
pol
^>^><^
Da wir den Ocarina Code Golf spielen, gewinnt das kürzeste Programm in Bytes!
Song Referenzen:
http://www.thonky.com/ocarina-of-time/ocarina-songs
http://www.zeldadungeon.net/Zelda05-ocarina-of-time-ocarina-songs.php
v
würden besser aussehen.Antworten:
Pyth, 56,5 (113 Bytes - 6 × 7% - 8%)
Es enthält nicht druckbare Zeichen, daher hier ein umkehrbarer
xxd
Hexdump:Sie können es auch online ausprobieren .
Erläuterung
Ich speichere die Songs in Basis-6-Zahlen, umkodiert in Basis 1391423 und dann Basis 256, um Platz zu sparen. Ich musste Base 6 wählen, da einige der Songs mit beginnen
^
und Zahlen nach dem Decodieren nicht wirklich mit einer 0 beginnen können.quelle
Funktion , 4322 - 50% = 2161
Ich versuche hier nicht wirklich Golf zu spielen. Mehr auf den Beauty-Aspekt setzen. Ich denke, das Hauptprogramm sieht wirklich gut aus, eine perfekte rechteckige Box, die rechts versteckt ist.
Wie immer können Sie ein besseres Rendering erzielen, indem Sie es
$('pre').css('line-height',1)
in Ihrer Browserkonsole ausführen .Fortsetzung in der Tradition Funciton Funktionen Namen geben , bestehend aus einem einzigen, merkwürdig, selten verwendeten Unicode - Zeichen, dachte ich darüber nach, was am besten diese Herausforderung darstellen könnte, und es fiel mich ein, dass Link - und Zelda (oder, wenn Sie wollen, Legend of Zelda ) geben Sie LZ , so dass der Kleinbuchstabe ʫ (U + 02AB, ʟᴀᴛɪɴ sʟᴀᴛɪɴ ʟᴇᴛᴛᴇʀ ʟᴇᴛᴛᴇʀ ʟᴢ) angemessen erscheint.
Erläuterung
Wie im esolangs-Artikel erläutert, empfängt das Funciton-Programm die Eingabe in der Codierung "UTF-21", jedoch als einzelne humongous Ganzzahl. Wenn ich diese Zahl als Schlüssel für eine Hashmap (Wörterbuch, assoziatives Array) verwenden wollte, bräuchte ich eine Hash-Funktion, die zwei Kriterien erfüllt: eine, die in Funciton einfach zu implementieren ist, und zwei, die alle 13 erwarteten Eingabezeichenfolgen geben einen anderen Hash-Wert. Die einfachste Hash-Funktion, die ich mir vorstellen konnte, war
input % m
für einen bestimmten Wert vonm
. Daher habe ich versuchtm
= 13, 14, 15 usw., bis ich zu der kleinsten Ganzzahl kam, für die alle Hash-Werte eindeutig sind. Es stellte sich heraus, dass diese Zahl 25 ist.Die Hashwerte sind:
Wir kodieren jedes Lied, indem wir ein Bit das Vorhandensein oder Fehlen einer Note darstellen lassen. Zum Beispiel würde Zeldas Wiegenlied folgendermaßen codiert werden:
außer dass die Bits in der entgegengesetzten Reihenfolge sind; Die obere linke Zelle befindet sich im niedrigstwertigen Bit. Dies bedeutet, dass jedes Lied 40 Bits lang ist.
Wir erstellen daher eine (mäßig spärliche) Hash-Tabelle, indem wir eine 40 × 25 = 1000-Bit-Zahl nehmen und das Bitmuster für jedes Lied entsprechend seinem Hash-Wert an der richtigen Stelle platzieren. Die monströse Zahl im Programm ist genau diese Hash-Tabelle.
Die verbleibenden Zahlen bedeuten jeweils Folgendes:
45
=0x2D
ist der Unicode für-
.1257283645609482190214660190
: Dies ist die Zeichenfolge^<>VA
in UTF-21. Im Nachhinein hätte ich hier 7 Bits pro Zeichen verwenden können, was die Zahl kürzer machte, aber UTF-21 ist in Funciton so traditionell, dass es mir einfach nicht in den Sinn kam.2097151
=0x1FFFFF
= (1 << 21) - 1. Wird verwendet, um das erste Zeichen aus der obigen Zeichenfolge abzurufen.20971565
: Dies ist die Zeichenfolge-\n
, die an das Ende jeder Zeile angehängt wird.\n
Wert zufällig 10 ist. Diese letzte Zahl ist (10 << 21) + 45.Das Programm läuft nun wie folgt ab:
ʫ
mit den folgenden 3 Parametern auf:^<>VA
.ʫ
,-
, gefolgt von einem anderen,-
wenn es null ist, oder dem ersten Zeichen von c, andernfalls. Rechtsschiebe B durch eine ein Bit zu entfernen und dekrementieren a .-\n
, das erste Zeichen von c abgeschnitten und eine weitere Schleife mit a = 8 gestartet .quelle
Python 2, 143,5 (287 Byte - 50%)
Das Raster wird mit Bindestrichen generiert. dann indiziert und durch Notizen ersetzt.
quelle
j
indem Sie jedes Komma durch ein Leerzeichen ersetzen undsplit
ohne Argumente aufrufenrange
. Leider können Sie die innere Liste nicht einfach mit 5 multiplizieren, da sie alle dasselbe Objekt sind und das Ändern eines Objekts die anderen ändert: / Wir schlagen Perl (fürs Erste)!"<^><^>"
=> machst"<^>"*2
?scs="<"*8
Ich mag dein Vogelscheuchenlied nicht.Perl 5, 125 (
320260250 Bytes -6x7% Bonuslieder -8% Vogelscheuchenlied)Yay, endlich eine Gelegenheit, mit dieser perlischen Hash-Syntax zu experimentieren.
Prüfung
quelle
qw()
Syntax anstelle der fetten Kommas (%h=qw(zel <^><^> sas >'V><' ...)
um einige Bytes zu speichern@L
kann prägnanter als geschrieben werden@L=('-')x17
. Außerdem kann der Haupt-Hash als anonym belassen werden@B={qw(zel <^><^> ... scs <^V>>V^<)}->{$_}=~/./g
.Perl, 75 (150 Byte - 50%)
Zählt man den Shebang als 2, wird die Eingabe von stdin übernommen.
Beispielnutzung
quelle
Haskell, 344 - 50% = 172 Bytes
o
macht den Job.Ich dachte, ich könnte Python mit diesen Kodierungen schlagen (ich habe lange gebraucht.), Aber nein. Sie sparen noch nicht wirklich viele Bytes. Irgendwelche Vorschläge?
Ja, das ist ein Minus vor der Kodierung für
"ros"
. Das liegt daran, dass sein "Sheet" mit dem Zeichen endet, das0
in meiner Basis 5 bedeutet, da dieser negative Trick für die "einfachen Songs", die durch das Verdoppeln des Codierten codiert wurden, nicht funktionierts
. Es sei denn, Sie verwendenquot
möglicherweise, aber dann können Sie nichtp (-1)
speziell behandeln, daquot (-5) = 0
, damit die Negativität verschwinden würde. Wie auch immer.quelle
PHP: 130 Bytes (260
270279Bytes - 6 × 7% - 8%)Vielen Dank an Ismael Miguel und Blackhole für einige großartige Ideen, um mehr Bytes zu sparen!
Nach dem
print"-
ist dies eine wörtliche Einfügung eines Wagenrücklaufs. Es kann in Windows in zwei Bytes übersetzt werden.Alle Bonussongs, einschließlich des Songs der Vogelscheuche, sind enthalten.
Jedes Lied wird in sieben Byte Code dargestellt. Ich mag die neue Wertung, weil ich mit der alten Wertung insgesamt nur einen mageren Bonuspunkt gewonnen hätte!
Die jüngsten Änderungen lassen PHP eine Menge Warnungen generieren. Um die Dinge schön und aufgeräumt zu halten, werden diese an umgeleitet
/dev/null
.Speichern unter
zelda.php
und in der Befehlszeile ausführen:quelle
main.php
“?()
um($i-$c)
aufecho($i-$c)?'--':'-'.$z[$c-0];
. Auch Ihre Zeichenfolge in Ihremsplit
kann ohne verwendet werden'
. Und'/^'.$argv[1].'/'
kann geschrieben werden als"/^$argv[1]/"
Python 3 - 138,5 (
292280277 Byte - 50%)Rasiert ein paar Bytes vor dem aktuellen Python-Anführer, während die Print-as-you-go-Methode und nicht die Ersetzungsmethode ausgeführt wird.
Versuchen Sie es online
Lauf:
Ausgabe:
quelle
['--',c+'-'][s[x]==c]
anstelle der bedingtenRuby, Rev. 1, 192 - 50% = 96
Golfen beinhaltet:
Entfernen von Leerzeichen zwischen Buchstabengruppen in der magischen Zeichenfolge (und Überarbeitung des Nenners am Ende der Zeile bis
/4
). Entfernen von anderen unnötigen Leerzeichen.Umwandlung der Escape-Sequenzen in einzelne Zeichen (Stapelaustausch zeigt sie nicht an, also habe ich sie
?
als Platzhalter gesetzt)Neudefinition von
g
als eine einzelne Zeichenfolge mit fünf-
Folgen von 17, gefolgt von Zeilenumbrüchen, anstelle eines Arrays von fünf Folgen von 17-
Ruby, Rev. 0, 223 - 50% = 111,5 (ungolfed)
Der Eingabecode ist auf 2 Buchstaben reduziert. Beginnt es mit einem
s
, wird dass
gelöscht, beginnt es mit einem Buchstaben danachs
(gilt nur fürzel
den letzten Buchstaben, wird gelöscht, und beginnt es mit einem Buchstaben, bevors
der mittlere Buchstabe gelöscht wird.Die magische Zeichenfolge (die in der ungolfed-Version aus Gründen der Übersichtlichkeit Leerzeichen enthält) enthält die 2-Buchstaben-Codes, gefolgt von den Musikdaten. Es wird mit dem Übereinstimmungsoperator gesucht, der
=~
die Position in der Zeichenfolge zurückgibt.Es gibt genau ein Lied mit 5, 7 und 8 Noten (plus SCS mit 8 Noten). Diese werden zusammen mit einem beliebigen Lied mit 6 Noten
ros
am Anfang der magischen Zeichenfolge gebündelt, so dass der Wert vonn
gegeben ist Die Position in der Saite kann verwendet werden, um die Anzahl der zu spielenden Noten zu berechnen.cs
wird vorher eingedrücktbf
, und mit dem Abschneiden, wenn die Zahln
abgerundet wird, kommen wir einfach mit der korrekten Berechnung für beide davon. Nach dem vierten Cluster haben alle Songs 6 Noten. Wennn
also die Anzahl der Noten groß ist, wird sie auf den Standardwert von 6 reduziert.Ein Array von
-
wird für die Ausgabe eingerichtet und die Noten werden einzeln ersetzt. Die erforderlichen Musikdaten werden aus der Variablen extrahiert,$'
die den Teil der ursprünglichen magischen Zeichenfolge rechts von der Übereinstimmung enthält. Auf diese Weise werden irrelevante Daten ignoriert.Die Noten werden direkt nach dem entsprechenden 2-Buchstaben-Song-Code jeweils 3 Mal in die magische Zeichenfolge codiert. Sie werden durch Division durch extrahiert
5**(i%3)
und ein Zeichen ing
wird entsprechend aktualisiert. Am Ende des Programmsg
wird gedruckt.quelle
Python 2, 141,5 Bytes -50% (283 Bytes)
Speichert jede Note als Byte, da jede Zeile 8 Noten lang ist. Ruft die Binärdarstellung auf und wird dann durch die richtigen Zeichen ersetzt.
quelle
Lua, 249 Bytes - 50% = 124,5
Ziemlich einfach, liest nur Songs zurück, die als Basis-6-Zahlen codiert sind.
quelle