L'apocalypse zombie est arrivée et le monde touche à sa fin. Soudain, quelqu'un découvre une formule qui prend l'heure, la minute et le jour actuels et crache la note parfaite à jouer sur un piano qui tue instantanément tous les zombies qui l'entendent. Malheureusement, il ne reste qu'un seul pianiste dans le monde, et il a oublié comment lire les notes, mais il sait toujours lire les partitions. Bien sûr, c'est une chose très sensible au temps, il semble donc naturel d'avoir un ordinateur pour le faire. 1
Votre défi est de prendre une note, telle que G
, et de sortir la note placée sur une portée (en clé de sol), comme ceci:
-----
-----
|
---|-
|
--O--
-----
Spécification:
- Vous devez produire une portée de lignes alternées de
-----
(5 tirets) et une ligne vierge. Il y aura 5-----
s au total. La note doit être superposée au dessus de cette portée. - L'entrée spécifiera où se trouve la note. L'entrée sera:
- un facultatif
H
ouL
, spécifiant "haut" ou "bas" - une lettre de
A
àG
, spécifiant la hauteur - facultatif
#
oub
, spécifiant pointu ou plat.
- un facultatif
- La "note" est définie comme:
- Un
O
(O majuscule) aligné au milieu de la portée, qui est à la place de la note. (La ligne du haut estHF
(F élevé) et la ligne du bas estE
(un E normal).) - Trois
|
s (barres verticales), la tige, qui sera:- un espace à gauche de la note et en descendant (en commençant un espace en dessous de la note) si la note est sur la ligne médiane (
B
) ou au-dessus, ou - un espace à droite de la note et en remontant (en commençant un espace au-dessus de la note) si la note est en dessous de la ligne médiane.
- un espace à gauche de la note et en descendant (en commençant un espace en dessous de la note) si la note est sur la ligne médiane (
- Un
#
oub
un espace directement à gauche de la note s'il est spécifié dans l'entrée.
- Un
- Des lignes de grand livre doivent être ajoutées si la note est trop haute ou trop basse. Ces lignes seront
---
(seulement 3 tirets de largeur, par opposition à 5) et n'apparaîtront que si la note est sur ou au-dessus / en dessous (pour les lignes de livre supérieur / inférieur respectivement) les lignes de livre. - Les espaces étrangers peuvent être placés où vous le souhaitez; par exemple, vous pouvez faire en sorte que les lignes vides aient des espaces ou avoir un espace après les lignes du grand livre si cela vous aide à enregistrer des caractères.
Voici une visualisation, pour comprendre plus facilement la spécification, avec tous les noms de notes à côté des lignes:
HB
--- HA
HG
----- HF
HE
----- HD
HC
----- B
A
----- G
F
----- E
D
--- C
LB
--- LA
LG
--- LF
... (bottom cut off for brevity, you get the idea anyway)
Voici quelques exemples supplémentaires que vous pouvez utiliser pour tester votre programme:
Contribution: HG#
#O
-|---
|
-|---
-----
-----
-----
Contribution: LAb
-----
-----
-----
-----
-----
|
--|
|
bO-
Contribution: HB
O
|--
|
-|---
-----
-----
-----
-----
Contribution: C
-----
-----
-----
-----
|
---|-
|
-O-
Il s'agit de code-golf , donc le code le plus court en octets gagnera!
1: exposition la plus réaliste evar! :-P
#
oub
à droite de la note plutôt qu'à gauche; est-ce vraiment ce qui est nécessaire?Réponses:
Golfscript,
211210209197195192 caractèresÀ venir pour la victoire (à partir de cet article), une version GolfScript de ma dernière version Python :
Testez-le ici (les 2 premières lignes sont entrées par l'utilisateur, elles proviennent normalement de stdin).
Version «lisible»:
la source
Rubis -
271267252249234229220214 caractèresJe viens littéralement d'apprendre Ruby pour ça. Il y a donc certainement place à amélioration pour jouer au golf. Ou vraiment faire quoi que ce soit. Mais j'avais besoin d'un langage avec des chaînes mutables. :)
Assez peu golfé:
Je peux le couper de 2 autres caractères jusqu'à 212 caractères si les premières lignes vierges sont autorisées. Cette solution ne remplit pas les lignes qui ne sont pas imprimées de toute façon:
Le jeu de Lambda est-il juste? Ensuite, je peux obtenir 210 caractères avec la première approche
Ou 207 caractères avec des lignes vierges supplémentaires:
Bien sûr, vous devez maintenant le faire
f.call("HGb")
.la source
!x.nil?
équivaut à!x
. Et pour une ligne ifs,if x;y;end;
est équivalent ày if x
. Vous pouvez également utiliser une nouvelle ligne littérale dans cette chaîne.if
travailler. Si j'utilise?\n
(si c'est ce que vous vouliez dire), je dois ajouter un espace, donc je ne gagne rien. Et supprimer les.nil?
s n'a pas fonctionné du tout (toujours évalué àtrue
)..nil?
, mais cela en vaut la peine en caractères.!x.nil?
est!!x
. :)Python,
329309295286280277 caractèresGolfé un peu plus maintenant. Peut encore être amélioré, mais je ne sais pas si je peux battre les solutions rubis ou golfscript avec cette approche.
Au départ, j'imprimais ligne par ligne, mais il s'est avéré que cela prenait trop de temps, donc je génère une grille de chaînes, puis je remplis ce qui doit être rempli. L'entrée provient de la ligne de commande, par exemple:
la source
GolfScript -
243232228227 caractèresJ'ai traduit ma réponse CoffeeScript en GolfScript, qui est beaucoup plus adapté aux manipulations de cordes.
EDIT: enregistré six caractères en utilisant correctement l'opérateur d'incrémentation, trois en faisant bon usage de la pile, six autres en redéfinissant de manière irresponsable les opérateurs que je n'utilise pas, et un de plus en n'imprimant pas l'espace de fin après les lignes de grâce.
Entièrement golfé:
Avec commentaires:
la source
Go
. il sortiraoo|||
:)Python,
250245242235 caractèresUne approche très différente qui a fini par battre mon autre! Le code de traitement d'entrée est similaire mais c'est à peu près tout.
J'ai tracé la valeur de chaque caractère en fonction de la ligne et de la colonne, puis j'ai joué à l'impression:
la source
Java -
921907863 caractèresJe crée chaque chaîne séparément, en stockant chaque chaîne dans un tableau. Parcourez ensuite le tableau et imprimez chaque ligne.
Oh s'il te plait ne me déteste pas, c'est ma première fois. Je ne pourrais trouver aucune FAQ / introduction donc j'espère que mon format de publication est correct. Je ne sais pas à quel point les gens sont sérieux au sujet du nombre de caractères ... version normale du code - en plus, le saut de ligne / espaces (1313 caractères):
la source
args
).[]
, les espaces autour des parenthèses, etc.Haskell 377C
Version non golfée:
la source
CoffeeScript alphabétisé -
497527caractèresJe suis sûr qu'il existe une meilleure façon de construire la grille, mais je ne peux pas le comprendre.
Un assistant de golf.
Échelle principale et personnel de l'AC.
Notre fonction de notation prendra la représentation sous forme de chaîne d'une note.
Nous allons d'abord déterminer l'octave.
Puis la note et accidentelle. Je dois aimer la mission de déconstruire.
Convertissons la note et l'octave en index et traçons la note.
Nous allons maintenant supprimer autant de personnel que nécessaire.
Et la tige de note.
Maintenant, sortons les résultats.
Enfin, nous allons exporter la fonction pour les tests de console. Ces personnages ne comptent pas dans le total.
la source
C,
325304Maintenant 21 octets plus courts grâce à @ace !
Production:
la source
n
et vous pouvez supprimer lei=0
dans la premièrefor
boucle.if
instruction,((i%12)&11)==0
peut être remplacé par!((i%12)&11)
.?:
a une priorité très inférieure à^
et<
, vous pouvez donc supprimer les crochets des conditions avant le?
. Et vous pouvez remplacerprintf("%s",
parputs(
.JavaScript
390388Un peu un défi, je dois l'admettre ... Je suis sûr qu'il existe des moyens de réduire cela davantage ... Je suis ouvert aux suggestions ...
Première itération
Deuxième itération (en utilisant
n.slice(-1)
au lieu den[n.length-1]
), rase 2 octetsVersion non golfée:
la source