Notes à la tablature

9

Défi

Étant donné une liste de notes, vous devez renvoyer la tablature correspondante.

Remarques

Les notes doivent être comprises entre A et G inclus et la plage d'octave comprise entre 2 et 6 inclus. Le format est note-octave avec #représentant un tranchant et breprésentant un plat. Par exemple: A7ou F#3.

Onglets

La tablature est une méthode d'écriture musicale, en représentant schématiquement l'instrument. Il est généralement représenté par cinq lignes avec des chiffres.

Les nombres qui sont écrits sur les lignes représentent la frette utilisée pour obtenir la hauteur souhaitée. Par exemple, le numéro 3 écrit sur la ligne supérieure de la portée indique que le joueur doit appuyer à la troisième case sur le haut E (première corde). Le numéro 0 indique l'écrou - c'est-à-dire une chaîne ouverte.

Le nombre de frettes ne peut pas être supérieur à 22 et la guitare est à six cordes.

La tablature doit être au format ASCII standard . Vous ne devez pas inclure d'indicateur de technique (marteau, glissade, etc.). Séparez chaque note par cinq tirets. Dans le cas de deux chiffres, réduisez le nombre de tirets à quatre.

Le début de l'onglet devrait ressembler à ceci:

e |-----
B |-----
G |-----
D |-----
A |-----
E |-----

Et la fin devrait ressembler à:

-----|

pour toutes les lignes.


(source: justinguitar.com )

Exemple

Input: C3 C3 D3 E3 F3

Output:

e |-----------------------------------|
B |-----------------------------------|
G |-----------------------------------|
D |-----------------0-----2-----3-----|
A |-----3-----3-----------------------|
E |-----------------------------------|

Gagnant

Le code le plus court gagne

Beta Decay
la source
Avons-nous besoin d'utiliser des chaînes appropriées dans notre sortie? Qu'est-ce qui nous empêche de produire une tablature qui utilise uniquement la chaîne E?
danmcardle
@crazedgremlin Vous devez prendre en compte les octaves. Utiliser uniquement la chaîne E signifie que la note ne serait pas dans l'octave appropriée.
Beta Decay
Pour augmenter une note d'une octave, nous pourrions ajouter 12 frettes à la valeur de frette. Existe-t-il une règle pour empêcher cela que j'ai raté?
danmcardle
@crazedgremlin Vous pouvez, mais cela ne donne que deux octaves.
Beta Decay
Je suis juste pédant, mais vous n'avez jamais dit que je ne pouvais pas avoir une guitare vraiment longue avec 1000 frettes.
danmcardle

Réponses:

8

Python 3 - 329 328 319 300

Ceci est mon premier article sur codegolf.se, et probablement pas presque optimal; J'ai lu beaucoup de messages ici, mais j'ai fait mon premier golf de code il y a peut-être 50 heures. Je voulais essayer, cependant!

EDIT: Suppression d'un octet, n'a pas eu besoin de générer un tiret supplémentaire

EDIT 2: Suppression de 9 octets, suppression de certains espaces de la chaîne de notes

EDIT 3: Suppression de 19 octets en convertissant filter()en un générateur

a,b='C B#oC#DboD oD#EboE FboF E#oF#GboG oG#AboA oA#BboB Cb',input().split()
for f in range(6):print('eBGDAE'[f]+' |-----'+''.join([((str(d[-1])if f==6-len(d)else'')+'-'*6)[:6]for d in[[c-d+9for d in b"%*/48="if c+9>=d]for c in[12*int(g[-1])+a[:a.index((g[:-1]+' ')[:2])].count('o')for g in b]]])+'|')

Un peu non golfé:

a='C B#oC#DboD oD#EboE FboF E#oF#GboG oG#AboA oA#BboB Cb' # string of notes
b=input().split()                                         # read user input
for f in range(6):                    # loop through the strings

  print('eBGDAE'[f] + ' |-----' +     # string identifier and start of string
  ''.join([                           # join notes of tablature
  ((str(d[-1])                        # highest string the note can be played on
  if f == 6 - len(d)                  # if this is the correct string print the fret
  else '')                            # if not then only dashes
  + '-' * 6)                          # print the dashes after the fret
  [:6]                                # but only until 6 chars per note

  for d in [                          # loop through strings
  [c - d                              # calculate fret number
  + 9                                 # add back the 9 (explained below)
  for d in b"%*/48="                  # string values increased by 9 as ASCII bytes
  if c + 9 >= d]                      # filter to remove too high-pitched strings

  for c in [                          # loop through note values
  12 * int(g[-1]) +                   # octave value
  a[:a.index(                         # part of note string before this note
  (g[:-1] + ' ')[:2])]                # unique note identifier
  .count('o')                         # o's (frets) between C and this note
  for g in b]]])                      # loop through notes

  + '|')                              # end tablature
PurkkaKoodari
la source
C'est génial! :)
Beta Decay