음악 간격 솔버


11

여기에 이미지 설명을 입력하십시오

음악 이론에서 간격 은 두 피치의 차이입니다. 각 피치는 반 단계 수 (C와 C #의 차이) 또는 전체 단계 (C와 D의 차이)로 정의됩니다. 하나의 전체 단계는 두 개의 절반 단계와 같습니다. 다음은 모든 기본 간격과 이들이 나타내는 반 걸음 수의 목록입니다.

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

기본 간격에는 minor , diminishedaugmented의 3 가지 변형이 있습니다 .

  • 약간의 간격은 1 반 단계의 주요 구간보다 낮은,하지만 완벽한 간격입니다. 따라서 여러분은 부 (1), 부 (3), 부 (6) 및 부 (7)가 있습니다. 마이너 4, 마이너 5, 마이너 유니 톤 또는 마이너 옥타브는 모두 완벽한 간격이기 때문에 없습니다.

  • 감소 간격은 작은 이상의 반 단계 낮은 또는 완벽한 간격. 감소 된 두 번째 (0), 감소 된 세 번째 (2), 감소 된 네 번째 (4), 감소 된 다섯 번째 (6), 감소 된 여섯 번째 (7), 감소 된 일곱 번째 (9) 및 감소 된 옥타브 (11)가 있습니다.

  • 증강 간격은 1 반 단계 높은 주요 또는 완벽한 간격보다. 우리는 Unison (1), Augmented Second (3), Augmented third (5), Augmented Fourth (6), Augmented fiveth (8), Augmented sixth (10), Augmented seventh (12)를 보강했습니다.

도전 과제 :

많은 반 단계 또는 전체 단계를 수행 한 다음 이 간격에 대한 유효한 영어 설명 중 하나 를 인쇄하는 프로그램 또는 함수를 작성해야합니다 . IO 테이블과 정확히 일치하는 한 어떤 설명을 선택하더라도 중요하지 않습니다. 이것을 하나의 문자열로 취할 수 있습니다

"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 철자가 틀리면 좋은 과제를 작성하는 능력이 떨어졌습니다. ಠ_ಠ
James

더 많은 편집 작업으로 여전히 좋은 과제입니다! : P
Rɪᴋᴇʀ

답변:


1

루비, 레브 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.

루비, 레브 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 분의 1 만) 7 분의 5와 5 분의 3이 3 분의 1과 3 분의 1과 비슷한 관계라는 사실을 활용하는 것이 좋습니다.

일곱 번째 / 세 번째와 세 번째 / 다섯 번째 세 가지 유형이 있으므로 인덱스 변수 i는 12에서 반 단계 수를 뺀 값 으로 설정되므로 식의 첫 번째 항이 i%7/4 + i/7*2기본 간격의 유형을 올바르게 선택합니다.

테스트 프로그램에서 ungolfed

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

파이썬 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

파이썬 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
네번째
5 | 2
제삼
1
조화
\디
둘째

입력 번호는 먼저 단항으로 변환 된 다음이면 뒤에 두 배가 w되고 모든 문자는 제거되고 단항 만 남습니다. 그런 다음이 숫자는 10 진수로 다시 변환됩니다. 마지막으로 일부 검색 및 바꾸기가 최종 출력을 구성하는 데 적용됩니다.

예제 실행 :

6w => 111111w => 111111111111 => 12 => 증강 12 => 일곱째 증강
7h => 1111111h => 1111111 => 7 => 감소 7 => 여섯 번째 감소
3w => 111w => 111111 => 6 => 증강 6 => 네 번째 증강
0h => h => => 0 => 감소 0 => 감소 된 초

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


0

Vitsy , 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

자바 스크립트 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

자바 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;
Mr Public

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