Étant donné une partition musicale ascii, vous devez être en mesure de produire la note et sa longueur correspondante. La partition contiendra entre 5 et 15 notes incluses et sera transcrite sur une portée. Une portée est composée de cinq lignes horizontales comprenant - (moins) caractères séparés par des lignes d'espaces. La ligne du bas de la portée équivaut à la note «E». La ligne d'espaces immédiatement au-dessus de la ligne inférieure indique un «F», et est d'un pas plus élevé que le «E» en dessous. Cela continue comme ci-dessous. Notez que les notes remontent uniquement à «G» avant de recommencer à «A». Voir ci-dessous:
F ----------
E
D ----------
C
B ----------
A
G ----------
F
E ----------
Notez que les lettres ne sont pas incluses dans l'entrée. Les notes sont superposées au-dessus de la portée en utilisant un caractère ao (ooh minuscule) pour indiquer la «tête de note». Cette tête de note indique la fréquence de la note, et donc sa représentation alphabétique comme ci-dessus. Par exemple, une note placée sur la partition comme ci-dessous indique un «A»:
----
----
----
o
----
----
Une note, comme le «A» ci-dessus, est appelée «note entière» et serait jouée pendant un temps entier. D'autres durées peuvent être indiquées en incluant une «tige» s'élevant de la note, et entre zéro et trois «drapeaux». Une tige est composée de trois | (pipe ou barre verticale) empilés immédiatement au-dessus de la tête de la note. Une tige sans drapeau est considérée comme une «noire» et joue pendant un quart de temps. Les drapeaux sont des caractères \ (barre oblique inverse), et la main sur le côté droit de la tige. Chaque tige divise par deux le temps pendant lequel la note est jouée. La longueur de chaque note sera l'une des suivantes: une note entière, une noire, une huitième, une seizième ou une trente-seconde. Voici à quoi ressemblerait chaque type de note A:
--------------------
----|---|\--|\--|\--
| | |\ |\
----|---|---|---|\--
o o o o o
--------------------
--------------------
Mettre plus d'une note ensemble vous donne un score. Chaque note peut être considérée comme ayant une largeur de quatre caractères, une note se trouvant dans la première colonne de chaque bloc de quatre caractères. Par exemple :
|\
----|\--|\----------
|\ | |\
----o---|---o---|\--
| o |
|---------------o---
|
o-------------------
--------------------
L'exemple ci-dessus contient les notes suivantes, dans l'ordre: une noire "G", une trente-deuxième note "D", une huitième note "C", une note entière "D" et une seizième note "B". Chaque note de votre sortie doit être au format lettre / longueur, où la lettre est AG et la longueur est la fraction de la longueur de la note par rapport à une note entière. Par exception, la longueur et / le caractère ne doivent pas être imprimés si la note est une note entière. Chaque note de votre sortie doit être séparée par un seul espace. Par conséquent, pour le score ci-dessus, votre code doit générer les éléments suivants:
G/4 D/32 C/8 D B/16
- Les notes seront dans la plage suivante: EFGABCDE F. Notez que seule la lettre doit être imprimée, l'octave est ignorée.
- Notez que le nombre de lignes d'entrée varie de 9 à 12, car les notes avec un quart de temps ou moins sur la ligne D ou supérieure nécessiteront plus de lignes pour s'afficher complètement.
- Il n'y a pas de demi-note dans ce cas.
Le code le plus court gagne (les espaces ne comptent pas).
Modifier: correction d'une erreur d'espacement dans une entrée.
Quelques exemples d'entrées:
|\
----|\--|-------------------
|\ | |
|---|---o---------------o---
| o |\
o---------------|\--|\------
|\ |\ |\
------------|\--|\--o-------
|\ o
------------o---------------
Sortie: B / 8 C / 8 D / 8 E / 32 F / 32 G / 32 D
----------------o-------------------
o
------------o-----------------------
o
--------o---------------------------
o
----o-------------------------------
o
o-----------------------------------
Sortie: EGBDFFACE
|\
|\
|\
------------o-------|-----------
| o | |\
|---|\--------------|---|\------
| | o |\
o---|---|\--------------o---|\--
o |\ |\
--------|\------------------|---
o o
--------------------------------
Sortie: B / 4 A / 8 F / 32 F / 32 EC / 4 B / 32 F / 16
Réponses:
Javascript,
284,279,278,225,221, 220 caractères (y compris les espaces nécessaires)One-liner ( test fiddle ):
Lisible ( test du violon ):
la source
;
s inutiles et en faisant quelques trucs, vous pouvez rendre cela encore plus court.function a(c){b='',d=c.split('\n');for(e=0;d[0][e++];){for(i=f=0;g=d[i++];){h=g[e-1];if(h=='o')b+=(b?' ':'')+String.fromCharCode((d.length+4-i)%7+65);if(h=='|')f=f||4;f*=1+(g[e]=='\\');}if(f)b+='/'+f}return b}
(209 caractères)Perl, 103 caractères
(108 si vous comptez les caractères d'espacement nécessaires)
Avec un espace pour la présentation:
Notez que je suppose que toutes les lignes ont la même longueur (selon la version révisée de la question).
Version réarrangée avec explications:
(ancienne solution plus longue, conservée car elle peut être intéressante même si elle est un peu plus longue)
Perl,
147126 caractères(
149131 si vous comptez les espaces nécessaires)Avec un espace pour la présentation:
Réarrangé un peu pour ne pas trop abuser de la langue:
Notez que je suppose que toutes les lignes ont la même longueur. Si vous souhaitez autoriser des lignes plus courtes, une solution évidente consiste à ajouter
$_.=1x$c,
au début du programme, au coût de 9 caractères.J'ai pensé à une autre approche pour éviter les longs mots comme
split
etmap
et laisser les espaces faire plus de travail, mais le passe-partout et la ponctuation ont pris leur revanche, et je ne peux que le ramener à un 130 coqueluche (144 avec les espaces nécessaires).Le patch pour faire face aux lignes inachevées est un peu plus étrange cette fois (quoi, vous pensiez qu'il ne pouvait pas devenir plus bizarre?). 139 caractères, 155 avec les espaces nécessaires.
la source
Scala (2.9),
352313291294290277274273 caractèresSi une fonction est tout ce dont vous avez besoin:
Si un programme complet est requis:
la source
J - 108 caractères
Non golfé:
la source
Golf Python, 207 caractères.
J'ai commence le golf de code avec Python pendant 2 jours et j'ai trouvé que des choses comme
import sys
,sys.stdin.read
,sys.stdout.write
sont vastes.la source