Votre tâche consiste à prendre une séquence de caractères (la musique) en entrée (dans une fonction ou un programme) et à imprimer (ou renvoyer) la musique telle qu'elle apparaîtrait dans une boîte à musique.
Vous ne recevrez que les caractères ABCDEFG.()
en entrée et l'entrée ne sera jamais vide. Vous pouvez également recevoir les lettres en minuscules, si vous le souhaitez.
Ceci est une boîte à musique vide, de longueur 3:
.......
.......
.......
Comme vous pouvez le voir, les lignes sont de 7 caractères, et comme la longueur de la boîte à musique est de 3, nous avons 3 lignes. Il n'y en a que .
ici, car la boîte à musique est vide. Mettons de la musique dedans!
Tout d'abord, nous créons la boîte à musique. Dans cet exemple, l'entrée sera CDAG.DAG
.
La longueur CDAG.DAG
est de 8, nous avons donc besoin d'une boîte à musique de longueur 8:
.......
.......
.......
.......
.......
.......
.......
.......
Ensuite, nous lisons l'entrée, un caractère à la fois, et plaçons un O
à sa position respective.
Le premier caractère est C
, et l'emplacement de chaque note est équivalent à cela (j'ai ajouté des espaces pour plus de clarté):
A B C D E F G
. . . . . . .
. . . . . . .
(and so on)
Si le caractère saisi est un .
, alors nous imprimons simplement une ligne vide.......
Donc, ce C
serait le 3ème personnage. Mettons-le dans notre boîte à musique en haut:
..O....
.......
.......
.......
.......
.......
.......
.......
Nous répéterons ce processus pour tous les autres caractères (le texte entre parenthèses est juste pour vous montrer la note, vous ne devriez pas le sortir):
..O.... (C)
...O... (D)
O...... (A)
......O (G)
....... (.)
...O... (D)
O...... (A)
......O (G)
En raison du fonctionnement des boîtes à musique, si nous utilisons un caractère autre que O
, .
et <insert newline here>
, comme un espace, dans notre sortie, il ne jouera pas la bonne musique!
Ceci est un accord:
(ACE)
Cet accord nous demande de jouer les notes A
, C
et E
en même temps. Il n'y aura jamais de pause (ie a .
) dans un accord.
Voici comment il serait écrit:
O.O.O...
Et voici comment cela pourrait apparaître dans la musique: B(ACE)D
Vous ne recevrez jamais d'accord dans un accord, c'est-à-dire que ce ne sera pas valide: (AB(CD)EF)
ou ceci A(B())
:, et l'accord ne sera pas vide, c'est-à-dire que ce ne sera pas valide:A()B
Vous ne recevrez jamais une entrée non valide.
Exemples:
B(ACE)D
.O.....
O.O.O..
...O...
B
.O.....
GGABC
......O
......O
O......
.O.....
..O....
...
.......
.......
.......
A..F.C(DA).
O......
.......
.......
.....O.
.......
..O....
O..O...
.......
.(ABCDEF)
.......
OOOOOO.
Les espaces de fin / de début sur la sortie sont autorisés.
Comme il s'agit de code-golf , le code le plus court gagne!
()
deux fois (par exempleAB(CD)E(FG)
:) ??Réponses:
Pip , 29 octets
28 octets de code, +1 pour l'
-l
indicateur.Prend l'entrée en minuscules comme argument de ligne de commande. Essayez-le en ligne!
Explication
Voici un exemple de la façon dont une entrée est transformée:
la source
Python 2 ,
9594 octets-1 octet grâce à Value Ink
Essayez-le en ligne! ou Essayez tous les cas de test
Explication
'@'<i
est de vérifier s'ili
s'agit d'une lettre, en remplaçant le.
parO
sur la bonne position.'*'>i
est de vérifier sii
est une parenthèse, si elle estx=i>'('
va mettre0
surx
pour empêcher l'impression / compensation deo
, quandi==')'
, il sera mis1
surx
réactivant l'impression / compensation deo
.Quand
i=='.'
rien ne sera changé et'.......'
sera imprimé.L'ordre de caractère est donné par leur code ASCII, où
'('<')'<'*'<'.'<'@'<'A'
la source
['.']*7
. Peut-être que c'est une trace de quand vous utilisiez un tuple, ce qui nécessiterait la virgule. De plus, je peux me tromper, mais cela semble produire un tableau['O', '.', '.', '.', '.', '.', '.']
par ligne, et je ne sais pas si cela est autorisé?Lot, 209 octets
Fonctionne en accumulant des lettres et en sortant la ligne si le dernier symbole vu n'était pas a
(
.la source
Röda ,
977876 octetsEssayez-le en ligne!
C'est une fonction anonyme qui lit l'entrée du flux. Utilisez comme ceci:
main { f={...}; push("ABCD") | f() }
. Il utilise l'expression régulière de la réponse d'ETHproductions.Non golfé:
Réponse précédente:
Essayez-le en ligne!
Il fonctionne en divisant la chaîne donnée aux endroits où la chaîne suivante ne contient que des parenthèses correspondantes. Ensuite, pour chaque accord, il parcourt les notes possibles et imprime
O
si la note est membre de l'accord ou.
non.la source
JavaScript (ES6),
868576 octets9 octets enregistrés grâce à @Neil
Explication
Tout d'abord, nous faisons correspondre ce qui formera chaque ligne de la sortie: les accords et les caractères qui ne font pas partie d'un accord. Ensuite, pour chaque ligne, nous prenons la chaîne
ABCDEFG\n
et remplaçons chaque caractère non nouveau de ligne par unO
si la ligne le contient et un.
autre.la source
s=>s.replace(r=/\(\w+\)|./g,x=>`ABCDEFG\n`.replace(r,c=>x.match(c)?"O":"."))
.\)
être.
?JavaScript (ES6),
118116114 octetsCas de test
Afficher l'extrait de code
la source
Rubis,
787571 octetsRenvoie un tableau de chaînes.
Non golfé + explication
la source
x.gsub(...){l=?.*7;$&.bytes{...};l+$/}
(permutezscan
avecgsub
, supprimezmap
et ignorez le premier|x|
car vous pouvez utiliser$&
pour accéder à la dernière correspondance d'expressions régulières) pour enregistrer 3 octets et renvoyer une chaîne multiligne à la place. (Correspond également$/
à une nouvelle ligne par défaut.)PHP, 171 octets
Panne :
Essayez-le ici!
la source
Rétine , 120 octets
Je suis sûr qu'il y a de la place pour le golf, mais cela fonctionne maintenant, alors j'essaierai de le jouer plus tard.
Essayez-le en ligne!
Comment ça marche
Fondamentalement, le programme fonctionne en changeant chaque caractère en un nombre, puis en affectant un
O
à cette position sur une ligne. Il correspondABCDEFG.
à01234569
.Pour générer les lignes de notes simples, tout ce qui doit être fait est de mettre un
O
après le nombre correspondant de.
s, puis de remplir la ligne de 7 caractères.Cependant, les accords sont un peu plus difficiles à faire. Un processus similaire est utilisé, mais les nombres doivent être traduits en incréments, c'est-à-dire que la première note de l'accord est (peu importe), la seconde est X positions après la première, la troisième est Y positions après cela, etc.
Code
Commencez par trier tous les caractères dans les accords.
Effectuer la translittération (mappage) des lettres aux chiffres.
Remplacez tous les chiffres entre parenthèses par une représentation unaire (à l'aide de
x
s), suivie d'un espace.Remplacez tous les crochets de fermeture par
m
suivi d'une nouvelle ligne. Lem
sera utilisé comme marqueur de tri pour la boucle à venir:Il s'agit d'une étape de remplacement qui boucle jusqu'à ce qu'elle ne puisse plus remplacer. Il prend les deux dernières séquences de
x
s avant unm
, et soustrait la première de la seconde, déplaçant l'm
arrière. Le marqueurm
est nécessaire car il doit effectuer cette opération de droite à gauche.Retirez le premier
x
de chaque séquence, sauf le premier.T
ransliterate en remplaçantx
par.
, espace avecO
, et en supprimantm
et(
.À ce stade, toutes les lignes des accords ont été créées. Maintenant, les lignes de note unique doivent être créées.
Remplacez chaque chiffre par autant de
.
s, suivi d'unO
et d'une nouvelle ligne.Remplissez chaque ligne à la longueur 7 en ajoutant
.
s à droite. Cela fonctionne en ajoutant 6.
s à la fin de chaque ligne (chaque ligne aura au moins 1 autre caractère), puis en remplaçant chaque caractère après les 7 premiers de chaque ligne par rien. (Depuis les.
cartes à 9, leO
sera découpé sur ces lignes)la source
Perl,
877145 + 2 (-nl
indicateur) = 47 octetsEn utilisant:
Essayez-le sur Ideone.
la source
Perl 5-78 + 1 (drapeau) + 2 (devis d'entrée) = 81 octets
Peut être exécuté comme suit:
la source
Rubis, 68 octets
L'idée est de modifier la chaîne
.......
chaque fois que nous trouvons une lettre, puis de la sortir et de la réinitialiser, mais uniquement lorsque nous sommes hors des crochets.(
désactive la sortie.)
et les.
deux commutent / laissent la sortie activée, mais cette dernière est sans conséquence car elle ne sera jamais trouvée à l'intérieur d'un support.Non testé dans le programme de test
la source
Python 3, 94 octets
Une fonction anonyme
la source
Haskell , 101 octets
Essayez-le en ligne! Usage:
p "AB.(CA)D"
. Renvoie une liste de chaînes.Explication:
La fonction
p
revient sur la chaîne. S'il trouve une parenthèse ouvrante,'('
puis(x,_:t)<-span(')'<)r
partitionne la chaîne restanter
en chaînesx
avant l'occurrence de la parenthèse fermante')'
ett
après. Sinon, le caractère actuelx
est transformé en chaîne[x]
. Dans les deux cas, la fonction?
est appelée avec la chaîne de notes actuelle et la chaîne restante.?
mappe la fonction#
sur la chaîne"ABCDEFG"
, où#
remplace tous les caractères qui ne sont pas dans la chaîne de notes actuelle par'.'
. La ligne de boîte à musique résultante est ajoutée à l'appel récursif dep
sur la liste de reposr
.la source
Retina 0.8.2 , 52 octets
Essayez-le en ligne! Prend l'entrée en minuscules. Explication:
Divisez la musique en accords ou en notes et commencez à créer la sortie en ajoutant la liste des équivalents de notes.
Pour chaque note de chaque accord, changez la sortie en an
O
et supprimez la note de l'accord.Supprimez toute la musique désormais superflue et changez toutes les notes sans correspondance en vides.
la source
PHP, 93 octets
Exécuter en tant que pipe avec
-nR
ou l' essayer en ligne .panne
la source