Comme nous le savons tous, la série Zelda est l’une des meilleures séries de jeux jamais réalisée. En l'honneur de cela, laissez-nous jouer quelques chansons sur l'ocarina.
Défi:
Ecrivez un programme qui, à partir d’une chanson, sort la partition sur la sortie standard de cette chanson.
Contribution:
La chanson dont vous devez sortir le score sera donnée par une combinaison unique de trois caractères, comme indiqué ci-dessous:
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 chansons, -7% chacune:
mof - Minuet of Forest
bof - Bolero of Fire
sow - Serenade of Water
nos - Nocturne of Shadow
ros - Requiem of Spirit
pol - Prelude of Light
Chanson en prime 2, -8%:
scs - Scarecrow's song
Comme nous le savons tous, la chanson de Scarecrow est une chanson que vous composez vous-même. Cette chanson doit avoir huit notes. Générez une partition que vous composez vous-même, qui est différente de toutes les autres partitions.
Si vous décidez d'inclure toutes les chansons, le total de vos octets sera de -50%.
Sortie:
Les notes de la sortie sont symbolisées par les caractères suivants:
^
<
>
V
A
Produire un score au format suivant:
-^-^-^-^-^-^-^-^-
-<-<-<-<-<-<-<-<-
->->->->->->->->-
-V-V-V-V-V-V-V-V-
-A-A-A-A-A-A-A-A-
Une seule note par colonne est autorisée. Par souci de simplicité, j'ai ajouté une autre ligne aux quatre lignes d'origine.
Chaque note correspond à une ligne différente:
^: ----------------
<: ----------------
>: ----------------
V: ----------------
A: ----------------
La sortie doit être écrite sur stdout. Les retours à la ligne sont autorisés.
Exemples:
Entrée (berceuse de Zelda):
zel
Sortie:
---^-----^-------
-<-----<---------
----->----->-----
-----------------
-----------------
Entrée (Bolero de feu):
bof
Sortie:
-----------------
-----------------
--------->--->---
-V---V-----V---V-
---A---A---------
Remarquez la feuille de triche:
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
^>^><^
Depuis que nous jouons au golf de code ocarina , le programme le plus court en octets gagne!
Références de chansons:
http://www.thonky.com/ocarina-of-time/ocarina-songs
http://www.zeldadungeon.net/Zelda05-ocarina-of-time-ocarina-songs.php
v
seraient mieux.Réponses:
Pyth, 56,5 (113 octets - 6 × 7% - 8%)
Il contient des caractères non imprimables, voici donc un
xxd
hexdump réversible :Vous pouvez également l' essayer en ligne .
Explication
Je stocke les morceaux dans des nombres en base 6, ré-encodés en base 1391423, puis en base 256 pour économiser de l'espace. J'ai dû choisir la base 6 car certaines chansons commencent par
^
, et les chiffres ne peuvent pas vraiment commencer par un 0 après le décodage.la source
Funciton , 4322 - 50% = 2161
Pas vraiment essayer de jouer au golf ici. Aller plus pour l'angle de beauté. Je pense que le programme principal a l'air vraiment soigné, une boîte rectangulaire parfaite cachée à droite.
Comme toujours, vous pouvez obtenir un meilleur rendu en vous exécutant
$('pre').css('line-height',1)
dans la console de votre navigateur.Poursuivant dans la tradition de donner des noms de fonctions funciton consistant en un seul, étrange, rarement utilisé caractère Unicode, je pensais à ce que pourrait mieux représenter ce défi, et il me est apparu que Lien et Zelda (ou, si vous voulez, Légende de Zelda ) vous donne LZ , le digraphe minuscule ʫ (U + 02AB, sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ʟᴢ) semble donc approprié.
Explication
Comme expliqué dans l'article d'esolangs, le programme Funciton reçoit l'entrée encodée comme ce que j'appellerais «UTF-21», mais sous la forme d'un entier unique et gigantesque. Si je voulais utiliser ce nombre comme clé d'un hashmap (dictionnaire, tableau associatif), il me faudrait une fonction de hachage qui satisfait deux critères: un, c'est assez simple à implémenter dans Funciton, et deux, les 13 attendus les chaînes d'entrée donnent une valeur de hachage différente. La fonction de hachage la plus simple à laquelle je pouvais penser avait
input % m
une valeur dem
. Par conséquent, j'ai essayém
= 13, 14, 15, etc. jusqu'à atteindre le plus petit entier pour lequel toutes les valeurs de hachage sont uniques. Il s'avère que ce nombre est 25.Les valeurs de hachage sont:
Nous encodons chaque chanson en ayant un bit représentant la présence ou l’absence d’une note. Par exemple, la berceuse de Zelda serait codée comme suit:
sauf que les bits sont dans l'ordre inverse; la cellule en haut à gauche est dans le bit le moins significatif. Cela signifie que chaque chanson est longue de 40 bits.
Nous créons ainsi une table de hachage (moyennement rare) en prenant un nombre de 40 × 25 = 1000 bits et en plaçant le motif de bits de chaque chanson au bon endroit en fonction de sa valeur de hachage. Le nombre monstrueux dans le programme est exactement cette table de hachage.
Voici ce que chacun des chiffres restants signifie:
45
=0x2D
est le Unicode pour-
.1257283645609482190214660190
: Ceci est la chaîne^<>VA
en UTF-21. Avec le recul, j'aurais pu utiliser 7 bits par caractère ici, ce qui raccourcissait le nombre, mais UTF-21 est si profondément traditionnel dans Funciton que cela ne m'est simplement pas venu à l'esprit.2097151
=0x1FFFFF
= (1 << 21) - 1. Utilisé pour obtenir le premier caractère de la chaîne ci-dessus.20971565
: C'est la chaîne-\n
qui est ajoutée à la fin de chaque ligne.\n
est 10. Ce dernier nombre est (10 << 21) + 45.Le programme se déroule maintenant comme suit:
ʫ
avec les 3 paramètres suivants:^<>VA
.ʫ
,-
, suivi d'un autre-
s'il s'agit de zéro ou du premier caractère de c sinon. Décalez le droit B par un pour supprimer un bit et décrémenter un .-\n
, puis coupez le premier caractère de c et démarrez une autre boucle avec a = 8.la source
Python 2, 143,5 (287 octets - 50%)
La grille est générée avec des tirets; puis indexé et remplacé par des notes.
la source
j
en remplaçant chaque virgule par un espace et en appelantsplit
sans argumentrange
. Malheureusement, vous ne pouvez pas simplement multiplier la liste interne par 5 car ils sont tous le même objet et changer d'un change les autres: / Nous avons battu perl (pour l'instant)!"<^><^>"
=>"<^>"*2
?scs="<"*8
Je n'aime pas votre chanson Scarecrow.Perl 5, 125 (
320260250 octets -6x7% chansons en bonus -8% en chanson d'épouvantail)Yay, enfin l'occasion d'expérimenter cette syntaxe de hachage Perlish.
Tester
la source
qw()
syntaxe à la place des virgules gras (%h=qw(zel <^><^> sas >'V><' ...)
pour sauvegarder quelques octets@L
peut être écrit plus succinctement comme@L=('-')x17
. En outre, le hash principal peut être laissé anonyme@B={qw(zel <^><^> ... scs <^V>>V^<)}->{$_}=~/./g
.Perl, 75 (150 octets - 50%)
En comptant le shebang comme 2, l'entrée est prise de stdin.
Utilisation de l'échantillon
la source
Haskell, 344 - 50% = 172 octets
o
Fait le travail.Je pensais pouvoir battre Python en utilisant ces encodages (cela m’a pris beaucoup de temps ._.), Mais non. Ils ne sauvegardent pas encore beaucoup d'octets. Aucune suggestion?
Oui, c'est un moins devant le codage pour
"ros"
. C’est parce que sa "feuille" se termine par le caractère correspondant0
à ma base 5, parce que cette astuce négative ne fonctionnerait pas pour les "chansons faciles" encodées en doublant ce qui est encodés
. Sauf si vous utilisezquot
peut-être, mais alors vous ne pouvez pas gérerp (-1)
spécialement, carquot (-5) = 0
, ainsi la négativité disparaîtrait. Peu importe.la source
PHP: 130 octets (260
270279octets - 6 × 7% - 8%)Merci à Ismael Miguel et Blackhole pour leurs bonnes idées pour économiser davantage d'octets!
Après le
print"-
, il s’agit d’une insertion littérale d’un retour chariot. Il peut traduire deux octets dans Windows.Toutes les chansons bonus, y compris la chanson de l'épouvantail, sont incluses.
Chaque chanson est représentée dans sept octets de code. J'aime la nouvelle notation car avec l'ancienne, j'aurais gagné un maigre point de bonus en tout!
Les dernières modifications font que PHP génère beaucoup d’avertissements, donc pour que tout soit bien rangé, ceux-ci sont détournés
/dev/null
.Enregistrer sous
zelda.php
et exécuter sur la ligne de commande:la source
main.php
"?()
autour($i-$c)
deecho($i-$c)?'--':'-'.$z[$c-0];
. En outre, votre chaîne à l'intérieur de votresplit
peut être utilisé sans'
. Et'/^'.$argv[1].'/'
peut être écrit comme"/^$argv[1]/"
Python 3 - 138,5 (
292280277 octets - 50%)Supprimez quelques octets du leader Python actuel en utilisant la méthode d'impression à l'utilisation plutôt que la méthode de remplacement.
Essayez en ligne
Courir:
Sortie:
la source
['--',c+'-'][s[x]==c]
place du conditionnelRuby, rév 1, 192 - 50% = 96
Le golf comprend:
suppression des espaces entre groupes de lettres de la chaîne magique (et révision du dénominateur à la fin de la ligne
/4
). Suppression de quelques autres espaces inutiles.conversion des séquences d'échappement en caractères uniques (l'échange de pile ne les affichera pas, donc j'ai mis
?
comme espace réservé)redéfinition de
g
comme une chaîne unique contenant cinq exécutions de 17-
suivies de nouvelles lignes, au lieu d'un tableau de cinq chaînes de 17-
Ruby, rév. 0, 223 - 50% = 111,5 (non golfé)
Le code d'entrée est réduit à 2 lettres. Si elle commence par un
s
, las
est supprimée, si elle commence par une lettre aprèss
(uniquement applicable àzel
la dernière lettre, est supprimée et si elle commence par une lettre avant ques
la lettre du milieu ne soit supprimée.La chaîne magique (qui dans la version sans golf contient des espaces pour plus de clarté) contient les codes à 2 lettres suivis des données de musique. La recherche s'effectue à l'aide de l'opérateur de correspondance
=~
qui renvoie la position dans la chaîne.Il existe exactement une chanson de 5, 7 et 8 notes (plus une note qui a également 8 notes). Celles-ci, ainsi qu’une chanson arbitraire de 6 notes
ros
sont regroupées au début de la chaîne magiquen
de la position dans la chaîne peut être utilisée pour calculer le nombre de notes à jouer.cs
est serré avantbf
, et avec la troncature lorsque le nombre dansn
est arrondi, nous obtenons juste le calcul correct pour les deux. Après le quatrième groupe, toutes les chansons ont 6 notes. Par conséquent,n
le nombre de notes par défaut est réduit à 6 par défaut.Un tableau de
-
est configuré pour la sortie et les notes sont substituées une à une. Les données musicales requises sont extraites de la variable$'
qui contient la partie de la chaîne magique originale à droite du match. De cette manière, les données non pertinentes sont ignorées.Les notes sont encodées 3 à la fois dans la chaîne magique, juste après le code de chanson correspondant à 2 lettres. Ils sont extraits avec division par
5**(i%3)
et un caractèreg
est mis à jour en conséquence. À la fin du programmeg
est imprimé.la source
Python 2, 141,5 octets -50% (283 octets)
Enregistre chaque note sous forme d’octet, chaque ligne ayant une longueur de 8 notes. Rappelle la représentation binaire puis remplace par les bons caractères.
la source
Lua, 249 octets - 50% = 124,5
Assez simple, il suffit de lire les chansons encodées en base-6.
la source