Kemarin, saya membeli harmonika:
Gambar 1: Harmonika.
Namun, impian saya untuk dapat memainkan harmonika blues yang menggetarkan jiwa yang menggerakkan orang dan menyebabkan seorang pria dewasa menangis dengan cepat hancur oleh dua masalah:
- Harmonika hanya dapat memainkan not tertentu;
- Saya sangat buruk bermain harmonika.
Terlepas dari kurangnya keterampilan saya di harmonika, masih ada beberapa lagu yang bisa saya mainkan di sana. Namun, tidak segera jelas apakah saya dapat memainkan musik di harmonika atau tidak. Dengan memberikan not pada sebuah karya musik, tulislah sebuah program untuk menentukan apakah saya dapat memutarnya di harmonika atau tidak.
Seperti yang ditunjukkan gambar di atas, harmonika saya memiliki sepuluh lubang di dalamnya. Dengan setiap lubang, saya bisa menghembuskannya atau menghirupnya - lubang yang saya pilih, dan apakah saya menghirup atau menghembuskannya, mengubah nada suara yang dihasilkan. Setiap lubang memiliki nada yang berbeda untuk mengeluarkan dan menghirup, tetapi ada beberapa kombinasi yang menghasilkan nada yang sama. Secara keseluruhan, harmonika saya dapat memainkan 19 nada yang berbeda. Pitch-pitch tersebut disajikan dalam notasi ilmiah musikal - surat itu mewakili not tersebut, dan angka tersebut menunjukkan oktaf mana.
Hole Breathing Note
1 Exhale C4
1 Inhale D4
2 Exhale E4
2 Inhale G4
3 Exhale G4
3 Inhale B4
4 Exhale C5
4 Inhale D5
5 Exhale E5
5 Inhale F5
6 Exhale G5
6 Inhale A5
7 Exhale C6
7 Inhale B5
8 Exhale E6
8 Inhale D6
9 Exhale G6
9 Inhale F6
10 Exhale C7
10 Inhale A6
Misalnya, jika saya menghembuskan napas di lubang 3, saya akan mendapat G4
catatan. Jika saya menghirup pada lubang 2, saya juga akan mendapatkan G4
catatan. Jika saya menghembuskan napas pada lubang 7, saya akan mendapatkan C6
.
Ketika saya bernapas ke harmonika, selain menghembuskan napas atau menghirup, saya juga dapat memilih apakah akan bernapas tipis atau luas . Pernapasan tipis menyebabkan hanya satu lubang untuk berbunyi, sedangkan bernapas secara luas menyebabkan satu lubang dan kedua lubang di kedua sisi lubang itu berbunyi. Saya tidak memiliki keterampilan embouchure untuk meniup ke dua lubang - itu salah satu atau tiga.
Sebagai contoh, jika saya mengeluarkan sedikit ke lubang 4, hanya lubang 4 akan terdengar, jadi saya akan mendapatkan suara C5. Jika saya banyak dihembuskan ke lubang 4, lubang 3, 4, dan 5 akan terdengar, dan saya akan mendapatkan kunci G4, C5, E5. Jika saya secara luas menghirup ke lubang 4, lubang 3, 4, dan 5 akan terdengar tetapi mereka akan memainkan nada tarik napas sebagai gantinya, yang menghasilkan akord B4, D5, F5. Perhatikan bahwa untuk lubang di kedua ujungnya, jika saya menarik napas secara luas ke dalamnya, hanya dua lubang yang akan berbunyi (karena tidak ada lubang 0 atau lubang 11).
Namun, saya tidak bisa menghirup dan menghembuskan napas secara bersamaan. Misalnya, saya bisa menghembuskan napas ke dalam lubang 4, 5, dan 6 untuk menghasilkan nada C5, E5, dan G5 yang terdengar bersamaan, membentuk akor. Namun, saya tidak bisa menghirup dan menghembuskan napas pada saat yang sama, jadi tidak mungkin bagi saya untuk memainkan akor C5, F5, A5 karena saya harus entah bagaimana menghembuskan napas di lubang 4 dan menghirup di lubang 5 dan 6. Jika ini masih belum jelas, utas komentar ini mungkin berguna.
Masukan adalah catatan musik. Catatan tersebut dinotasikan dengan cara yang sama seperti yang disebutkan di atas dalam tabel, dan dipisahkan dengan koma. Catatan yang dibungkus dengan kurung keriting mewakili akor Contohnya:
C4,D4,G4,{D5,F5,A5},B5
Ini berarti, "C4, lalu D4, lalu G4, lalu D5, F5, dan A5 pada saat yang sama, lalu B5." Program Anda akan mengambil string dalam format ini sebagai input dan output True
jika mungkin bagi saya untuk memainkan musik pada harmonika saya, atau False
sebaliknya. Untuk input dan output sampel, contoh di atas harus berupa output True
. Input {C5,F5,A5}
di sisi lain akan ditampilkan False
.
Ini kode golf, jadi entri terpendek menang.
Berikut ini beberapa kasus uji:
Input (skala AC Mayor):
C4,D4,E4,F4,G4,A4,B4,C5
Keluaran:
False
(karena harmonika tidak dapat memainkan F4 atau A4)
Input (2 bilah pembuka dari Let It Go ):
E6,F6,A5,E6,F6,F6,E6,A5,F6,E6
Keluaran:
True
Memasukkan:
{E6,G6,F6}
Keluaran:
False
Memasukkan:
{G4,C5,E5},{F5,A5,B5}
Keluaran:
True
Anda dapat mengasumsikan bahwa akor akan datang dalam urutan nada yang lebih rendah ke yang lebih tinggi.
Jawaban:
Python -
218209189 karakterMinimal:
Untuk kemudahan membaca:
Diberikan string yang diformat seperti dalam deskripsi masalah,
t
kembaliTrue
jika urutan dimainkan pada harmonika yang dijelaskan, danFalse
jika tidak.Tidak ada tanda cek untuk urutan not di akord. Kecuali dikatakan sebaliknya, saya percaya ini sudah cukup karena itu tidak ada dalam pernyataan masalah, dan itu lolos semua tes yang diberikan di:
sumber
] if "".join(x) not
->]if"".join(x)not
Kata kunci dapat berdekatan dengan string sehingga"and"
benar.Javascript -
245243 karakterDiperkecil:
Dan diperluas:
Fungsi
p
menerima string sebagai input dan kembaliTrue
jika urutan not / chord dimainkan,False
jika tidak. Ini mengembalikan hasil yang tidak ditentukan jika input tidak valid secara sintaksis.Ini juga dengan berani mengasumsikan bahwa not akor dimasukkan dalam urutan lubang naik (seperti dalam contoh).
Hitungan karakter dapat dikurangi hingga 14 jika fungsi dibolehkan mengembalikan logika
true
danfalse
bukannya string yang setara.sumber
JavaScript (ES6), 230
Hanya versi jawaban @ COTO yang ditulis ulang:
Akan menghargai setiap tips tentang bermain golf ini lebih jauh karena saya mulai belajar ES6! :-)
sumber
Scala 178
Tidak Disatukan:
Perhatikan bahwa input yang cacat ditangani dengan buruk - string apa pun diterima, dan banyak string yang salah mengembalikan benar, misalnya:
cetakan benar.
sumber
Rebol - 188
Tidak Disatukan:
Contoh penggunaan (dalam konsol Rebol):
Sementara kode ini akan menangkap omong kosong seperti ini:
Namun itu akan memungkinkan hal-hal seperti ini melalui:
Karena itu parsing sebagai "C4, D4".
Ini versi kode yang lebih ketat:
Golf ini turun hingga 228 karakter dan sekarang kembali
false
pada ...sumber
JavaScript ES6,
211209190 karakterSaya tahu ini bisa golf lebih lanjut. Saya akan mencoba melakukannya dalam beberapa jam;
Jalankan kode ini di Web Console Firefox Terbaru, Anda akan mendapatkan metode bernama
C
yang kemudian dapat Anda panggilC("{G4,C5,E5},{F5,A5,B5}")
dan akan kembaliTrue
atauFalse
sesuai.Saya mengasumsikan input yang valid secara sintaksis.
EDIT : Sederhana regex dan cek panjang.
sumber