Tugas
Tulis program untuk menentukan nada yang dibunyikan, bersama dengan berapa sen yang tidak selaras, dari senar yang disetel ke frekuensi tertentu dan tekan ke bawah pada titik tertentu.
Demi kesederhanaan, anggaplah bahwa frekuensi suara yang dihasilkan dan panjang tali di sebelah kanan tempat penekanannya berbanding terbalik.
Catatan: tugas ini hanya membahas nada dasar, dan tidak dengan nada tambahan / harmonik lainnya.
Memasukkan
Program Anda diberi dua bagian data:
String yang panjangnya sewenang-wenang, mewakili string yang dimaksud. String ini akan ditandai dengan X di mana string harus ditekan.
[-----] is a string divided in six sections (five divisions). [--X--] is a string pressed at the exact center of the string. [X----] is a string pressed at 1/6 the length of the string. (Length used is 5/6) [-X--] is a string pressed at 2/5 of the length of the string. (Length used is 3/5)
Asumsikan nada dibunyikan menggunakan bagian dari string di sebelah kanan
X
.- Angka (tidak harus bilangan bulat), menandakan frekuensi di mana string disetel. Ketepatan angka ini akan paling banyak empat digit melewati desimal.
Dapat diasumsikan bahwa frekuensi yang dilewati akan berada di antara 10 Hz
dan 40000 Hz
.
Input dapat diberikan dalam format pilihan Anda. Silakan tentukan bagaimana input diterima ke dalam program Anda dalam jawaban Anda.
Keluaran
Program Anda harus menampilkan kedua nada terdekat * dalam sistem tuning temperamen sama dua belas nada, dan jumlah sen jauh dari nada terdekat bahwa suara yang dilambangkan oleh string akan (dibulatkan ke sen terdekat).
+n
sen harus digunakan untuk menunjukkan n
sen tajam / di atas not, dan -n
sen untuk flat / di bawah not.
Catatan tersebut harus dikeluarkan dalam notasi pitch ilmiah. Asumsikan A4 disetel ke 440Hz
. Gunakan b dan # untuk nada datar / tajam. Catatan: Baik tajam atau rata dapat digunakan. Untuk catatan di 466.16Hz
, baik A#
atau Bb
dapat dikeluarkan untuk catatan.
Format output terserah Anda, selama output hanya berisi dua informasi yang ditentukan sebelumnya (yaitu mencetak setiap output yang mungkin tidak diperbolehkan).
* catatan terdekat mengacu pada catatan yang paling dekat dengan suara yang dilambangkan dengan input, diukur dalam jumlah sen (oleh karena itu, catatan yang berada dalam 50 cents
suara). Jika suara 50 cents
jauh dari dua not yang berbeda (setelah pembulatan), maka salah satu dari kedua not tersebut dapat dikeluarkan.
Contohnya
Program Anda harus bekerja untuk semua kasus, bukan hanya contoh-contoh berikut.
Output Input Frequency Input String
A4, +0 cents 220 [-----X-----]
A5, +0 cents 220 [--------X--]
D5, -2 cents 440 [--X--------]
B4, -49 cents 440 [X----------]
A#4, +19 cents* 314.1592 [X-]
Eb9, +8 cents* 400 [-----------------------X]
Eb11,+8 cents* 100 [--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------X]
D#1, +49 cents* 10 [--X]
A0, -11 cents 11.7103 [---X--]
* Baik tajam atau rata bisa dihasilkan.
Tautan yang Berpotensi Bermanfaat
Ini kode-golf sehingga jawaban terpendek menang.
[--X--]
string ditekan di tengah divisi di manax
ditempatkan, sedangkan yang terakhir[-X--]
akan berada di 3/8 (bukan 2/5) saat mengikuti logika ini. Atau apakah saya mengerti sesuatu yang salah?[-X--]
string dibagi di 4 tempat (dan karenanya menjadi 5 bagian), dan ditekan pada bagian kedua dari pembagian ini. Dengan demikian, ditekan pada2/5
, dan panjang yang digunakan adalah3/5
.-
pada dasarnya mewakili posisi divisi, terima kasih telah menjelaskan!Jawaban:
BBC Basic, 161 #
Skor tidak termasuk komentar. Belum bermain golf.
Keluaran
Berfungsi dengan benar pada semua test case kecuali dua yang panjang. Karena
Eb9
tampaknya ada satu tanda hubung yang hilang dari test case: Ada 22-
dan satuX
, yang membagi string menjadi 24 bagian yang sama. Menurut perhitungan manual saya, ini adalah 9600Hz, yaitu 37 sen di atas D9. Inilah yang dihasilkan oleh program saya. Jika saya menambahkan tanda hubung lain, saya mendapatkan Eb9 + 8 sen. Sayangnya, BBC Basic tidak dapat menangani string lebih dari 255 karakter, jadiEb11
case ini memberikan kesalahan.sumber
C, 179
Menerima gambar ascii pada suatu garis dengan sendirinya, dan frekuensi pada suatu garis yang terpisah.
Beberapa karakter dapat dijatuhkan dengan mengurangi akurasi angka ajaib
17.3123
dan57.376
.Tanpa bermain golf, programnya terlihat seperti ini:
sumber
scanf
string format yang mengagumkan . Saya tidak tahu Anda bisa melakukan itu. Saya akan memeriksa kode output Anda nanti (saya berpikir untuk melakukan ini di C dan meskipun sesuatu yang serupa terjadi pada saya untuk output, saya tidak bisa melihat cara untuk melakukan semuanya secara kompetitif.) Saya berasumsid+9
karena Anda diindeks pada note A sehingga Anda harus menyesuaikan angka oktaf dengan indeks pada note C: Saya ingin tahu apakah ada cara lain.JavaScript (199)
Sebut saja misalnya sebagai
t('[X-]',314.1592)
Tetap. (Karena saya tinggal di eropa saya menggunakan B bukan Bb dan H bukan B =)
sumber
t('[---X--]',11.7103)
(contoh terakhir) memberi-10
bukan-11
p="C0C#0D0D#0E0F0F#0G0G#0A0B0H".split(0)
menghemat 2 karakter tambahan.round(x) = x+.5|0
yang hanya benar untuk angka positif, saya akan memperbaikinya nanti. @ipi terima kasih!Python 3: 175
Tidak Disatukan:
sumber