Penyegaran musik cepat:
Keyboard piano terdiri dari 88 catatan. Pada setiap oktaf, ada 12 nada, C, C♯/D♭, D, D♯/E♭, E, F, F♯/G♭, G, G♯/A♭, A, A♯/B♭
dan B
. Setiap kali Anda menekan 'C', polanya mengulang satu oktaf lebih tinggi.
Sebuah not diidentifikasi secara unik oleh 1) huruf, termasuk benda tajam atau flat, dan 2) oktaf, yang merupakan angka dari 0 hingga 8. Tiga not pertama keyboard, adalah A0, A♯/B♭
dan B0
. Setelah ini muncul skala kromatik penuh pada oktaf 1. C1, C♯1/D♭1, D1, D♯1/E♭1, E1, F1, F♯1/G♭1, G1, G♯1/A♭1, A1, A♯1/B♭1
dan B1
. Setelah ini muncul skala kromatik penuh pada oktaf 2, 3, 4, 5, 6, dan 7. Kemudian, nada terakhir adalah a C8
.
Setiap nada berhubungan dengan frekuensi dalam kisaran 20-4100 Hz. Dengan A0
mulai tepat pada 27.500 hertz, setiap not yang sesuai adalah not sebelumnya dikalikan akar kedua belas, atau sekitar 1.059463. Formula yang lebih umum adalah:
di mana n adalah jumlah not, dengan A0 menjadi 1. (Informasi lebih lanjut di sini )
Tantangan
Tulis program atau fungsi yang mengambil string yang mewakili catatan, dan mencetak atau mengembalikan frekuensi catatan itu. Kami akan menggunakan tanda pound #
untuk simbol tajam (atau tagar untuk Anda anak muda) dan huruf kecil b
untuk simbol datar. Semua input akan terlihat seperti (uppercase letter) + (optional sharp or flat) + (number)
tanpa spasi. Jika input berada di luar kisaran keyboard (lebih rendah dari A0, atau lebih tinggi dari C8), atau ada karakter yang tidak valid, hilang atau tambahan, ini adalah input yang tidak valid, dan Anda tidak harus menanganinya. Anda juga dapat dengan aman berasumsi bahwa Anda tidak akan mendapatkan input aneh seperti E #, atau Cb.
Presisi
Karena ketepatan tanpa batas tidak benar-benar mungkin, kami akan mengatakan bahwa apa pun dalam satu sen dari nilai sebenarnya dapat diterima. Tanpa masuk ke rincian berlebih, satu sen adalah akar ke dua dari 1200, atau 1.0005777895. Mari kita gunakan contoh nyata untuk membuatnya lebih jelas. Katakanlah input Anda adalah A4. Nilai pasti dari catatan ini adalah 440 Hz. Sekali datar sen 440 / 1.0005777895 = 439.7459
. 440 * 1.0005777895 = 440.2542
Oleh karena itu, tajam satu sen adalah angka yang lebih besar dari 439.7459 tetapi lebih kecil dari 440.2542 cukup tepat untuk dihitung.
Uji kasus
A0 --> 27.500
C4 --> 261.626
F#3 --> 184.997
Bb6 --> 1864.66
A#6 --> 1864.66
A4 --> 440
D9 --> Too high, invalid input.
G0 --> Too low, invalid input.
Fb5 --> Invalid input.
E --> Missing octave, invalid input
b2 --> Lowercase, invalid input
H#4 --> H is not a real note, invalid input.
Ingatlah bahwa Anda tidak harus menangani input yang tidak valid. Jika program Anda berpura-pura itu adalah input nyata dan mencetak nilai, itu dapat diterima. Jika program Anda macet, itu juga dapat diterima. Apa pun bisa terjadi ketika Anda mendapatkannya. Untuk daftar lengkap input dan output, lihat halaman ini
Seperti biasa, ini adalah kode-golf, sehingga celah standar berlaku, dan jawaban tersingkat dalam byte menang.
H
?H
artinya B adalah AFAIK hanya digunakan di negara-negara berbahasa Jerman. (di manaB
artinya Bb omong-omong.) Apa yang disebut orang Inggris dan Irlandia B disebut Si atau Ti di Spanyol dan Italia, seperti dalam Do Re Mi Fa Sol La Si.H
digunakan di Jerman, Republik Ceko, Slovakia, Polandia, Hongaria, Serbia, Denmark, Norwegia, Finlandia, Estonia, dan Austria, menurut Wikipedia . (Saya juga bisa mengkonfirmasinya untuk Finlandia sendiri.)Jawaban:
Japt,
41373534 byteSaya akhirnya memiliki kesempatan untuk memanfaatkan
¾
dengan baik! :-)Cobalah online!
Bagaimana itu bekerja
Uji kasus
Semua test case yang valid datang dengan baik. Itu yang tidak valid di mana ia menjadi aneh ...
sumber
Pyth,
464443423935 byteCobalah online. Suite uji.
Kode sekarang menggunakan algoritma yang mirip dengan jawaban Japt ETHproductions , jadi kredit kepadanya untuk itu.
Penjelasan
Versi lama (42 byte, 39 w / string yang dipadatkan)
Penjelasan
Tampilkan cuplikan kode
sumber
Mathematica, 77 byte
Penjelasan :
Gagasan utama dari fungsi ini adalah untuk mengubah string nada ke nada relatifnya, dan kemudian menghitung frekuensinya.
Metode yang saya gunakan adalah mengekspor suara ke midi dan mengimpor data mentah, tetapi saya curiga ada cara yang lebih elegan.
Kasus uji :
sumber
MATL ,
56535049 48 byteMenggunakan rilis saat ini (10.1.0) , yang lebih awal dari tantangan ini.
Cobalah online !
Penjelasan
sumber
JavaScript ES7,
737069 byteMenggunakan teknik yang sama dengan jawaban Japt saya .
sumber
Ruby,
6965Tidak digabungkan dalam program uji
Keluaran
sumber
ES7, 82 byte
Mengembalikan 130.8127826502993 pada input "B # 2" seperti yang diharapkan.
Sunting: Disimpan 3 byte berkat @ user81655.
sumber
2*3**3*2
adalah 108 di konsol browser Firefox, yang setuju dengan2*(3**3)*2
. Perhatikan juga bahwa halaman itu juga mengatakan bahwa?:
memiliki prioritas lebih tinggi daripada=
tetapi mereka sebenarnya memiliki prioritas yang sama (pertimbangkana=b?c=d:e=f
).**
jadi saya tidak pernah bisa mengujinya. Saya pikir?:
memang memiliki prioritas lebih tinggi daripada=
karena karena dalam contoh Andaa
diatur ke hasil ternary, daripadab
, kemudian mengeksekusi ternary. Dua penugasan lain terlampir di ternary sehingga menjadi kasus khusus.e=f
di dalam ternary?a=b?c=d:e=f?g:h
. Jika mereka diutamakan yang sama dan terner pertama berakhir=
setelahe
, itu akan menyebabkan kesalahan tugas kiri tidak valid.?:
memiliki prioritas lebih tinggi daripada yang sebenarnya=
. Ekspresi perlu dikelompokkan seolah-olaha=(b?c=d:(e=(f?g:h)))
. Anda tidak dapat melakukan itu jika mereka tidak memiliki prioritas yang sama.C, 123 byte
Pemakaian:
Nilai yang dihitung selalu sekitar 0,8 sen kurang dari nilai yang tepat, karena saya memotong angka sebanyak mungkin dari angka floating-point.
Tinjauan umum kode:
sumber
R,
157150141136 byteDengan indentasi dan baris baru:
Pemakaian:
sumber
Python,
9795 byteBerdasarkan pendekatan lama Pietu1998 (dan lainnya) dalam mencari indeks catatan dalam string
'C@D@EF@G@A@B'
untuk beberapa char kosong atau yang lain. Saya menggunakan iterable unpacking untuk mengurai string catatan tanpa persyaratan. Saya melakukan sedikit aljabar pada akhirnya untuk menyederhanakan ekspresi konversi. Tidak tahu apakah saya bisa membuatnya lebih pendek tanpa mengubah pendekatan saya.sumber
b==['#']
bisa disingkat menjadi'#'in b
, dannot b
untukb>[]
.Bahasa Wolfram (Mathematica), 69 byte
Menggunakan paket musik , yang dengannya hanya memasukkan catatan sebagai ekspresi mengevaluasi frekuensinya, seperti ini:
Untuk menyimpan byte dengan menghindari untuk mengimpor paket dengan
<<Music
, saya menggunakan nama-nama yang memenuhi syarat:Music`Eflat3
. Namun, saya masih harus menggantib
denganflat
dan#
dengansharp
untuk mencocokkan format input pertanyaan, yang saya lakukan dengan sederhanaStringReplace
.sumber