ASCII 키 서명을 그립니다.


22

음표를 입력하면 고음 음자리표에 해당하는 주요 건반의 ASCII 도면이 출력됩니다.

다음은 모든 주요 키 (더블 샤프 또는 더블 플랫을 포함하지 않음)와 해당 키 서명입니다.


Circle of fives deluxe 4 위키 백과 사용자 Just Just Bill, 저작권 CC BY-SA 3.0

입력이 예리한 키인 경우 적절한 수의 샤프를 사용하여 다음 ASCII 아트를 그립니다.

   #
-#-------
      #
----#----
  #
-------#-
     #
---------

---------

입력이 아파트 키인 경우 :

---------
  b
----b----
      b
-b-------
   b
-----b---
       b
---------

가능한 입력에 대한 간결한 요약과 사용하는 샤프 또는 플랫 수는 다음과 같습니다.

   0   1   2   3   4   5   6   7
#  C   G   D   A   E   B   F#  C#
b  C   F   Bb  Eb  Ab  Db  Gb  Cb

5 개의 대 시선은 항상 그려 져야하지만 각 대 시선의 길이가 같은 한 샤프 또는 플랫에 각 측면에 패딩 열이 하나 이상 있도록 한 줄에 여러 개의 대시가있을 수 있습니다. 예를 들어, 이들은 모두 입력에 허용되는 출력입니다 Ab.

---------   ------   ---------   ----------------
  b           b           b          b
----b----   ----b-   -------b-   ------b---------

-b-------   -b----   ----b----   ---b------------
   b           b           b          b
---------   ------   ---------   ----------------

---------   ------   ---------   ----------------

샤프 나 플랫이없는 C 메이저의 경우 라인 당 양수의 대시 (1 개)가 허용됩니다.

각 행의 후행 공백과 마찬가지로 모든 선행 또는 후행 공백이 좋습니다. 각 줄에 같은 숫자가 있으면 추가 선행 공백이 허용됩니다.

원하는 경우 소문자로 입력하거나 날카 롭거나 평평하지 않은 입력에 후행 공백이 포함되도록 요구할 수 있습니다.

이것이 이므로 바이트 단위의 최단 솔루션이 이깁니다.



3
@Neil Ah, 문제를 훔쳐서 죄송합니다.> _ <게시하기 전에 기본 사이트를 검색했지만 샌드 박스를 확인하지는 않았습니다.
Doorknob

답변:


3

파이썬 2 , 206 197178175168161 바이트

-12 바이트의 Mr. Xcoder에게 감사합니다!

결과를 2D 문자 목록으로 반환하는 함수입니다. 입력에 샤프 / 플랫이 포함되어 있지 않으면 공백으로 채워야합니다.

def f(k,r=range(10)):n="CGDAEB".find(k[0])+7*' #'.find(k[1]);return[[(' -'[i%2],'b#'[n>0])[0<j<=abs(n)and`i`==(n*"1403625"+"5263748")[j-1]]for j in r]for i in r]

온라인으로 사용해보십시오!


나는 다른 "FCGDAEB".find(k[0])-1지도 F-1색인에 매핑 한다고 생각 합니다 -1, n="CGDAEB".find(k[0])+7*('#'in k)-7*('b'in k)대신 작동 할 것이라고 생각 합니다. ( 175 bytes? )
Mr. Xcoder

@ Mr.Xcoder 똑똑합니다 ... 감사합니다.
FlipTack

3

, 60 바이트

≔⁻⁺⊖﹪⊗℅§θ¬χ⁷×⁷№θ#×⁷№θbθ←UO⁹¦⁹-¶Fθ«Jι⊖﹪⊕׳ι⁷#»F±θ«Jι⊕﹪⁺³×⁴ι⁷b

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

≔⁻⁺⊖﹪⊗℅§θ¬χ⁷×⁷№θ#×⁷№θbθ

키 서명의 샤프 수를 계산하십시오.

←UO⁹¦⁹-¶

첫 번째 샤프 / 플랫이 0 열에 오도록 스 태브를 인쇄하되 원점의 왼쪽 1 칸을 인쇄합니다.

Fθ«

날카로운 부분을 반복하십시오.

Jι⊖﹪⊕׳ι⁷#»

샤프의 행을 계산하여 인쇄하십시오.

F±θ«

아파트를 반복하십시오.

Jι⊕﹪⁺³×⁴ι⁷b

평지의 행을 계산하여 인쇄하십시오.


2

펀칭, 139 바이트

~9%:4%7*+4/7%~6%1-2/7*+vv\`0:\!-g02+*2g00+1%7+g00*+3g00::<<0+55p02:_@
- b#09p01*-1*2p00:`0:-8<>10g`!**:00g2+*\!20g2%*+1g,1+:8`!#^_>$,:1-\^1

온라인으로 사용해보십시오!

일반적으로 프로그램을 대화식으로 실행할 때 발생하는 것처럼 입력은 줄 바꿈으로 종료됩니다.

설명

stdin에서 두 문자를 읽는 것으로 시작합니다-주 음표 n 과 실수로 a (사고가 없으면 줄 바꿈이 될 수 있음). 이러한 값을 사용하여 다음과 같이 키 서명 번호 signum을 계산합니다 .

signum = (n%9 + n%9%4*7)/4%7 + (a%6 - 1)/2*7 - 8

이 값은 -7에서 7 사이의 값을 반환하며, 여기서 부호는 우리에게 예리한 것이나 평평한 것이 필요한지를 알려줍니다 (양수 또는 음수). 따라서 나중에 사용하기 위해 다음 과 같이 부호 s 및 우발적 수 cnt를 추출합니다 .

s   = (signum > 0)
cnt = abs(signum) 

그런 다음 두 개의 중첩 루프가 있는데, 9에서 0까지 행 번호 r을 반복하고 0에서 8까지 열 번호 c를 반복합니다 . 특정 행과 열의 경우 우연히 그 위치에 우연히 보이는지 여부를 계산합니다 지적하다 :

accidental = (r == (c*(s+3) + s)%7 + 1 + s*2) and (c > 0) and (c <= cnt)

실수가 아닌 경우 행 r 이 홀수인지 짝수 인지에 따라 행 또는 공백을 출력해야합니다 . 우연한 경우 부호 s 에 따라 선명하거나 평평하게 출력해야합니다 . 따라서 다음 공식을 평가합니다.

index = (!accidental * (r%2)) + (accidental * (s+2))

이것은 우리에게 0에서 3 사이의 색인을 제공하며, 선, 공간, 평평한 또는 날카로운 것을 나타냅니다. 이 인덱스를 사용하여 테이블에서 필요한 출력 문자를 조회하면 코드의 두 번째 줄 시작 부분에 포함 된 것을 볼 수 있습니다.

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