Pemecah Interval Musik

11

masukkan deskripsi gambar di sini

Dalam teori musik, interval adalah perbedaan antara dua nada. Setiap nada ditentukan oleh jumlah setengah langkah (Perbedaan antara C dan C #) atau seluruh langkah (Perbedaan antara C dan D). Satu langkah penuh sama dengan dua setengah langkah. Berikut adalah daftar semua interval default dan jumlah setengah langkah yang diwakilinya:

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

Ada 3 variasi pada interval default, minor , diminished , dan augmented .

  • Sebuah minor Interval adalah salah satu setengah langkah lebih rendah dari interval besar, tetapi tidak interval sempurna. Jadi Anda memiliki minor kedua (1), sepertiga minor (3), minor keenam (8), dan minor tujuh (10). Tidak ada yang namanya minor keempat, minor kelima, serempak kecil atau oktaf kecil karena ini semua interval sempurna.

  • Sebuah berkurang interval satu setengah langkah lebih rendah dari minor atau interval yang sempurna. Ada berkurang Kedua (0), berkurang ketiga (2), berkurang keempat (4), berkurang kelima (6), berkurang keenam (7), berkurang ketujuh (9) dan berkurangnya oktaf (11).

  • Sebuah augmented interval satu setengah langkah lebih tinggi dari interval besar atau sempurna. Kami memiliki Augmented Unison (1), Augmented Second (3), Augmented third (5), Augmented Fourth (6), Augmented kelima, (8), Augmented keenam (10), dan Augmented ketujuh (12).

Tantangan:

Anda harus menulis program atau fungsi yang mengambil sejumlah setengah langkah atau seluruh langkah dan kemudian mencetak salah satu deskripsi bahasa Inggris yang valid dari interval ini. Tidak masalah deskripsi yang Anda pilih, asalkan cocok dengan tabel IO. Anda dapat menganggap ini sebagai satu string

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

atau sebagai angka dan string / char.

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

Anda dapat berasumsi bahwa setiap input akan antara 0 dan 12 setengah langkah.

Meja IO

Berikut adalah daftar lengkap memetakan jumlah setengah langkah untuk semua output yang dapat diterima.

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   

Berikut ini beberapa contoh I / O:

5w      Minor Seventh
5h      Augmented Third
12h     Perfect Octave
12w     UNDEFINED
1w      Diminished third
2h      Major Second
James
sumber
Dimished ? ....
CalculatorFeline
7
@CatsAreFluffy Ejaan saya yang buruk telah mengurangi kemampuan saya untuk menulis tantangan yang baik. ಠ_ಠ
James
Masih tantangan yang bagus, hanya dengan lebih banyak pengeditan! : P
Rɪᴋᴇʀ

Jawaban:

1

Ruby, Rev B 138 byte

->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 byte disimpan dengan tidak mengulangi Augmented/Diminished. 1 byte disimpan dengan menggunakan ?h.

Ruby, Rev A 144 byte

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

Idenya adalah untuk meminimalkan jumlah interval dasar (ketujuh ketujuh dan hanya serentak) dan mengambil keuntungan dari fakta bahwa ketujuh dan perlima memiliki hubungan analog dengan yang antara pertiga dan serentak.

Ada empat jenis ketujuh / ketiga dan 3 jenis kelima / serentak sehingga variabel indeks idiatur ke 12 dikurangi jumlah setengah langkah, sehingga istilah pertama dari ekspresi i%7/4 + i/7*2akan memilih jenis interval dasar dengan benar.

ungolfed dalam program tes

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

keluaran

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

Input perilaku tidak terdefinisi: Fungsi ini memberikan jawaban yang benar diminished unionuntuk -1 langkah setengah, tetapi gagal untuk input lebih dari 12. Misalnya, output perfect unisonuntuk 14 setengah langkah, karena algoritma ini didasarkan pada siklus 14 bukan 12.

Level River St
sumber
2

Python 2, 149 byte

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]

Pertama, seluruh langkah dikonversi menjadi setengah langkah.

Kemudian, Diminishedvs Augmenteddicetak. Ini bergantian untuk yang berdekatan nkecuali itu n=5dan n=6memberikan yang sama, yang dicapai dengan pertama-tama menempatkan mereka melintasi modulo batas angka ganjil.

Akhirnya, jarak dicetak, dihitung melalui tabel pencarian tiga-bit. Ini lebih pendek daripada melakukan int('6746543230210'[n]).

Tidak
sumber
2

Python 2.7, 155 byte

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]
Ken 'Joey' Mosher
sumber
1

Retina, 153 byte

\ d +
$ *
(. *) w | h
$ 1 $ 1
^ 1 * $
$ .0
^ [02479] | 11
Mengurangi $ 0
^ \ d
Ditambah $ 0
10 | 7
keenam
11
oktaf
12 | 9
ketujuh
8
kelima
4 | 6
keempat
5 | 2
ketiga
1
serentak
\ d
kedua

Nomor input pertama dikonversi ke unary, kemudian digandakan jika diikuti oleh w, dan huruf apa pun dihapus, hanya menyisakan nomor unary. Jumlah ini kemudian dikonversi kembali ke desimal. Akhirnya, beberapa pencarian dan penggantian diterapkan untuk membangun hasil akhir.

Contoh berjalan:

6w => 111111w => 111111111111 => 12 => Augmented 12 => Augmented ketujuh
7h => 1111111h => 1111111 => 7 => Diminished 7 => Diminished keenam
3w => 111w => 111111 => 6 => Augmented 6 => Augmented keempat
0h => h => => 0 => Diminished 0 => Diminished second

Cobalah online!

daavko
sumber
0

Vitsy , 166 byte

Nah, ini pasti bisa golf lebih lanjut.

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

Ini berfungsi dengan mendefinisikan jumlah minimum item yang mungkin, kemudian memanggil item-item tersebut melalui sintaksis metode.

Cobalah secara Online!

Addison Crump
sumber
0

Javascript 189 byte

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)]
Charlie Wynn
sumber
0

Java, 225 224 byte

Harus ada cara yang lebih baik untuk mengemas string ini tetapi saya tidak punya ide.

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

Bertakuk:

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];
};
CAD97
sumber
Saya yakin Anda dapat mempersingkatnya dengan menggantinya if(s=='w')i*=2;dengani*=s=='w'?2:1;
Tn. Public
@Mrpublic Anda benar.
CAD97