Note sulla tablatura


9

Sfida

Dato un elenco di note, è necessario restituire la tablatura corrispondente.

Appunti

Le note devono essere comprese nell'intervallo da A a G incluso e l'intervallo di ottave deve essere compreso tra 2 e 6. Il formato è nota-ottava con #rappresentazione di uno sharp e brappresentante un flat. Ad esempio: A7o F#3.

Tabs

La tablatura è un metodo per scrivere musica, rappresentando schematicamente lo strumento. Di solito è rappresentato come cinque righe con numeri su di esse.

I numeri che sono scritti sulle linee rappresentano il tasto usato per ottenere il tono desiderato. Ad esempio, il numero 3 scritto nella riga superiore del rigo indica che il giocatore deve premere verso il basso al terzo tasto sulla E alta (prima corda). Il numero 0 indica il dado, ovvero una stringa aperta.

I numeri dei tasti non possono essere superiori a 22 e la chitarra ha sei corde.

La tablatura deve essere nel formato ASCII standard . Non è necessario includere alcun indicatore di tecnica (martello, slitta ecc.). Separare ogni nota con cinque trattini. Nel caso di doppie cifre, ridurre il numero di trattini a quattro.

L'inizio della scheda dovrebbe essere simile al seguente:

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

E la fine dovrebbe apparire come:

-----|

per tutte le linee.


(fonte: justinguitar.com )

Esempio

Input: C3 C3 D3 E3 F3

Output:

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

vincente

Vince il codice più corto


Dobbiamo usare stringhe appropriate nel nostro output? Cosa ci impedisce di produrre tablature che usano solo la stringa E?
danmcardle,

@crazedgremlin Devi prendere in considerazione le ottave. Usare solo la stringa E significa che la nota non sarebbe nell'ottava appropriata.
Decadimento beta

Per alzare una nota di un'ottava, potremmo aggiungere 12 tasti al valore del tasto. Esiste una regola per impedire ciò che mi sono perso?
danmcardle,

@crazedgremlin Puoi, ma questo fornisce solo due ottave.
Decadimento beta

Sono solo pedante, ma non hai mai detto che non posso avere una chitarra davvero lunga con 1000 tasti.
danmcardle,

Risposte:


8

Python 3 - 329 328 319 300

Questo è il mio primo post su codegolf.se e probabilmente non è ottimale; Ho letto molti post qui, ma il mio primo codice golf è mai stato forse 50 ore fa. Volevo provare, però!

EDIT: rimosso 1 byte, non è stato necessario emettere un trattino aggiuntivo lì

EDIT 2: rimossi 9 byte, rimossi alcuni spazi dalla stringa della nota

EDIT 3: rimossi 19 byte convertendoli filter()in un generatore

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 po 'non golfato:

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

È brillante! :)
Decadimento beta
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.