Tahun adalah 930, dan Gereja Gregorian mengalami masalah. Mereka memiliki ribuan halaman nyanyian musik, tetapi masalahnya adalah bahwa semua lembaran musik hanya dibuang ke tumpukan alih-alih memiliki sistem organisasi yang nyata:
Gambar oleh pengguna gamerprinter di Cartographers 'Guild .
Gereja perlu mengatur semua lembaran musik, sehingga mereka telah menyewa seorang insinyur perangkat lunak abad pertengahan untuk menulis sebuah program untuk mengaturnya bagi mereka. Anda adalah insinyur perangkat lunak yang telah dipekerjakan. Namun, proses kompilasi di abad pertengahan melibatkan program yang dituliskan di atas kertas oleh tim penulis Alkitab yang lambat. Untuk mengurangi waktu yang dibutuhkan oleh tim juru tulis untuk mengkompilasi kode Anda, Anda harus membuat program sekecil mungkin.
Gereja ingin musik nyanyian disusun berdasarkan skala musik yang mereka tulis. Semua musik nyanyian Gereja ditulis dalam skala Dorian . Mengingat catatan dari sepotong musik tertentu, program Anda akan menampilkan skala Dorian yang ada di sini. Di sini, saya akan menjelaskan dengan tepat apa skala Dorian itu. Jika sudah tahu, Anda dapat melewati bagian ini.
Ada 12 nada yang memungkinkan dalam melodi apa pun. Berikut urutannya:
C C# D D# E F F# G G# A A# B
Sebuah semitone (diwakili menggunakan S
) adalah incrementing satu langkah ke kanan, membungkus di sekitar (jadi semitone naik dari B akan kembali ke C). Sebuah nada (diwakili menggunakan T
) adalah dua semitone. Misalnya, semitone yang naik dari F # adalah G. Nada yang naik dari F # adalah G #.
Untuk membuat skala Dorian, kita mulai dari catatan apa pun dalam daftar, dan kemudian naik ke atas dalam pola berikut, daftar catatan yang kita temui:
T, S, T, T, T, S
Sebuah contoh. Saya mulai dari A. Catatan skala Dorian saya menjadi:
A
B (up a tone)
C (up a semitone)
D (up a tone)
E (up a tone)
F# (up a tone)
G (up a semitone)
Skala ini memiliki catatan A, B, C, D, E, F #, dan G. Karena saya mulai dari A, kita akan menyebutnya skala Dorian di A . Oleh karena itu ada 12 skala Dorian yang berbeda, masing-masing diberi nama sesuai dengan catatan yang mereka mulai. Masing-masing dari mereka menggunakan pola nada dan semi-nada yang sama, hanya mulai dari posisi yang berbeda. Jika penjelasan saya tidak masuk akal, Anda juga dapat berkonsultasi dengan Wikipedia .
Input program dapat diberikan dari apa pun yang sesuai untuk program Anda (mis. STDIN, argumen baris perintah, raw_input()
). Ini mungkin tidak diinisialisasi dalam suatu variabel. Input akan berupa daftar catatan yang dipisah koma, mewakili melodi karya. Mungkin ada catatan berulang. Akan selalu ada cukup berbagai catatan dalam input untuk dapat secara meyakinkan menyimpulkan skala karya. Contoh input:
B,B,D,E,D,B,A,G#,A,G#,E,D,F#,E,F#,E,F#,G#,A
Output dari program harus berupa string Dorian scale in X
, di mana X adalah nada awal dari skala. Output dari input contoh:
Dorian scale in B
Membandingkan ini dengan skala Dorian dalam B ( B C# D E F# G# A
) kita melihat bahwa semua nada melodi berada dalam skala ini. Catatan C # tidak digunakan dalam kasus ini. Namun ada catatan yang cukup untuk secara jelas mengidentifikasi B Dorian sebagai kunci yang benar. Tidak ada skala Dorian lain yang cocok, karena skala apa pun yang kami coba, selalu ada setidaknya satu nada melodi yang tidak termasuk dalam skala.
Ini adalah kode golf, jadi entri dengan jumlah karakter terpendek akan menang. Tanyakan dalam komentar jika Anda memiliki pertanyaan.
Jawaban:
CJam - 61
Cobalah di http://cjam.aditsu.net/
sumber
C,
171146Mengurai string dalam C tidak semudah itu, jadi saya pergi untuk pendekatan yang lebih matematis.
Saya memanfaatkan Lingkaran Kelima. Jika kami mengatur catatan dalam urutan berikut berdasarkan penghitungan hingga 7 semiton pada satu waktu (dikenal sebagai "kelima"), kami menemukan bahwa semua catatan diizinkan dalam skala tertentu membentuk blok 7 catatan berurutan dan semua catatan yang dilarang membentuk 5 blok berturut-turut dari catatan.
(Ini sebuah lingkaran, itu membungkus kembali sekitar
F
pada akhirnya.)Posisi nada alami dalam urutan di atas dapat dihitung sebagai
(ASCII code) * 2 % 7
. Kemudian jika karakter berikutnya ganjil (berlaku untuk#
tetapi tidak koma, spasi atau nol byte) kita tambahkan 7 untuk membuatnya tajam. Kami menyimpan bitmap dari not yang telah digunakan.Angka
243
(biner11111000
) sesuai dengan catatan yang dilarang dalam skala A # Dorian. Saya mengalikannya dengan(1<<12)+1=4097
memberikan angka ajaib1016056
. Ini hak untuk memeriksa (dengan ANDing) jika melodi berisi catatan yang dilarang untuk masing-masing dari 12 skala pada gilirannya. Jika melodi tidak mengandung catatan yang dilarang, skala dicetak.Untuk output yang kita butuhkan untuk mencetak nama skala yang dikodekan dalam urutan terbalik ke siklus dari perlima di atas, ingat kita akan mundur karena kita hakhifting.) Urutan ASCII
ADGCFBEADGCF
dihasilkan oleh65+i*3%7
. Untuk lima yang pertama ini harus dicetak dengan tajam.Kode tidak dikunci
Perilaku input tidak valid: Jika catatan yang diberikan tidak mencukupi untuk menentukan skala, ia akan menampilkan semua skala yang mungkin. Jika kombinasi not yang mustahil diberikan, maka tidak akan menghasilkan apa-apa. Catatan harus dibatasi oleh koma (atau karakter non-spasi putih dengan kode ASCII genap <= 64). Spasi tidak dapat digunakan karena semuanya setelah spasi pertama akan dianggap sebagai argumen yang berbeda. Kode ASCII> 64 akan ditafsirkan sebagai catatan dengan cara yang dijelaskan.
sumber
Haskell - 152
Tidak disatukan
sumber
Python 2 - 177 karakter
Ini tidak sesingkat itu, tapi saya merasa senang Python untuk menulis banyak bersarang untuk loop dalam satu baris, bahkan ketika tidak bermain golf. Sayangnya, saya harus meletakkan pernyataan input pada baris terpisah sehingga tidak akan dieksekusi lebih dari sekali.
Saya tidak menggunakan Python 3, tapi saya percaya ini adalah contoh yang langka ketika pernyataan cetak tidak membutuhkan lebih banyak karakter. Karena
print
ada fungsi di sana, saya akan dapat mengimbangi kebutuhan untuk tanda kurung dengan menggunakan*
operator daftar membongkar untuk menggantikan yang terakhir[0]
.sumber
input
untukraw_input
dan menyimpan 4 karakter dengan Python 3.Ruby - 132
Masukan dari baris perintah args.
misalnya
ruby dorianscale.rb B,B,D,E,D,B,A,G#,A,G#,E,D,F#,E,F#,E,F#,G#,A
Cobalah di: ideone
sumber
Haskell - 140
Manfaatkan properti Circle of Fifths yang diperkenalkan oleh @steveverrill. Jika kita membiarkan
circle0 = words "C G D A E B F# C# G# D# A# F"
dancircle = circle0 ++ circle0
, maka kita dapat membangun semua skala dengan mencatat 7 not berturut-turutcircle
.Dalam setiap skala yang dibangun dengan cara ini,,
scale !! 3
elemen ke-4 adalah nama skala.Kode
Tidak disatukan
sumber
Scala,
130128127Menggunakan metode circle of 5th. Masukan dari baris perintah args yaitu
sumber