Müzik Aralığı Çözücü


11

resim açıklamasını buraya girin

Müzik teorisinde, bir aralık iki perde arasındaki farktır. Her adım, yarım adım sayısı (C ve C # arasındaki fark) veya tam adım sayısı (C ve D arasındaki fark) ile tanımlanır. Bütün bir adım iki yarım adımla aynıdır. İşte tüm varsayılan aralıkların ve temsil ettikleri yarım adımların listesi:

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

Varsayılan aralıklarda küçük , azaltılmış ve artırılmış 3 varyasyon vardır .

  • Bir minör aralık bir yarım adım büyük bir aralıkta daha düşük, ancak mükemmel bir aralığıdır. Yani küçük bir saniyeniz (1), küçük bir üçüncü (3), küçük bir altıncı (8) ve küçük bir yedinci (10) var. Küçük dördüncü, küçük beşinci, küçük birlik veya küçük oktav diye bir şey yoktur, çünkü bunların hepsi mükemmel aralıklardır.

  • Bir azalma aralık minör birden yarım adım daha düşüktür ya da mükemmel bir aralıkta. Azalan İkinci (0), azalan üçüncü (2), azalan dördüncü (4), azalan beşinci (6), azalan altıncı (7), azalan yedinci (9) ve azalan oktav (11) vardır.

  • Bir çoğaltılmış aralığı bir yarım adım daha büyük bir ya da mükemmel aralığından. Artırılmış Birlik (1), Artırılmış İkinci (3), Artırılmış üçüncü (5), Artırılmış Dördüncü (6), Artırılmış beşinci, (8), Artırılmış altıncı (10) ve Artırılmış yedinci (12).

Meydan okuma:

Bir dizi yarım adım veya tam adım atan bir program veya işlev yazmanız ve ardından bu aralığın geçerli İngilizce açıklamalarından birini yazdırmanız gerekir . ES tablosuyla tam olarak eşleştiği sürece hangi açıklamayı seçtiğiniz önemli değildir. Bunu tek bir dize olarak alabilirsiniz

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

veya bir sayı ve bir dize / karakter olarak.

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

Her girişin 0 ila 12 yarım adım arasında olacağını varsayabilirsiniz.

ES tablosu

Yarım adım sayısını kabul edilebilir tüm çıktılara eşleyen tam bir liste.

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   

İşte bazı örnek I / O:

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

Dimished ? ....
CalculatorFeline

7
@CatsAreFluffy Kötü yazım, iyi zorluklar yazma yeteneğimi azalttı. Mar_ಠ
James

Sadece daha fazla düzenleme ile hala iyi bir meydan okuma! : P
Rɪᴋᴇʀ

Yanıtlar:


1

Ruby, Rev B 138 bayt

->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]}

Tekrar etmeden 5 bayt kaydedildi Augmented/Diminished . Kullanılarak 1 bayt kaydedildi ?h.

Ruby, Rev A 144 bayt

->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]}

Fikir, temel aralıkların sayısını en aza indirmektir (sadece yedinci beşinci üçüncü ve tekli) ve yedinci ve beşinci olanların üçte ve birliklerle benzer bir ilişkiye sahip olmasından yararlanmaktır.

Dört tür yedinci / üçüncü ve 3 tip beşinci / birleşme vardır, bu nedenle indeks değişkeni i12 eksi yarım adım sayısından ayarlanır, böylece ifadenin ilk terimi i%7/4 + i/7*2temel aralık türünü doğru bir şekilde seçer.

test programında çözülmemiş

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']
}

çıktı

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

Tanımsız davranış girişleri: İşlev diminished union-1 perfect unisonyarım adım için doğru cevabı verir , ancak 12'nin üzerindeki girişler için başarısız olur. Örneğin , algoritma 12 yerine 14 döngüsüne dayandığından 14 yarı adımda çıktı verir.


2

Python 2, 149 bayt

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]

İlk olarak, tüm adımlar yarım adıma dönüştürülür.

Sonra Diminishedvs Augmentedyazdırılır. Bunlar, bitişik nolanlar n=5ven=6 , bunun aynısını verir, bu da önce onları bir sınır modülosuna tek bir sayıya yerleştirerek elde edilir.

Son olarak, mesafe üç bitlik bir arama tablosu üzerinden hesaplanır. Bu yapmaktan daha kısadır int('6746543230210'[n]).


2

Python 2.7, 155 bayt

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

Retina, 153 bayt

\ D +
, $ *
ağırlık (*). | ​​h
$ 1 $ 1
^ 1 * $
$ 0,0
^ [02479] | 11
0 TL azaldı
^ \ D
Artırılmış $ 0
10 | 7
altıncı
11
oktav
12 | 9
yedinci
8
beşinci
4 | 6
dördüncü
5 | 2
üçüncü
1
ahenk
\ d
ikinci

Girdi numarası önce tekli'ye dönüştürülür, ardından da iki katına çıkar wve tüm harfler kaldırılır ve yalnızca tekli sayı kalır . Bu sayı daha sonra tekrar ondalık sayıya dönüştürülür. Son olarak, son çıktıyı oluşturmak için bazı arama ve değiştirme işlemleri uygulanır.

Örnek çalıştırmalar:

6w => 111111w => 111111111111 => 12 => Artırılmış 12 => Artırılmış yedinci
7s => 1111111s => 1111111 => 7 => Azaltılmış 7 => Azalmış altıncı
3w => 111w => 111111 => 6 => Artırılmış 6 => Artırılmış dördüncü
0h => h => => 0 => Azalan 0 => Azalan saniye

Çevrimiçi deneyin!


0

Vitsy , 166 bayt

Bu kesinlikle daha fazla golf edilebilir.

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

Bu, mümkün olan en az sayıda öğeyi tanımlayıp, bu öğeleri yöntem sözdizimi yoluyla çağırarak çalışır.

Çevrimiçi deneyin!


0

Javascript 189 bayt

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 bayt

Bu dizeleri toplamanın daha iyi bir yolu olmalı ama hiçbir fikrim yok.

(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];}

Girintili'ye:

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];
};

Ben yerine if(s=='w')i*=2;ile kısaltabilirsiniz inanıyorumi*=s=='w'?2:1;
MrPublic

@MrPublic Doğru.
CAD97
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.