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.