Catatan untuk Tablature

9

Tantangan

Diberikan daftar catatan, Anda harus mengembalikan tablature yang sesuai.

Catatan

Catatan harus dalam kisaran A hingga G inklusif dan rentang oktaf menjadi 2 hingga 6 inklusif. Formatnya adalah not-oktaf dengan #mewakili tajam dan bmewakili datar. Misalnya: A7atau F#3.

Tab

Tablature adalah metode penulisan musik, dengan menggambarkan diagram secara instrumen. Biasanya digambarkan sebagai lima baris dengan angka di atasnya.

Angka-angka yang dituliskan pada garis mewakili fret yang digunakan untuk mendapatkan nada yang diinginkan. Misalnya, angka 3 yang ditulis di baris atas staf menunjukkan bahwa pemain harus menekan fret ketiga pada E tinggi (senar pertama). Angka 0 menunjukkan mur - yaitu, string terbuka.

Angka Fret mungkin tidak lebih besar dari 22 dan gitarnya enam senar.

Tablature harus dalam format ASCII standar . Anda tidak boleh menyertakan indikator teknik apa pun (palu, geser, dll.). Pisahkan setiap not dengan lima garis. Dalam hal dua digit, kurangi jumlah tanda hubung menjadi empat.

Awal tab akan terlihat seperti ini:

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

Dan akhirnya akan terlihat seperti:

-----|

untuk semua lini.


(sumber: justinguitar.com )

Contoh

Input: C3 C3 D3 E3 F3

Output:

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

Kemenangan

Kode terpendek menang

Peluruhan Beta
sumber
Apakah kita perlu menggunakan string yang sesuai dalam output kita? Apa yang menghentikan kami dari menghasilkan tablature yang hanya menggunakan string E?
danmcardle
@crazedgremlin Anda harus memperhitungkan oktaf. Hanya menggunakan senar E berarti not tidak dalam oktaf yang sesuai.
Beta Decay
Untuk menaikkan nada dengan satu oktaf, kita bisa menambahkan 12 fret ke nilai fret. Apakah ada aturan untuk mencegah hal ini yang saya lewatkan?
danmcardle
@crazedgremlin Anda boleh, tetapi ini hanya menyediakan dua oktaf.
Beta Decay
Aku hanya bertele-tele, tetapi kamu tidak pernah berkata aku tidak bisa memiliki gitar yang sangat panjang dengan 1000 fret.
danmcardle

Jawaban:

8

Python 3 - 329 328 319 300

Ini adalah posting pertama saya di codegolf.se, dan mungkin hampir tidak optimal; Saya telah membaca banyak posting di sini tetapi melakukan golf kode pertama saya mungkin 50 jam yang lalu. Ingin mencoba, meskipun!

EDIT: Dihapus 1 byte, tidak perlu mengeluarkan tanda hubung ekstra di sana

EDIT 2: Dihapus 9 byte, menghapus beberapa spasi dari string catatan

EDIT 3: Dihapus 19 byte dengan mengkonversi filter()ke generator

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

Sedikit tidak ungolfed:

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
sumber
Ini brilian! :)
Beta Decay