タブ譜に関する注記


9

チャレンジ

リストにメモを指定すると、対応するタブ譜を返す必要があります。

ノート

音符はAからGまでの範囲で、オクターブの範囲は2から6までの範囲でなければなりません。形式は#シャープでbフラットを表すノートオクターブです。例:A7またはF#3

タブ

タブラチュアは、楽器を図で表すことにより、音楽を書く方法です。通常は、番号が付いた5本の線で表されます。

線に書かれている数字は、希望のピッチを得るために使用されるフレットを表しています。たとえば、譜表の一番上の行に書かれている数字3は、プレーヤーが高E(最初の弦)の3番目のフレットを押し下げる必要があることを示しています。数字の0はナット、つまり開いた弦を示します。

フレット数は22以下で、ギターは6弦です。

タブ譜は標準のASCII形式である必要があります。テクニックインジケーター(ハンマーオン、スライドなど)は含めないでください。各ノートを5つのダッシュで区切ります。2桁の場合は、ダッシュの数を4に減らします。

タブの最初は次のようになります。

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

そして最後は次のようになります:

-----|

すべての行。


(ソース:justinguitar.com

Input: C3 C3 D3 E3 F3

Output:

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

勝利

最短のコードが勝ちます


出力に適切な文字列を使用する必要がありますか?E文字列のみを使用するタブ譜を出力しないようにするにはどうすればよいですか?
danmcardle 2014年

@crazedgremlinオクターブを考慮する必要があります。E文字列のみを使用するということは、音符が適切なオクターブにないことを意味します。
ベータ崩壊

ノートを1オクターブ上げるには、フレットの値に12フレットを追加します。私が見逃したこれを防ぐためのルールはありますか?
danmcardle 2014年

@crazedgremlin可能ですが、これは2オクターブしか提供しません。
Beta Decay 2014年

私はただの学習者ですが、1000フレットの本当に長いギターはあり得ないと言ったことはありません。
danmcardle 2014年

回答:


8

Python 3 – 329 328 319 300

これはcodegolf.seに関する私の最初の投稿であり、おそらくほとんど最適ではありません。私はここでたくさんの記事を読んだことがありますが、おそらく50時間前に私の最初のコードゴルフをしました。でも試したかった!

編集: 1バイトを削除しました、そこに余分なダッシュを出力する必要はありませんでした

編集2: 9バイトを削除し、ノート文字列からいくつかのスペースを削除しました

編集3:filter()ジェネレーターに変換して19バイトを削除しました

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

少しゴルフをしない:

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

これは素晴らしいです!:)
ベータ崩壊
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.