Diberikan dua nama catatan, Anda harus menulis sebuah program yang menentukan apakah interval yang dibentuk oleh kedua catatan ini adalah konsonan atau disonan.
pengantar
Dalam musik Barat, hanya ada 12 nada "berbeda". Nama-nama mereka, diurutkan dari terendah ke tertinggi, adalah: C, C#, D, D#, E, F, F#, G, G#, A, A#, B
. Urutannya adalah siklis, yaitu ia melanjutkan dengan yang lain C
setelah B
, tanpa batas.
Jarak antara dua nada disebut interval . Interval antara dua not yang berdekatan dalam seri di atas (misalnya C — C#
atau E — F
) disebut semitone . Interval antara not-not yang lebih jauh didefinisikan sebagai jumlah langkah semiton yang diperlukan untuk mendapatkan dari yang pertama ke yang kedua (sementara mungkin membungkus urutannya). Beberapa contoh: D to E
= 2 semitones, C to G
= 7 semitones, B to D#
= 4 semitones (ini membungkus urutan). 1
Sekarang, interval ini dibagi menjadi dua kategori: konsonan (terdengar menyenangkan jika Anda memainkan dua not sekaligus) dan disonan (tidak terlalu banyak).
Mari kita tentukan interval konsonan menjadi: 0, 3, 4, 5, 7, 8 dan 9 semiton.
Sisanya adalah disonan, yaitu: 1, 2, 6, 10 dan 11 semiton.
Tantangan
Tulis "program" (dalam arti kata yang umum: fungsi tidak masalah) untuk melakukan hal berikut:
Ambil dua nama note (string dari urutan di atas) sebagai input. Anda dapat mengambilnya sesuka Anda (dari stdin, sebagai argumen, dipisahkan oleh apa pun yang Anda inginkan, bahkan merasa bebas untuk menjadikannya sebagai daftar karakter (mis
["C","#"]
.). Namun, Anda tidak dapat menetapkan nama lain pada catatan (terutama Anda mungkin tidak memberi nomor dari 0 hingga 11 dan menggunakan angka).Untuk Anda yang suka musik di luar sana, not akan ditentukan tanpa oktaf. Dalam hal ini, tidak masalah urutan not datang dan mana yang lebih rendah dan mana yang lebih tinggi. Akhirnya, Anda tidak perlu menangani nama apa pun yang tidak ada dalam daftar di atas. Tidak ada enharmonics lain seperti
E#
, tidak ada flat, perubahan ganda dan sebagainya.Pilih dua nilai yang berbeda. Program Anda harus menampilkan salah satu dari mereka setiap kali interval yang dibentuk oleh dua catatan dalam input adalah konsonan, dan yang lainnya jika tidak. (Bisa jadi
True
danFalse
, tetapi bahkan π dan e jika Anda mau :))Ini adalah kode-golf. Program terpendek dalam byte di setiap bahasa menang. Selamat bersenang-senang!
Contoh dan Kasus Uji
Note 1 Note 2 Output Interval [semitones]
C D Dissonant 2
A# A# Consonant 0
G D Consonant 7 (wraparound)
D# A Dissonant 6
F E Dissonant 11
A C Consonant 3
Saya tidak menambahkan lebih dari mereka karena tidak ada kasus yang sangat berbahaya dalam hal ini.
Ini adalah tantangan pertamaku, jadi setiap kritik konstruktif disambut dengan hangat :—). Jika Anda menemukan penjelasan teori ceroboh, jangan ragu untuk bertanya. Akhirnya, tolong jangan katakan padaku bahwa ini adalah penipuan dari ini atau ini . Saya memastikan tidak. (Yang terakhir ini sangat mirip tetapi lebih kompleks. Saya pikir memasang tantangan yang lebih sederhana akan membuat orang lebih mudah untuk bergabung.)
1 : Saya mencoba menyederhanakan penjelasan ini sejauh yang saya bisa. Ada lebih banyak teori di sekitar interval. Tolong jangan bash saya untuk meninggalkannya.