Примечания к табулатуре

9

Вызов

Учитывая список заметок, необходимо вернуть соответствующую табулатуру.

Ноты

Ноты должны быть в диапазоне от A до G включительно, а диапазон октав от 2 до 6 включительно. Формат примечание-октава с #представлением резкой и bпредставляющей квартиру. Например: A7или F#3.

Вкладки

Табулатура - это метод написания музыки путем схематического представления инструмента. Обычно это пять строк с цифрами на них.

Числа, которые написаны на линиях, представляют раздражение, используемое, чтобы получить желательный шаг. Например, число 3, написанное в верхней строке посоха, указывает на то, что игрок должен нажимать на третьем ладу на высоком E (первая строка). Число 0 обозначает гайку, то есть открытую строку.

Числа ладов не могут быть больше 22, а гитара - шестиструнная.

Табличка должна быть в стандартном формате ASCII . Вы не должны включать какие-либо технические индикаторы (удар, скольжение и т. Д.). Разделите каждую ноту пятью тире. В случае двузначных чисел уменьшите количество штрихов до четырех.

Начало вкладки должно выглядеть так:

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
@crazedgremlin Вы должны принять во внимание октавы. Использование только строки E означает, что нота не будет в соответствующей октаве.
бета-распад
Чтобы поднять ноту на одну октаву, мы могли бы добавить 12 ладов к значению ладов. Есть ли правило, чтобы предотвратить это, что я пропустил?
Danmcardle
@crazedgremlin Вы можете, но это дает только две октавы.
бета-распад
Я просто педантичен, но ты никогда не говорил, что у меня не может быть очень длинной гитары с 1000 ладами.
danmcardle

Ответы:

8

Python 3 - 329 328 319 300

Это мой первый пост на codegolf.se, и, вероятно, не совсем оптимальный; Я прочитал много постов здесь, но сделал свой первый гольф в коде, может быть, 50 часов назад. Хотелось попробовать, хотя!

РЕДАКТИРОВАТЬ: Удален 1 байт, не нужно было выводить лишнюю черту там

РЕДАКТИРОВАТЬ 2: Удалено 9 байт, удалены некоторые пробелы из строки заметки

РЕДАКТИРОВАТЬ 3: Удалено 19 байтов путем преобразования filter()в генератор

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
PurkkaKoodari
источник
Это великолепно! :)
Beta Decay