Notas à tablatura

9

Desafio

Dada uma lista de anotações, você deve retornar a tablatura correspondente.

Notas

As notas devem estar no intervalo de A a G, inclusive, e o intervalo de oitavas, de 2 a 6, inclusive. O formato é de oitava de nota, #representando um nítido e brepresentando um plano. Por exemplo: A7ou F#3.

Guias

Tablatura é um método de escrever música, representando diagramaticamente o instrumento. Geralmente é representado como cinco linhas com números.

Os números escritos nas linhas representam o traste usado para obter o tom desejado. Por exemplo, o número 3 escrito na linha superior da pauta indica que o jogador deve pressionar o terceiro traste no E alto (primeira corda). O número 0 indica a porca - isto é, uma corda aberta.

Os números do traste não podem ser maiores que 22 e o violão é de seis cordas.

A tablatura deve estar no formato ASCII padrão . Você não deve incluir nenhum indicador de técnica (martelo, deslize etc.). Separe cada nota por cinco traços. No caso de dois dígitos, reduza o número de traços para quatro.

O início da guia deve ficar assim:

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

E o final deve se parecer com:

-----|

para todas as linhas.


(fonte: justinguitar.com )

Exemplo

Input: C3 C3 D3 E3 F3

Output:

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

Ganhando

O código mais curto vence

Beta Decay
fonte
Precisamos usar seqüências apropriadas em nossa saída? O que nos impede de produzir tablaturas que usam apenas a corda E?
Danmcardle 13/10
@crazedgremlin Você precisa levar em consideração as oitavas. Somente o uso da corda E significa que a nota não estaria na oitava apropriada.
Decay Beta
Para aumentar uma nota em uma oitava, podemos adicionar 12 trastes ao valor do traste. Existe uma regra para evitar isso que eu perdi?
Danmcardle 13/10
@crazedgremlin Você pode, mas isso fornece apenas duas oitavas.
Beta Decay
Eu só estou sendo pedante, mas você nunca disse que eu não posso ter uma guitarra muito longa com 1000 trastes.
Danmcardle 13/10

Respostas:

8

Python 3 - 329 328 319 300

Este é o meu primeiro post no codegolf.se e provavelmente não é o ideal; Eu li muitos posts aqui, mas fiz meu primeiro código de golfe já talvez 50 horas atrás. Queria tentar, no entanto!

EDIT: Removido 1 byte, não precisava gerar um traço extra lá

EDIT 2: Removidos 9 bytes, removidos alguns espaços da sequência de notas

EDIT 3: Removidos 19 bytes convertendo filter()para um gerador

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]]])+'|')

Um pouco destroçado:

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
fonte
Isto é brilhante! :)
Decay Beta