Pedoman
Tugas
Diberikan dua catatan, dimasukkan sebagai string atau daftar / array, menghitung berapa banyak semi-terpisah mereka (termasuk catatan itu sendiri), menghasilkan sebagai angka.
Penjelasan tentang semitone:
Semitone adalah satu langkah ke atas atau ke bawah keyboard. Contohnya adalah C to C #. Seperti yang Anda lihat di bawah, catatan C ada pada catatan putih dan C # adalah catatan hitam hanya satu di atasnya. Semitones adalah lompatan dari catatan hitam ke catatan putih berikutnya, atas atau bawah, kecuali untuk:
- B ke C
- C ke B
- E ke F
- F ke E
Contohnya
'A, C' -> 4
'G, G#' -> 2
'F#, B' -> 6
'Bb, Bb' -> 13
Aturan
- Jarak terbesar antara dua not adalah 13 semitone.
- Catatan yang dimasukkan kedua akan selalu berada di atas catatan yang dimasukkan pertama.
- Anda dapat mengambil input baik sebagai string, atau array / daftar. Jika Anda menganggapnya sebagai string, catatan akan dipisahkan dengan koma (mis.
String -> 'A, F'
,Array -> ['A', 'F']
). - Anda dapat mengasumsikan bahwa Anda akan selalu diberikan dua catatan yang valid.
- Benda tajam akan dilambangkan sebagai
#
dan flat akan dilambangkan sebagaib
- Kode Anda harus mendukung setara setara denganarmarmonik (misalnya, harus mendukung F # dan Gb)
- Kode Anda tidak perlu mendukung catatan yang diberi nama, tetapi dapat dinamai tanpa tajam atau datar (mis. Anda tidak perlu mendukung E #, atau Cb). Poin bonus jika kode Anda mendukungnya.
- Kode Anda tidak perlu mendukung benda tajam ganda atau apartemen ganda.
- Anda dapat mengasumsikan bahwa jika Anda mendapatkan kedua not yang sama, atau nada yang sama (misalnya 'Gb, Gb' atau 'A #, Bb'), not kedua tidak akan tepat satu oktaf di atas yang pertama.
- Ini adalah kode golf sehingga jawabannya dengan jumlah byte terkecil menang.
G -> G#
karena mereka sama-sama termasuk.Cb
atau tidakE#
? Bagaimana dengan benda tajam ganda / flat?(X, Y]
C to C # adalah 1 semitone dan C to C adalah 12 semitones.Jawaban:
Python 2 , 66 byte
Cobalah online!
Python 2 , 68 byte
Cobalah online!
sumber
JavaScript (ES6), 78 byte
Disimpan 1 byte berkat @Neil
Membawa catatan dalam sintaks currying
(a)(b)
.Uji kasus
Tampilkan cuplikan kode
Fungsi hash
Tujuan dari fungsi hash adalah untuk mengubah catatan menjadi pointer dalam tabel pencarian yang mengandung offset semitone (C = 0, C # = 1, ..., B = 11), disimpan dalam heksadesimal.
Kami pertama append sebuah '3' ke catatan dan mengurai string yang dihasilkan dalam basis-36, yang mengarah ke integer N . Karena '#' adalah karakter yang tidak valid, itu hanya diabaikan, bersama dengan karakter yang mengikutinya.
Kemudian kami menghitung:
Di bawah ini adalah ringkasan dari hasilnya.
Tentang flat dan benda tajam
Di bawah ini adalah bukti bahwa fungsi hash ini memastikan bahwa catatan diikuti oleh '#' memberikan hasil yang sama dari catatan berikutnya diikuti oleh 'b' . Dalam paragraf ini, kami menggunakan awalan @ untuk jumlah basis-36.
Misalnya, Db akan dikonversi ke @ db3 dan C # akan dikonversi ke @c (lihat paragraf sebelumnya). Kami ingin membuktikan bahwa:
Atau dalam kasus umum, dengan Y = X + 1 :
@ b3 adalah 399 dalam desimal. Karena itu:
1296 sesuai dengan 1 modulo 37 , jadi ini dapat disederhanakan sebagai:
Kasus khusus adalah transisi dari G # ke Ab , seperti yang kita harapkan Hb untuk mematuhi formula di atas. Namun, ini juga berfungsi karena:
sumber
Perl,
3932 byteTermasuk
+1
untukp
Berikan catatan awal dan akhir sebagai dua baris pada STDIN
Hanya kode:
sumber
Japt , 27 byte
Uji secara online! Mengambil input sebagai array dari dua string.
Juga berfungsi untuk jumlah benda tajam atau flat apa pun pada catatan dasar!
Penjelasan
sumber
Perl 5 +
-p
, 66 byteCobalah online!
Mengambil nilai yang dipisahkan koma. Juga berfungsi untuk Cb, B #, E #, Fb dan banyak # / b.
Penjelasan:
Penjelasan untuk eval:
sumber
Ruby , 56 byte
Cobalah online!
Huruf-huruf diurai sesuai dengan waktu kode ASCII mereka
5/3
sebagai berikut (ini memberikan jumlah semitones yang diperlukan ditambah offset 108)Karakter terakhir (
#
,b
atau huruf lagi) diurai sebagai kode ASCII dibagi dengan 32 sebagai berikutIni dikurangi dari kode huruf.
Kemudian hasil akhir dikembalikan sebagai
13-(difference in semitones)%12
sumber
Stax ,
2524 byteJalankan dan debug secara online
Representasi ascii yang sesuai dari program yang sama adalah ini.
Secara efektif, ini menghitung indeks keyboard dari setiap catatan menggunakan rumus, lalu menghitung interval yang dihasilkan.
2 - code / 32
manacode
kode ascii dari karakter terakhir.sumber
["F#","B"]
seharusnya 6.Batch,
136135 bytePenjelasan: Penggantian di
c
subrutin menggantikan#
nama catatan dengan+1
danb
dengan-1
. Karena hal ini tidak sensitif huruf,Bb
menjadi-1-1
. Variabel untukC
...A
(karena itu juga tidak peka huruf besar-kecil) oleh karena itu dipilih untuk menjadi jumlah semitones yang tepat dariB=-1
. String yang dihasilkan kemudian dievaluasi, dan trik @ xnor untuk mengurangi hasil dari nilai memberikan efek yang diinginkan dengan mengurangkan nilai catatan dari satu sama lain. Sunting: Akhirnya saya menggunakan trik @ Arnauld untuk mengurangi modulo dari 13 untuk mencapai jawaban yang diinginkan, menghemat 1 byte.sumber
Python 3 , 95 byte
Cobalah online!
-14 byte terima kasih kepada user71546
sumber
ord(q[0])-65
mengganti"ABCDEFG".find(q[0])
;)(g(b)+~g(a))%12+2
penggantian1+((g(b)-g(a))%12or 12)
Jelly , 28 byte
Tautan monadik yang menerima daftar dua daftar karakter dan mengembalikan integer.
Cobalah online! atau lihat semua kemungkinan kasus .
Bagaimana?
Melakukan beberapa aritmatika aneh pada tata cara karakter input untuk memetakan catatan ke bilangan bulat nol sampai dua belas dan kemudian melakukan dekompresi dasar sebagai proksi untuk modulo oleh dua belas di mana nol kemudian diganti dengan 12 kemudian menambahkan satu.
Juga pada 28 byte ...
Port (tidak langsung) dari jawaban Python 2 xnor ...
Coba semua kemungkinan kasus
sumber
CJam , 67 byte
Penerjemah online: http://cjam.aditsu.net/
sumber