Backstory [yang tidak benar]
Piano diatur seperti ini:
Namun, di piano saya, semua kunci hitam rusak!
Saya masih ingin dapat memainkan beberapa akor pada piano saya yang rusak.
Dalam musik, akor adalah sekelompok not yang dimainkan bersama. Untuk memungkinkan input akord, pertama-tama saya akan menentukan apa semitone itu.
Apa itu semitone?
Semitone adalah jarak terkecil dalam musik Barat. Jika Anda melihat bagian atas piano, Anda melihat bahwa Anda biasanya dapat berpindah dari kunci hitam ke kunci putih, atau sebaliknya; namun, antara B
dan C
dan E
dan F
tidak ada kunci hitam.
Apa itu akord?
Untuk keperluan tantangan ini, kami mendefinisikan akord sebagai sekelompok not dengan sejumlah semitone di antara mereka. Sebagai contoh, mari kita mulai dengan 4-3-3
chord mulai C
(untuk orang musik, ini adalah chord V 7 di F mayor). Kita mulai dari C
. Kami menghitung 4 semitone: C#
, D
, D#
, E
. Catatan berikutnya adalah E
, dan kita menghitung 3 semitone setelah itu: F
, F#
, G
. Catatan berikutnya adalah G
, dan kita menghitung 3 semitone setelah itu: G#
, A
, Bb
. Jadi, kita dapatkan C-E-G-Bb
. Yay! Tapi tunggu ... Bb
adalah kunci hitam dan itu rusak ... Namun, jika kita mulai dari G
, kita dapatkan G-B-D-F
! Yay!
Memasukkan
Input diberikan sebagai daftar bilangan bulat dalam format apa pun yang masuk akal. Ini mewakili akor seperti dijelaskan di atas.
Keluaran
Keluaran harus berupa daftar catatan yang dapat saya mulai hanya perlu menggunakan tombol putih. Ini juga bisa menjadi string dari semua hingga 7 catatan karena semua keynames akan menjadi satu karakter. Anda harus dapat menangani memiliki output kosong juga.
Uji Kasus
input -> output // comments
4 3 -> C F G // this is a major triad
3 4 -> D E A // this is a minor triad
4 3 3 -> G // this is the major-minor seventh chord
3 3 3 -> [empty output] // this is the diminished-diminished seventh chord. All of them use black keys
4 4 -> [empty output] // this is an augmented triad
3 3 -> B // this is a diminished triad
1 -> B E // this is just a minor second
11 -> C F // this is just a major seventh
Spesifikasi lainnya
- Standar Lubang terlarang
- Anda dapat mengasumsikan bahwa input memiliki setidaknya satu bilangan bulat
- Anda dapat mengasumsikan bahwa semua bilangan bulat adalah non-negatif dan kurang dari 12 (karena piano mengulangi setiap 12 nada)
- Output mungkin dalam urutan apa pun
Kriteria Menang
Pengajuan terpendek yang berlaku pada 15 April akan diterima.
Jawaban:
Jelly , 25 byte
Cobalah online! atau lihat test suite
Bagaimana?
sumber
MATL , 31 byte
Terima kasih kepada Jonathan Allan untuk koreksi.
Cobalah online! Atau verifikasi semua kasus uji .
Penjelasan
Pola
2 2 1 2 2 2 1
menentukan interval antara tombol putih berturut-turut. Program menggunakan loop yang menerapkan semua perubahan siklik pada pola dasar ini, untuk menguji setiap kunci sebagai nada terendah potensial dari kunci input. Untuk setiap shift, jumlah kumulatif dari pola diperoleh. Misalnya, untukB
catatan terendah potensial, polanya telah bergeser ke1 2 2 1 2 2 2
dan jumlah kumulatifnya adalah1 3 5 6 8 10 12
.Sekarang, untuk melihat apakah ini dapat mendukung
4 3 3
akor, kami menghitung jumlah kumulatif dari interval akor, yaitu4 7 10
; menguranginya melalui modulo 12 berbasis-1 (interval14
memberi akan2
); dan periksa apakah angka-angka itu semua adalah anggota dari nilai yang diizinkan1 3 5 6 8 10 12
. Tidak demikian halnya dalam contoh ini. Kalau begitu, kami akan mengeluarkan surat ituB
.Korespondensi antara pergeseran siklik dan huruf keluaran didefinisikan oleh string
'BAGFEDC'
. Ini menunjukkan bahwa'B'
(karakter pertama) sesuai dengan pergeseran siklik oleh1
;'A'
(karakter kedua) berhubungan dengan perubahan siklik oleh2
dll.sumber
Mathematica, 110 byte (penyandian ISO 8859-1)
Mendefinisikan fungsi unary dengan
±
mengambil daftar bilangan bulat sebagai input (sebenarnya tidak ada batasan pada ukuran atau tanda-tanda bilangan bulat) dan mengembalikan daftar string satu karakter. Misalnya,±{3,4}
kembali{"A","D","E"}
."A#BC#D#EF#G#"~StringTake~{Mod[#,12,1]}&/@#
adalah fungsi yang mengubah daftar bilangan bulat menjadi nama catatan yang sesuai, kecuali yang#
berarti kunci hitam apa pun. Ini diterapkan untuk setiap elemenAccumulate[i~Prepend~#]&/@Range@12
, yang membangun daftar nilai catatan dari daftar input interval catatan, mulai dengan setiap catatan yang mungkin dari 1 hingga 12. Kami menyaring semua daftar nama-catatan seperti itu yang mengandung"#"
menggunakanSelect[...,FreeQ@"#"]
, dan kemudian kembalikan catatan pertama di setiap daftar yang tersisa menggunakan#&@@@
.sumber
+/-
simbol.Accumulate[i~Prepend~#]&
karena jika tidak akan ada bentrokan kari. Jangan ragu untuk menemukan solusinya!Python 2,
159155 byte(Posting ini setelah memastikan ada kiriman yang valid yang lebih pendek dari yang ini)
Cukup banyak solusi sepele. Input sebagai daftar integer dan output dengan masing-masing karakter pada setiap baris.
-4 byte dengan menghapus variabel yang tidak perlu
sumber
JavaScript (ES6),
727168 byteUlangi setiap tombol tanpa kunci hitam, lalu periksa bahwa jumlah kumulatif semitone tidak pernah mendarat pada kunci hitam.
Sunting: Disimpan 3 byte berkat @Arnauld.
sumber