音楽を作ろう!


11

多くの人が楽しさと娯楽のために音楽を演奏するのが好きです。残念ながら、音楽は時々かなり難しいです。それがあなたがここにいる理由です!

仕事

音楽を読むのに苦労している人たちにとって、音楽をもっと簡単に読むことはあなたの仕事です。音楽譜表を入力として受け取り、その譜表に書かれた音符の名前を出力するプログラムまたは関数を作成する必要があります。

譜表、音部記号、メモ

音楽スタッフ、またはステーブは、4つのスペースであるわたってるしき5本の水平線です。各行またはスペースは、音部記号に応じて異なる音符(ピッチ)を表します。
かなり多くの異なる音部記号を選択することができますが、ここでは高音部記号のみを扱います。高音部記号では、音符は譜表に次のように表示されます。

行
F ----------
D ----------
B ----------
G ----------
E ----------
スペース  
   ----------  
E
   ----------  
C
   ----------  
A
   ----------  
F
   ----------

入力のフォーマット

入力は、次のように単一の文字列として提供されます。

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

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

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

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

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

譜表の5行と4スペースは、9行の文字で構成されています。譜表の行は-(ハイフン)文字で構成され、スペースは(スペース)で構成されます。各行は次のように単一の改行文字で区切られます。たとえば
-----\n \n-----\n \n-----\n \n-----\n \n-----\n
、行は任意の長さ(プログラミング言語で処理できる妥当な量まで)であり、各行は他の行とまったく同じ長さです。また、行は常に3で割り切れる長さになることに注意してください(1つのノートの後に、ノートのない2つの列が続くパターンに合わせます)。

メモは、適切な文字-または文字をに置き換えることにより、この譜表に配置されoます。また、音は半音単位でピッチを上げる(シャープにする)ことも、下げる(フラットにする)こともできます(ノートと隣接するノートの周波数差の約半分)。これは、の代わりにそれぞれ文字#bで表されoます。各音符は次の音符とちょうど2 -文字で区切られ、最初の音符は常に-and (スペース)文字の最初の「列」に現れます。

ノート名を出力する場合、プログラムでは常にA B C D E F G、スタッフに与えられたノートに対応する大文字()を使用する必要があります。シャープ(#)およびフラット(b)のメモの場合、プログラムはメモに対応する文字にそれぞれ#およびを追加する必要がありますb。シャープでもフラットでもない自然なノートの場合は、代わりに(スペース)を追加する必要があります。

入力:

--------------------- o--
                  o     
--------------- o --------
            o           
--------- b --------------
      o                 
--- o --------------------
o                       
------------------------

*この例のすべての「空のスペース」は実際には(スペース文字)であることに注意してください。
この場合(単純なFメジャースケール)、プログラムはこれを出力する必要があります。

FGA Bb CDEF

出力の文字間の間隔は、譜表の音符に正しく収まるように、上記のとおりにする必要があります。すべての音名の間には、Bbとの間を除いて2つの(スペース)文字がありCます。bここでの1置き換え(スペース)文字を。

別の
入力例:

------------------------
                     o  
------------------#-----
               #        
------------ o -----------
         o              
------#-----------------
   #                    
o -----------------------

出力:
E F# G# A B C# D# E

幸運の
入力のためのもう一つの例:

---------------------
おおおお           
---------------------
         o              
---------------------

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

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

出力:
E E E C E G G

ルール

  • ノートは、EフラットからFシャープまでの5行の譜表範囲でのみ与えられます(課題を除く、以下を参照)
  • 音楽で一般的に見られる音だけでなく、音はシャープでもフラットでもかまいません(たとえば、実際にはB#が実際にはCとして演奏されているにもかかわらず、入力でB#が発生する可能性があります)
  • 3カラムごとに正確に1つの音があると仮定することができます(したがって、和音またはそのようなものはなく、休符もありません)
  • 最後のノートの後に、ノートのない2つの列が続くと仮定できます。
  • 譜表の最後の行にも単一の改行文字が続くと想定できます
  • 入力は、STDIN(または同等の言語)または関数パラメーターから取得する必要があります
  • 出力はSTDOUT(または同等の言語)であるか、プログラムが関数である場合の戻り結果として
  • 標準の抜け穴と組み込みが許可されています!音楽とは、実験して遊んでいることです。さあ、あなたの言語を楽しんでください(ただし、抜け穴を利用しても、最も興味深いプログラムが作成されない可能性があることを認識してください)
  • これはなので、バイト単位の最短プログラムが勝ちます

ボーナスチャレンジ

  • プログラムが譜表の一番上の行(G、G#、Gb)のスペースも正常に処理できる場合は-10%。
  • -10%(プログラムがスタッフの最終行の下のスペースも正常に処理できる場合(D、D#、Db)
  • これらの場合、プログラムは入力として開始と終了で追加の行を取ります。これらの行は、他の9行とまったく同じように処理する必要があります

はい、私は1つが私の質問に非常に似ていることを理解しています。ただし、その答えは1つだけです。より多くの言語を関与させるために、もっと簡単なものにしたいと思っていました。そして実際、私はその課題には反対のこと、つまり音符を譜表に変換することが含まれると考えています。
MCΔT15年

回答:


3

CJam(40 37 * 0.8 = 29.6ポイント)

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

オンラインデモ

実際、私が忘れていたいくつかの定義済み変数を指摘してくれてありがとう。


とてもきちんとした!スペース文字にSを使用すると、数バイトを削ることができます。さらに、13をDに置き換えます。
MCΔT15年

1

Ruby、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

JavaScript(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.