これは大規模(または同等)ですか?


16

サンドボックス

メジャースケール(またはイオニアスケール)は、特に西洋音楽で最も一般的に使用される音階の1つです。これは全音階の1つです。多くの音階と同様に、これは7つの音符で構成されています。8つ目の音符は、同じ音符の高いオクターブと呼ばれるように、最初の音を2倍の周波数で複製します。

7つの音符は次のとおりです。

C、D、E、F、G、A、B、C(例の目的で繰り返される)

主な尺度は全音階です。以前の一連の音符をメジャースケール(実際には、スケールCメジャー)とします。メジャースケールの音符間の間隔のシーケンスは次のとおりです。

全体、全体、半分、全体、全体、全体、全体、半分

ここで、「全体」は音全体(図の赤いU字型の曲線)を表し、「半分」は半音(図の赤い破線)を表します。

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

この場合、C からDまではトーン全体、D からEまではトーン全体、EからFまではハーフトーンなどがあります。

ノート間のトーン距離に影響する2つのコンポーネントがあります。これらは、シャープ記号(♯)とフラット記号(♭)です。

シャープ記号(♯)は、音にハーフトーンを追加します。例。CからDまで、トーン全体が存在すると述べましたが、Cの代わりにC♯を使用すると、C♯からDまではハーフトーンが存在します。

フラットシンボル(♭)はシャープシンボルの反対を行い、ノートからハーフトーンを減算します。例:DからEまで、全体のトーンが存在すると述べましたが、Dの代わりにDbを使用すると、DbからEまではトーンが半分存在します。

デフォルトでは、ノートからノートにを除いて、全体のトーンが存在するE to Fと、B to Cちょうど半分のトーンが存在する場所では。

ハーモニックピッチを使用すると、メジャースケールに相当する音が作成される場合があることに注意してください。この例はC#, D#, E#, F#, G#, A#, B#, C#E#およびB#が調和しているが、スケールはメジャースケールのシーケンスに従います。


チャレンジ

スケールを指定して、メジャースケールまたは同等のスケールの場合は真偽値を出力し、そうでない場合は偽値を出力します。

ルール

  • 許可される標準I / Oメソッド
  • 標準の規則が適用されます
  • 8番目のメモを考慮する必要はありません。入力が7つのノートのみで構成されると仮定します。
  • ダブルフラット(♭♭)、ダブルシャープ(♯♯)またはナチュラルサイン(♮)が存在しないと仮定する

テストケース

C, D, E, F, G, A, B                 => true
C#, D#, E#, F#, G#, A#, B#          => true
Db, Eb, F, Gb, Ab, Bb, C            => true
D, E, Gb, G, A, Cb, C#              => true
Eb, E#, G, G#, Bb, B#, D            => true
-----------------------------------------------
C, D#, E, F, G, A, B                => false
Db, Eb, F, Gb, Ab, B, C             => false
G#, E, F, A, B, D#, C               => false 
C#, C#, E#, F#, G#, A#, B#          => false
Eb, E#, Gb, G#, Bb, B#, D           => false

@Abigail基本的にははい。音は異なりますが、音色は同じです。
ルイスフェリペデジェススムニョス

1
およびCx(またはC ##)= D
SaggingRufus

1
ところで、ペンタトニックスケールは、各文字の一つを持っていない:V
ルイス・フェリペ・デ・イエス・ムニョス

1
@Neilクロマチックスケールは独自の文字を持っていないと私は確信しているよ、スケールの種類のdoesntが昇順に従うこと
ルイス・フェリペ・デ・イエス・ムニョス

1
@Neilが、それはどうもありがとうございましたdownvotedので、私はこれをupvoteする必要がありますするつもりだ
デヴィッド・コンラッド

回答:


11

Perl 6の76の 65 63 59バイト

Phil Hのおかげで-4バイト

{221222==[~] (.skip Z-$_)X%12}o*>>.&{13*.ord+>3+?/\#/-?/b/}

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

説明

*>>.&{ ... }  # Map notes to integers
  13*.ord     # 13 * ASCII code:  A=845 B=858 C=871 D=884 E=897 F=910 G=923
  +>3         # Right shift by 3: A=105 B=107 C=108 D=110 E=112 F=113 G=115
              # Subtracting 105 would yield A=0 B=2 C=3 D=5 E=7 F=8 G=10
              # but isn't necessary because we only need differences
  +?/\#/      # Add 1 for '#'
  -?/b/       # Subtract 1 for 'b'

{                           }o  # Compose with block
            (.skip Z-$_)        # Pairwise difference
                        X%12    # modulo 12
         [~]  # Join
 221222==     # Equals 221222

ペアワイズ差分とモジュロ12を行う場合、105を減算する必要はありません。それは単なるオフセットです。-4文字:tio.run/...
フィル・H

@PhilHはい、もちろんです。ありがとう!
-nwellnhof

それは、ノートをそれらの相対値にマッピングする本当に賢い方法です、私から+1!
ソク

10

Node.jsのv10.9.078の 76 71 69バイト

a=>!a.some(n=>(a-(a=~([x,y]=Buffer(n),x/.6)-~y%61)+48)%12-2+!i--,i=3)

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

どうやって?

n[118,71]

[x, y] = Buffer(n) // split n into two ASCII codes x and y
~(x / .6)          // base value, using the ASCII code of the 1st character
- ~y % 61          // +36 if the 2nd character is a '#' (ASCII code 35)
                   // +38 if the 2nd character is a 'b' (ASCII code 98)
                   // +1  if the 2nd character is undefined

与えるもの:

  n   | x  | x / 0.6 | ~(x / 0.6) | -~y % 61 | sum
------+----+---------+------------+----------+------
 "Ab" | 65 | 108.333 |    -109    |    38    |  -71
 "A"  | 65 | 108.333 |    -109    |     1    | -108
 "A#" | 65 | 108.333 |    -109    |    36    |  -73
 "Bb" | 66 | 110.000 |    -111    |    38    |  -73
 "B"  | 66 | 110.000 |    -111    |     1    | -110
 "B#" | 66 | 110.000 |    -111    |    36    |  -75
 "Cb" | 67 | 111.667 |    -112    |    38    |  -74
 "C"  | 67 | 111.667 |    -112    |     1    | -111
 "C#" | 67 | 111.667 |    -112    |    36    |  -76
 "Db" | 68 | 113.333 |    -114    |    38    |  -76
 "D"  | 68 | 113.333 |    -114    |     1    | -113
 "D#" | 68 | 113.333 |    -114    |    36    |  -78
 "Eb" | 69 | 115.000 |    -116    |    38    |  -78
 "E"  | 69 | 115.000 |    -116    |     1    | -115
 "E#" | 69 | 115.000 |    -116    |    36    |  -80
 "Fb" | 70 | 116.667 |    -117    |    38    |  -79
 "F"  | 70 | 116.667 |    -117    |     1    | -116
 "F#" | 70 | 116.667 |    -117    |    36    |  -81
 "Gb" | 71 | 118.333 |    -119    |    38    |  -81
 "G"  | 71 | 118.333 |    -119    |     1    | -118
 "G#" | 71 | 118.333 |    -119    |    36    |  -83

12

474×12=48

12'#'36mod12=0'b'38mod12=2

aNaN

[NaN,2,2,1,2,2,2]

i12


私の答えよりもはるかに興味深い素晴らしいアプローチ
-Skidsdev

4

JavaScriptの(Node.jsの)150の 131 125バイト

l=>(l=l.map(x=>'C0D0EF0G0A0B'.search(x[0])+(x[1]=='#'|-(x[1]=='b')))).slice(1).map((n,i)=>(b=n-l[i])<0?2:b)+""=='2,2,1,2,2,2'

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

ルイスフェリペのおかげで-19バイト
シャギーのおかげで-6バイト

ゴルフをしていない:

function isMajor(l) {
    // Get tone index of each entry
    let array = l.map(function (x) {
        // Use this to get indices of each note, using 0s as spacers for sharp keys
        let tones = 'C0D0EF0G0A0B';
        // Get the index of the letter component. EG D = 2, F = 5
        let tone = tones.search(x[0]);
        // Add 1 semitone if note is sharp
        // Use bool to number coercion to make this shorter
        tone += x[1] == '#' | -(x[1]=='b');
    });
    // Calculate deltas
    let deltas = array.slice(1).map(function (n,i) {
        // If delta is negative, replace it with 2
        // This accounts for octaves
        if (n - array[i] < 0) return 2;
        // Otherwise return the delta
        return n - array[i];
    });
    // Pseudo array-comparison
    return deltas+"" == '2,2,1,2,2,2';
}

1
[...'C0D0EF0G0A0B']代わりに'C0D0EF0G0A0B'.split('')+""代わりに.toString()いくつかのバイトを節約するために
ルイスフェリペデジェススムニョス

x[1]=='#'|-(x[1]=='b')x[1]=='#'?1:(x[1]=='b'?-1:0)いくつかのバイトを保存する代わりに
ルイスフェリペデジェススムニョス

ありがとう 配列の展開と空の文字列の追加を忘れたとは信じられません
-Skidsdev

「デルタが負の場合、それを2に置き換えてください」というのは間違っています。12を法とする差を取る必要があると思います。
nwellnhof18年

@nwellnhof私のテストでは、すべての主要なスケールは最初から正しいデルタを持っているか、オクターブにまたがる場合は2ではなく-10で1つのデルタを持っています。負のデルタを置き換えると修正されます。私はそうは思わない-10 % 12 == 2。考えて
みる

3

Dart198197196189バイト

f(l){var i=0,j='',k,n=l.map((m){k=m.runes.first*2-130;k-=k>3?k>9?2:1:0;return m.length<2?k:m[1]=='#'?k+1:m[1]=='b'?k-1:k;}).toList();for(;++i<7;j+='${(n[i]-n[i-1])%12}');return'221222'==j;}

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

古いPerl 6回答のルーズポート/codegolf//a/175522/64722

f(l){
  var i=0,j='',k,
  n=l.map((m){
    k=m.runes.first*2-130;
    k-=k>3?k>9?2:1:0;
    return m.length<2?k:m[1]=='#'?k+1:m[1]=='b'?k-1:k;
  }).toList();
  for(;++i<7;j+='${(n[i]-n[i-1])%12}');
  return'221222'==j;
}
  • #/ bに三項演算子を使用して-1バイト
  • スケールシフトに3進数ではなくifを使用して-1バイト
  • @Kevin Cruijssenのおかげで-7バイト

古いバージョン:

Dart、210バイト

f(l){var i=0,k=0,n={'C':0,'D':2,'E':4,'F':5,'G':7,'A':9,'B':11,'b':-1,'#':1},j='',y=[0,0];for(;++i<7;j+='${(y[0]-y[1])%12}')for(k=0;k<2;k++)y[k]=n[l[i-k][0]]+(l[i-k].length>1?n[l[i-k][1]]:0);return'221222'==j;}

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

ゴルフをしていない:

f(l){
  var i=0,k=0,n={'C':0,'D':2,'E':4,'F':5,'G':7,'A':9,'B':11,'b':-1,'#':1},j='',y=[0,0];
  for(;++i<7;j+='${(y[0]-y[1])%12}')
    for(k=0;k<2;k++)
      y[k]=n[l[i-k][0]]+(l[i-k].length>1?n[l[i-k][1]]:0);

  return'221222'==j;
}

全体のステップは2、4分の1は1です。より高いオクターブにジャンプする場合はMod 12です。すべてのノートを反復処理し、i番目のノートとi-1番目のノートの差を計算します。結果を連結し、221222(2全体、1半分、3全体)を期待します。

  • kに0を割り当てないことで-2バイト
  • リストではなく文字列としてjを使用して-4バイト
  • ループ内の不要な混乱を取り除くことで、@ Kevin Cruijssenのおかげで-6バイト

Dartは知りませんが、パーツはJavaに似ています。したがって:変更i=1には、i=0変更することで、バイトを減らすことができますfor(;i<7;i++)for(;++i<7;)。さらに、{}ループj+=...の3番目の部分の内側に配置することにより、そのループの周囲のブラケットを削除できますfor(;++i<7;j+='${(y[0]-y[1])%12}')。そして、最後に一つが変化しているreturn j=='221222';ためにreturn'221222'==j;スペースを取り除くために。これらの変更後の-6(210バイト
ケビンクルイッセン

おかげで、ループのためのこれらのトリックについては知りませんでした
Elcan

Np。新しい196バイトバージョンでは、とを変更することで、189バイトまでゴルフできます。:)if(k>9)k--;if(k>3)k--;k-=k>3?k>9?2:1:0;k+=m.length<2?0:m[1]=='#'?1:m[1]=='b'?-1:0;return k;return m.length<2?k:m[1]=='#'?k+1:m[1]=='b'?k-1:k;
ケビンクルーイッセン

くそー、私はまだそれを学ぶためにたくさんあるようです、ありがとう!
エルカン

まあ、私は2。5年前からゴルフをしていましたが、ゴルフのことについてのヒントも常に得ています。:)最初は自分で何かを見逃すのはかなり簡単です。時間とともに、ゴルフのさまざまな方法について考えます。:) <すべての言語>でのゴルフのヒントは、まだ読んでいない人にとっては興味深いものです。また、Javaでゴルフをするためヒントの一部はDartにも適用できます。これは、私があなたの回答で行ったゴルフはJavaの知識に基づいているためです。;)
ケビンクルーイッセン

2

C(gcc)-DA=a[i]+ 183 = 191バイト

f(int*a){char s[9],b[9],h=0,i=0,j=0,d;for(;A;A==35?b[i-h++-1]++:A^98?(b[i-h]=A*13>>3):b[i-h++-1]--,i++);for(;j<7;d=(b[j]-b[j-1])%12,d=d<0?d+12:d,s[j++-1]=d+48);a=!strcmp(s,"221222");}

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

Perlの回答に基づきます。

入力をワイド文字列として受け取ります。

ゴルフをしていない:

int f(int *a){
	char s[9], b[9];
	int h, i, j;
	h = 0;
        for(i = 0; a[i] != NULL; i++){
		if(a[i] == '#'){
			b[i-h-1] += 1;
			h++;
		}
		else if(a[i] == 'b'){
			b[i-1-h] -= 1;
			h++;
		}
		else{
			b[i-h] = (a[i] * 13) >> 3;
		}
	}
	for(j = 1; j < 7; j++){
		int d = (b[j] - b[j-1]) % 12;
		d = d < 0? d + 12: d;
		s[j-1] = d + '0';
	}
	return strcmp(s, "221222") == 0;
}


2

[Wolfram Language(Mathematica)+ Music`パッケージ]、114バイト

私は音楽が好きで、これが面白いと感じましたが、このコードゴルフの機会が下りたときに本当のゴルフをしていましたので、私の提出は少し遅れています。

実際の音楽の知識を活用して、これをまったく異なる方法で試してみようと思いました。Mathematicaの音楽パッケージは名前付きノートの基本周波数を知っていることがわかります。まず、入力文字列を一連の名前付きノートに変換します。次に、連続する各音の比率を取り、2未満の任意の音を2倍にします(オクターブシフトを考慮して)。次に、これらの比率をイオニア音階の比率と比較します。イオニア音階では、半音間で約6%、全音間で12%の周波数差があります。

ここで費やされるバイトの半分以上は、入力を名前付きシンボルに変換するためのものです。

.06{2,2,1,2,2,2}+1==Round[Ratios[Symbol[#~~"0"]&/@StringReplace[# ,{"b"->"flat","#"->"sharp"}]]/.x_/;x<1->2x,.01]&

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



1

[Python] 269 202バイト

改善点Jo King

p=lambda z:"A BC D EF G".index(z[0])+"b #".index(z[1:]or' ')-1
def d(i,j):f=abs(p(i)-p(j));return min(f,12-f)
q=input().replace(' ','').split(',')
print([d(q[i],q[i+1])for i in range(6)]==[2,2,1,2,2,2])

それを試してみてください!

Ungolfed、テストドライバー付き:

tone = "A BC D EF G"   # tones in "piano" layout
adj = "b #"            # accidentals

def note_pos(note):
    if len(note) == 1:
        note += ' '
    n,a = note
    return tone.index(n) + adj[a]

def note_diff(i, j):
    x, y = note_pos(i), note_pos(j)
    diff = abs(x-y)
    return min(diff, 12-diff)

def is_scale(str):
    seq = str.replace(' ','').split(',')
    div = [note_diff(seq[i], seq[i+1]) for i in (0,1,2,3,4,5)]
    return div == [2,2,1,2,2,2]

case = [
("C, D, E, F, G, A, B", True),
("C#, D#, E#, F#, G#, A#, B#", True),
("Db, Eb, F, Gb, Ab, Bb, C", True),
("D, E, Gb, G, A, Cb, C#", True),
("Eb, E#, G, G#, Bb, B#, D", True),

("C, D#, E, F, G, A, B", False),
("Db, Eb, F, Gb, Ab, B, C", False),
("G#, E, F, A, B, D#, C", False),
("C#, C#, E#, F#, G#, A#, B#", False),
("Eb, E#, Gb, G#, Bb, B#, D", False),
]

for test, result in case:
    print(test + ' '*(30-len(test)), result, '\t',
          "valid" if is_scale(test) == result else "ERROR")

はい、私は空白が見えます-まだあまりにも多くのPEP-8を教え込まれている、私は恐れています。どうやら見逃したようです。ここで実行リンクは必要ですか?
プルーン

1
ただし、リンクが必要な場合は、いくつかのクイックゴルフで202バイト。別の入力形式に変更することで、さらにゴルフを確実に行うことができます
ジョーキング

Ah ...私はPythonがプロセス値として最終式を返すことにあまりにも慣れています。ポインタとヒントをありがとう。
プルーン

文字列のリストを取る関数に切り替えると、156バイトを取得できます。また、TIOのリンクセクションには、使用可能な自動フォーマッターがあります
ジョーキング

@JoKing、この回答を編集するか、独自の回答を投稿してください。リンクを使用してコメントすることで、改善が1レベルずつ分けられます。
プルーン

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