Notas a la tablatura

9

Desafío

Dada una lista de notas, debe devolver la tablatura correspondiente.

Notas

Las notas deben estar en el rango de A a G inclusive y el rango de octava debe ser de 2 a 6 inclusive. El formato es nota-octava con #representación de una nitidez y buna plana. Por ejemplo: A7o F#3.

Pestañas

La tablatura es un método para escribir música, representando esquemáticamente el instrumento. Generalmente se representa como cinco líneas con números en ellas.

Los números que están escritos en las líneas representan el traste utilizado para obtener el tono deseado. Por ejemplo, el número 3 escrito en la línea superior del pentagrama indica que el jugador debe presionar hacia abajo en el tercer traste en la E alta (primera cuerda). El número 0 denota la tuerca, es decir, una cadena abierta.

Los números de traste no pueden ser mayores que 22 y la guitarra es de seis cuerdas.

La tablatura debe estar en el formato ASCII estándar . No debe incluir ningún indicador técnico (martillo, diapositiva, etc.). Separe cada nota por cinco guiones. En el caso de dos dígitos, reduzca el número de guiones a cuatro.

El comienzo de la pestaña debería verse así:

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

Y el final debería verse así:

-----|

para todas las lineas.


(fuente: justinguitar.com )

Ejemplo

Input: C3 C3 D3 E3 F3

Output:

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

Victorioso

El código más corto gana

Decaimiento Beta
fuente
¿Necesitamos usar cadenas apropiadas en nuestra salida? ¿Qué nos impide producir una tablatura que solo usa la cuerda E?
danmcardle
@crazedgremlin Debes tener en cuenta las octavas. Solo usar la cuerda E significa que la nota no estaría en la octava apropiada.
Beta Decay
Para elevar una nota en una octava, podríamos agregar 12 trastes al valor del traste. ¿Hay alguna regla para evitar esto que me perdí?
danmcardle
@crazedgremlin Puedes, pero esto solo proporciona dos octavas.
Beta Decay
Solo estoy siendo pedante, pero nunca dijiste que no puedo tener una guitarra realmente larga con 1000 trastes.
danmcardle

Respuestas:

8

Python 3 - 329 328 319 300

Esta es mi primera publicación en codegolf.se, y probablemente no sea óptima; He leído muchas publicaciones aquí, pero hice mi primer código de golf tal vez hace 50 horas. Sin embargo, quería probar!

EDITAR: se eliminó 1 byte, no fue necesario generar un guión adicional allí

EDIT 2: se eliminaron 9 bytes, se eliminaron algunos espacios de la cadena de notas

EDITAR 3: se eliminaron 19 bytes mediante la conversión filter()a un generador

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 poco descabellado:

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
fuente
¡Esto es brillante! :)
Beta Decay