音楽間隔ソルバー


11

ここに画像の説明を入力してください

音楽理論では、間隔は2つのピッチの差です。各ピッチは、ハーフステップ(CとC#の違い)またはステップ全体(CとDの違い)の数によって定義されます。1つの全体のステップは、2つの半分のステップと同じです。すべてのデフォルト間隔とそれらが表すハーフステップの数のリストは次のとおりです。

0     Perfect Unison
2     Major Second
4     Major Third
5     Perfect Fourth
7     Perfect Fifth
9     Major Sixth
11    Major Seventh
12    Perfect Octave

デフォルトの間隔には、マイナー縮小、および拡張の 3つのバリエーションがあります。

  • マイナーの間隔は、1つの半段階の主要な間隔よりも低くはなく、完璧な間隔です。したがって、マイナーな秒(1)、マイナーな3番目(3)、マイナーな6番目(8)、マイナーな7番目(10)があります。これらはすべて完全な間隔であるため、マイナー4、マイナー5、マイナーユニゾン、マイナーオクターブなどはありません。

  • 減少間隔はマイナーより1半音低くなっているか、完璧な間隔。減少した2番目(0)、3番目の減少(2)、4番目の減少(4)、5番目の減少(6)、6番目の減少(7)、7番目の減少(9)、およびオクターブの減少(11)があります。

  • 増強間隔は、1つの半段階で高いメジャーまたは完璧な間隔より。ユニゾンの拡張(1)、2番目の拡張(3)、3番目の拡張(5)、4番目の拡張(6)、5番目の拡張、(8)、6番目の拡張(10)、7番目の拡張(12)があります。

チャレンジ:

半ステップまたは全ステップを数回実行し、この間隔の有効な英語の説明の1つを印刷するプログラムまたは関数を作成する必要があります。IOテーブルと完全に一致する限り、どの説明を選択してもかまいません。これを1つの文字列として取ることができます

"5w" == 5 whole steps
"3h" == 3 half steps

または、数字と文字列/文字として。

5, "w" == 5 whole steps
3, "h" == 3 half steps.

すべての入力が0〜12半ステップの間であると想定できます。

IOテーブル

以下は、ハーフステップの数をすべての受け入れ可能な出力にマッピングする完全なリストです。

0       Perfect unison, Diminished second   
1       Minor second, Augmented unison  
2       Major second, Diminished third  
3       Minor third, Augmented second   
4       Major third, Diminished fourth  
5       Perfect fourth, Augmented third     
6       Diminished fifth, Augmented fourth  
7       Perfect fifth, Diminished sixth 
8       Minor sixth, Augmented fifth        
9       Major sixth, Diminished seventh 
10      Minor seventh, Augmented sixth      
11      Major seventh, Diminished octave    
12      Perfect octave, Augmented seventh   

サンプルI / Oは次のとおりです。

5w      Minor Seventh
5h      Augmented Third
12h     Perfect Octave
12w     UNDEFINED
1w      Diminished third
2h      Major Second

Dimished?....
CalculatorFeline

7
@CatsAreFluffyスペルが悪いため、良い課題を書く能力が低下しました。ಠ_ಠ–
ジェームズ

さらに多くの編集を行うだけで、まだ良い挑戦です!:P
Rɪᴋᴇʀ

回答:


1

Ruby、Rev B 138バイト

->n,s{i=12-n-n*(s<=>?h)
[a='Augmented','Major','Minor',d='Diminished',a,'Perfect',d][i%7]+' '+%w{seventh fifth third unison}[i%7/4+i/7*2]}

を繰り返さないことで5バイト節約されますAugmented/Diminished。を使用して保存された1バイト?h

Ruby、Rev A 144バイト

->n,s{i=12-n-n*(s<=>'h')
%w{Augmented Major Minor Diminished Augmented Perfect Diminished}[i%7]+' '+%w{seventh fifth third unison}[i%7/4+i/7*2]}

基本的な間隔の数(7番目、5番目、3番目、ユニゾンのみ)を最小限に抑え、7番目と5番目が3番目と3番目のユニオンの関係に類似するという事実を利用するという考え方です。

7/3には4種類、5 /ユニゾンには3種類があるため、インデックス変数iは12から半ステップの数を引いた値に設定されるため、式の最初の項i%7/4 + i/7*2は基本間隔の種類を正しく選択します。

テストプログラムに参加していない

f=->n,s{                 #n = number of steps. s= step size, w or h
  i=12-n-n*(s<=>'h')     # i=12-n. If s is later in the alphabet than 'h' subtract again for whole steps
  %w{Augmented Major Minor Diminished Augmented Perfect Diminished}[i%7]+
  ' '+%w{seventh fifth third unison}[i%7/4+i/7*2]
}

-1.upto(12){|j|
puts f[j,'h']
}  

0.upto(6){|j|
puts f[j,'w']
}

出力

Diminished unison
Perfect unison
Augmented unison
Diminished third
Minor third
Major third
Augmented third
Diminished fifth
Perfect fifth
Augmented fifth
Diminished seventh
Minor seventh
Major seventh
Augmented seventh

Perfect unison
Diminished third
Major third
Diminished fifth
Augmented fifth
Minor seventh
Augmented seventh

未定義の動作入力:この関数は、diminished union-1 perfect unison半ステップに対して正しい答えを返しますが、12を超える入力に対しては失敗します。たとえば、アルゴリズムは12ではなく14のサイクルに基づいているため、14半ステップに対して出力します。


2

Python 2、149バイト

def f(n,c):n*=1+(c>'h');print(n-6)%13%2*"Diminished"or"Augmented",'octave seventh sixth fifth fourth third second unison'.split()[71056674174>>3*n&7]

まず、ステップ全体がハーフステップに変換されます。

次に、Diminishedvs Augmentedが出力されます。これらは、それをn除いて隣接するものn=5と交互になりn=6、同じものを与えます。これは、最初に奇数を法とする境界を越えてそれらを置くことによって達成されます。

最後に、3ビットのルックアップテーブルを介して計算された距離が出力されます。これは実行するよりも短いですint('6746543230210'[n])


2

Python 2.7、155バイト

s='second unison third fourth sixth fifth seventh octave Diminished Augmented'.split()
def f(n,c):x=0xDE9CB87561430>>[4,8][c>'h']*n;print s[x%2+8],s[x/2%8]

1

網膜、153バイト

\ d +
$ *
(。*)w | h
$ 1 $ 1
^ 1 * $
$ .0
^ [02479] | 11
0ドル減少
^ \ d
0ドル増額
10 | 7
第六
11
オクターブ
12 | 9
第七
8
第五
4 | 6
第4
5 | 2
三番
1
ユニゾン
\ d
第二

入力番号は最初に単項に変換され、次にが続く場合は2倍になりw、すべての文字が削除されて、単項番号のみが残ります。その後、この数値は10進数に変換されます。最後に、いくつかの検索と置換が適用され、最終的な出力が作成されます。

実行例:

6w => 111111w => 111111111111 => 12 =>拡張12 =>拡張7
7h => 1111111h => 1111111 => 7 =>減少7 =>減少6
3w => 111w => 111111 => 6 =>拡張6 =>第4拡張
0h => h => => 0 =>減少した0 =>減少した秒

オンラインでお試しください!


0

ヴィツィー、166バイト

まあ、これは間違いなくさらにゴルフすることができます。

WW2M1+*a+mZ
'dehsinimiD'
'roniM'
'rojaM'
'tcefreP'
'detnemguA'
'dnoces '
'htruof '
'htxis '
'evatco '
6m1m
6m2m
6m3m
6m5m
7m1m
7m4m
7m5m
8m1m
8m2m
8m3m
8m5m
9m1m
9m4m

これは、可能な最小限のアイテムを定義し、メソッド構文を介してそれらのアイテムを呼び出すことで機能します。

オンラインでお試しください!


0

Javascript 189バイト

a=>(n='sutsftfxFvxov'[N=parseInt(a)*(a.slice(-1)>'v'?2:1)])&&((N>5?N+1:N)%2?'Augmented ':'Dimished ')+'unison,second,third,fourth,fifth,sixth,seventh,octave'.split`,`['ustfFxvo'.indexOf(n)]



 F=
  a=>
    (n='sutsftfxFvxov' //using the right side of the possible answers
                       //set n = the letter representing
                       //unison, first, second ...

       //set N to 12 for 12h, but 24 for 12w
       [N=parseInt(a)*(a.slice(-1)>'v'?2:1)])

  &&   //if we were out of range (12w) we'll return undefined


    (
      (N>5?N+1:N)%2?  //get Aug or Dim (right side goes)
                      //DADADAADADADA
                      //     ^^ makes this a pain
       'Augmented ':'Dimished '
     )
     +
            //turn n (which is u for unison, x for sixth, etc
            //into it's full name
       'unison,second,third,fourth,fifth,sixth,seventh,octave'
         .split`,`
     ['ustfFxvo'.indexOf(a)]

0

Java、225 224バイト

これらの文字列をパックするより良い方法がなければなりませんが、私にはアイデアがありません。

(i,s)->{String A="Augmented",M="Major",m="Minor",P="Perfect",D="Diminished",d=" Second",f=" Fourth",a=" Sixth",C=" Octave";String[]o=new String[]{D+d,m+d,M+d,A+d,P+f,A+f,D+a,m+a,M+a,A+a,D+C,P+C};i*=s=='w'?2:1;return o[i-1];}

インデント:

static BiFunction<Integer, Character, String> interval = (i,s) -> {
    String A="Augmented",M="Major",m="Minor",P="Perfect",D="Diminished",
            d=" Second",f=" Fourth",a=" Sixth",C=" Octave";
    String[] o = new String[] {D+d,m+d,M+d,A+d,P+f,A+f,D+a,m+a,M+a,A+a,D+C,P+C};
    i *= s=='w' ? 2 : 1;
    return o[i-1];
};

私はあなたが交換することにより、それを短縮することができると信じてif(s=='w')i*=2;i*=s=='w'?2:1;
ミスター公開

@MrPublicあなたは正しいです。
CAD97
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.