Примітки до таблатури


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

Пітон 3 - 329 328 319 300

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

EDIT: Видалено 1 байт, не потрібно було виводити на нього додатковий тире

EDIT 2: Видалено 9 байт, видалено пробіли з рядка примітки

EDIT 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

Це геніально! :)
Бета-розпад
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.