Tabloya Notlar


9

Meydan okuma

Bir listeye not verildiğinde, karşılık gelen tabloyu döndürmeniz gerekir.

notlar

Notlar A ila G dahil ve oktav aralığı 2 ila 6 dahil olmalıdır. Biçim, #keskin bir ve bbir daireyi temsil eden not oktavdır . Örn: A7veya F#3.

Sekmeler

Tablatura, enstrümanı diyagram olarak temsil ederek müzik yazma yöntemidir. Genellikle üzerinde sayılar bulunan beş satır olarak temsil edilir.

Çizgilere yazılan sayılar, istenen perdeyi elde etmek için kullanılan perdeyi temsil eder. Örneğin, kadronun en üst satırına yazılan 3 sayısı, oyuncunun yüksek E'deki (ilk ip) üçüncü perdeye bastırması gerektiğini gösterir. 0 sayısı somunu, yani açık bir ipi gösterir.

Perde sayıları 22'den fazla olamaz ve gitar altı teldir.

Tablo, standart ASCII biçiminde olmalıdır . Herhangi bir teknik gösterge (çekiç açık, kızak vb.) Dahil etmemelisiniz. Her notayı beş tireyle ayırın. Çift hane olması durumunda tireler sayısını dörde indirin.

Sekmenin başlangıcı şöyle görünmelidir:

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

Ve son şöyle görünmeli:

-----|

tüm hatlar için.


(kaynak: justinguitar.com )

Misal

Input: C3 C3 D3 E3 F3

Output:

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

Kazanan

En kısa kod kazanır


Çıktımızda uygun dizeler kullanmamız gerekiyor mu? Yalnızca E dizesini kullanan tablatura çıktı vermemizi engelleyecek ne var?
danmcardle

@crazedgremlin Oktavları dikkate almanız gerekir. Yalnızca E dizesini kullanmak, notun uygun oktavda olmayacağı anlamına gelir.
Beta Çürüğü

Bir notu bir oktav yükseltmek için perde değerine 12 perdeyi ekleyebiliriz. Kaçırdığım bunu önlemek için bir kural var mı?
danmcardle

@crazedgremlin Şunları yapabilirsiniz, ancak bu yalnızca iki oktav sağlar.
Beta Çürüğü

Ben sadece bilgiçlik yapıyorum, ama 1000 perdelik uzun bir gitarım olamayacağımı hiç söylemedin.
danmcardle

Yanıtlar:


8

Python 3 - 329 328 319 300

Bu benim codegolf.se ilk yazı, ve muhtemelen neredeyse optimal değil; Burada bir sürü yazı okudum ama ilk kod golf hiç 50 saat önce yaptım. Yine de denemek istedim!

EDIT: 1 bayt kaldırıldı, orada fazladan bir çizgi çıkışı gerek yoktu

DÜZENLEME 2: 9 bayt kaldırıldı, not dizesinden bazı boşluklar kaldırıldı

DÜZENLEME 3:filter() Bir jeneratöre dönüştürerek 19 bayt kaldırıldı

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

Biraz soluksuz:

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

Bu harika! :)
Beta Çürümesi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.