음악을 만들어 보자!


11

많은 사람들이 재미와 오락을 위해 음악을 좋아합니다. 불행히도 때때로 음악은 꽤 어렵습니다. 그래서 여기에 있습니다!

직무

어려움을 겪고있는 사람들이 음악을 훨씬 쉽게 읽을 수 있도록하는 것이 당신의 일입니다. 뮤지컬 스태프를 입력으로 사용하고 해당 스태프에 작성된 노트의 이름을 출력하는 프로그램 또는 기능을 작성해야합니다.

직원, 음자리표 및 메모

뮤지컬 직원 , 또는 지팡이는 4 개의 공백이있는 inbetween 다섯 개 수평 라인이다. 각 선 또는 공간은 음자리표에 따라 다른 음표 (피치)를 나타냅니다.
몇 가지 뮤지컬 음자리표 중에서 선택할 수 있지만 현재는 고음 음자리표 만 다루고 있습니다 . 고음 음자리표에서 메모는 다음과 같이 직원에게 표시됩니다.

윤곽
F ----------
D ----------
B ----------
G ----------
E ----------
공백  
   ----------  
이자형
   ----------  
씨
   ----------  
ㅏ
   ----------  
에프
   ----------

입력 형식

입력은 다음과 같이 단일 문자열로 제공됩니다.

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

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

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

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

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

직원의 5 줄과 4 줄은 9 줄의 문자로 구성됩니다. 직원의 줄은 -(하이픈) 문자로 구성되고 공백은 (공백)으로 구성됩니다. 각 행은 다음과 같이 하나의 줄 바꿈
-----\n \n-----\n \n-----\n \n-----\n \n-----\n
문자로 구분됩니다. 또한 행의 길이는 항상 3으로 나눌 수 있습니다 (한 음표의 패턴 다음에 음표가없는 두 열).

해당 직원 -또는 문자를 로 대체하여이 직원에게 메모 를 o합니다. 음은 반음 (음과 음과 인접한 음의 주파수 차이의 약 절반)만큼 음높이를 높이거나 (날카롭게) 낮추거나 (플랫) 낮출 수 있습니다. 이것은 대신에 #및 로 표시됩니다 . 각 노트는 정확히 두 문자로 다음 노트와 분리되며 첫 번째 노트는 항상 첫 번째 "열" 및 (공백) 문자에서 발생합니다. bo--

메모 이름을 출력 할 때 프로그램은 항상 A B C D E F G직원에게 주어진 메모에 해당하는 대문자 ( )를 사용해야합니다 . 샤프 ( #) 및 플랫 ( b) 노트의 경우 프로그램 에서 노트에 해당하는 문자에 각각 #및 을 추가해야합니다 b. 날카 롭거나 평평하지 않은 자연 노트의 경우 (공백)을 대신 추가해야합니다.

입력:

---------------------영형--
                  영형     
---------------영형--------
            영형           
---------비--------------
      영형                 
---영형--------------------
영형                       
------------------------

*이 예에서 모든 "빈 공간"은 실제로 (공백 문자)입니다.
이 경우 (단순 F 메이저 스케일) 프로그램에서 다음을 출력해야합니다.

FGA Bb CDEF

출력 문자 사이의 간격은 위의 그림과 정확하게 일치해야 직원의 메모에 정확하게 맞습니다. 모든 음표 이름 사이에는 Bb및 사이를 제외하고 두 개의 공백 문자가 C있습니다. 는 b여기에 하나 대체 (공백) 문자.

다른
입력 예 :

------------------------
                     영형  
------------------ # -----
               #        
------------영형-----------
         영형              
------ # -----------------
   #                    
영형-----------------------

산출:
E F# G# A B C# D# E

행운을위한 또 하나의 예
입력 :

---------------------
oooo           
---------------------
         영형              
---------------------

--------------- o--o--

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

산출:
E E E C E G G

규칙

  • 참고 사항은 E 선의 최대 5 개 직원 범위에서 최대 F까지 선명하게 표시됩니다 (문제는 제외하고 아래 참조).
  • 음악에서 흔히 볼 수있는 음표뿐만 아니라 모든 음표가 날카 로워 지거나 평평 할 수 있습니다 (예 : 실제로 B #이 실제로 C로 연주되고 있음에도 불구하고 B #은 여전히 ​​입력에서 발생할 수 있음)
  • 3 열 당 정확히 하나의 음표가 있다고 가정 할 수 있습니다 (따라서 화음이나 그와 같은 것이 없으며 나머지도 없습니다)
  • 마지막 메모 다음에 메모가없는 두 개의 열이 있다고 가정 할 수 있습니다
  • 직원의 마지막 줄조차도 줄 바꿈 문자 하나가 뒤따를 것이라고 가정 할 수 있습니다
  • 입력은 STDIN (또는 동등한 언어) 또는 함수 매개 변수에서 가져와야합니다.
  • 프로그램이 함수 인 경우 출력은 STDOUT (또는 동등한 언어) 또는 리턴 결과 여야합니다.
  • 표준 허점과 내장이 허용됩니다! 음악은 실험하고 놀기위한 것입니다. 어리석은 언어를 사용하는 것이 가장 흥미로운 프로그램을 만들지 못할 수도 있음을 알고 있지만
  • 이것은 이므로 바이트 단위의 가장 짧은 프로그램이 승리합니다.

보너스 도전

  • 프로그램이 직원의 최상위 라인 (G, G #, Gb) 위의 공간을 성공적으로 처리 할 수있는 경우 -10 %
  • 프로그램이 직원의 최종선 아래 공간을 성공적으로 처리 할 수있는 경우 -10 % (D, D #, Db)
  • 이 경우 프로그램은 시작과 끝에 추가 행을 입력으로 사용합니다. 이 행은 다른 9 개의 행과 동일하게 취급해야합니다.

예, 저는 제 질문과 매우 유사하다는 것을 알고 있습니다. 그러나 그 답변은 하나만 받았습니다. 더 많은 언어를 사용하기 위해 더 간단한 것을 만들고 싶었습니다. 실제로, 나는 도전이 반대라고 생각하며, 메모를 직원으로 변환합니다.
MC ΔT

답변:


3

CJam ( 40 37 * 0.8 = 29.6 포인트)

qN/z3%{_{iD%6>}#_~'H,65>=@@=+'oSerS}%

온라인 데모

덕분에 참으로 내가 잊고 있었던 몇 가지 미리 정의 된 변수를 지적.


매우 깔끔합니다! 공백 문자에 S를 사용하여 몇 바이트를 줄일 수 있습니다. 또한 13을 D로
바꿉니다

1

루비, 106 바이트 * 0.8 = 84.8

->s{a=' '*l=s.index('
')+1
s.size.times{|i|s[i].ord&34>33&&(a[i%l,2]='GFEDCBA'[i/l%7]+s[i].tr(?o,' '))}
a}

테스트 프로그램에서 언 골프

f=->s{a=' '*l=s.index('
')+1                                 #l = length of first row, initialize string a to l spaces
  s.size.times{|i|                   #for each character in s
  s[i].ord&34>33&&                   #if ASCII code for ob#
   (a[i%l,2]=                        #change 2 bytes in a to the following string
   'GFEDCBA'[i/l%7]+s[i].tr(?o,' '))}#note letter, and copy of symbol ob# (transcribe to space if o)
a}                                   #return a



t='                        
---------------------o--
                  o     
---------------o--------
            o           
---------b--------------
      o                 
---o--------------------
o                       
------------------------

'

u='                        
------------------------
                     o  
------------------#-----
               #        
------------o-----------
         o              
------#-----------------
   #                    
o-----------------------

'

v='                     
---------------------
o  o  o     o        
---------------------
         o           
---------------------

---------------o--o--

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

'

puts f[t]
puts f[u]
puts f[v]

1

자바 스크립트 (ES6), 144 바이트-20 % = 115.2

f=s=>(n=[],l=s.indexOf(`
`)+1,[...s].map((v,i)=>(x=i%l,h=v.match(/[ob#]/),n[x]=h?"GFEDCBAGFED"[i/l|0]:n[x]||" ",h&&v!="o"?n[x+1]=v:0)),n.join``)

설명

f=s=>(
  n=[],                      // n = array of note letters
  l=s.indexOf(`
`)+1,                        // l = line length
  [...s].map((v,i)=>(        // iterate through each character
    x=i%l,                   // x = position within current line
    h=v.match(/[ob#]/),      // h = character is note
    n[x]=                    // set current note letter to:
      h?"GFEDCBAGFED"[i/l|0] //     if it is a note, the letter
      :n[x]||" ",            //     if not, the current value or space if null
    h&&v!="o"?n[x+1]=v:0     // put the sharp/flat symbol at the next position
  )),
  n.join``                   // return the note letters as a string
)

테스트

이 솔루션에는 스태프 위와 아래의 행 구문 분석이 포함되므로 다른 행의 정확한 길이 인 스태프 위에 행을 추가해야합니다.

f=s=>(n=[],l=s.indexOf(`
`)+1,[...s].map((v,i)=>(x=i%l,h=v.match(/[ob#]/),n[x]=h?"GFEDCBAGFED"[i/l|0]:n[x]||" ",h&&v!="o"?n[x+1]=v:0)),n.join``)
<textarea id="input" style="float:left;width:200px;height:175px">                        
---------------------o--
                  o     
---------------o--------
            o           
---------b--------------
      o                 
---o--------------------
o                       
------------------------
                        </textarea>
<div style="float:left">
  <button onclick="results.innerHTML=f(input.value)">Test</button>
  <pre id="results"></pre>
</div>

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