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


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

Isto é brilhante! :)
— Decay Beta
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.