Tablature에 대한 메모


9

도전

목록에 메모가 있으면 해당 tablature를 반환해야합니다.

노트

음표는 A에서 G까지의 범위에 있어야하며 옥타브 범위는 2에서 6까지이어야합니다. 형식은 노트 옥타브이며 #샤프를 b나타내고 플랫을 나타냅니다. 예 : A7또는 F#3.

Tablature는 악기를 도식적으로 표현하여 음악을 쓰는 방법입니다. 일반적으로 숫자가 다섯 줄로 표시됩니다.

라인에 쓰여진 숫자는 원하는 피치를 얻는 데 사용되는 프렛을 나타냅니다. 예를 들어, 스태프의 맨 위 줄에 쓰여진 숫자 3은 플레이어가 높은 E의 세 번째 프렛 (첫 번째 줄)을 눌러야한다는 것을 나타냅니다. 숫자 0은 너트, 즉 열린 끈을 나타냅니다.

프렛 번호는 22보다 클 수 없으며 기타는 6 줄입니다.

tablature는 표준 ASCII 형식 이어야 합니다 . 기술 지표 (해머 온, 슬라이드 등)를 포함해서는 안됩니다. 각 노트를 5 개의 대시로 구분하십시오. 두 자리 숫자의 경우 대시 수를 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 문자열 만 사용하는 tablature를 출력하지 못하게하려면 어떻게해야합니까?
danmcardle

@crazedgremlin 옥타브를 고려해야합니다. E 문자열 만 사용한다는 것은 음이 적절한 옥타브에 있지 않다는 것을 의미합니다.
Beta Decay

한 옥타브로 음을 높이기 위해 프렛 값에 12 프렛을 추가 할 수 있습니다. 내가 놓친 것을 방지하는 규칙이 있습니까?
danmcardle

@crazedgremlin 가능하지만 두 옥타브 만 제공합니다.
Beta Decay

나는 단지 pedantic하고 있지만, 당신은 1000 프렛으로 정말 긴 기타를 가질 수 없다고 말한 적이 없습니다.
danmcardle

답변:


8

파이썬 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

훌륭합니다! :)
Beta Decay
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.