The terompet adalah instrumen telepon udara valved, biasanya berkemah di B♭
. Suara itu dibuat ketika pemain menggetarkan bibir mereka untuk memindahkan udara di dalam instrumen. Getaran itu diperoleh dengan mengatur mulut seseorang dengan cara tertentu, yang disebut embouchure. Berbagai kantong yang berbeda, dengan bibir yang lebih kencang atau longgar, menghasilkan nada yang berbeda.
Selain itu, setiap katup dalam terompet juga mengubah nada instrumen. Ketika ditekan, katup menutup jalur di dalam tabung instrumen, membuat aliran udara melalui jalur yang lebih panjang, sehingga menurunkan nada suara asli. Untuk keperluan tantangan ini, kami akan mempertimbangkan standar, B♭
terompet, di mana katup pertama menurunkan nada dengan langkah penuh, yang kedua menurunkan nada dengan setengah langkah, dan yang ketiga menurunkan nada dengan satu dan satu setengah langkah.
Tantangan
Tantangan Anda adalah membuat program atau fungsi yang, diberi dua input embouchure
dan valves
, menentukan nada not yang sedang diputar.
Untuk keperluan tantangan ini, catatan akan mengikuti urutan:
B♭, B, C, C♯, D, E♭, E, F, F♯, G, G♯, A.
Aturan
- I / O dapat diambil / diberikan dengan metode yang masuk akal .
- Celah standar berlaku.
- Anda diizinkan untuk menggunakan
b
dan#
bukannya♭
dan♯
jika Anda mau. - Input untuk
valves
dapat diambil sebagai daftar katup depresi (1, 3
) atau daftar boolean (1, 0, 1
). - Ini adalah kode-golf , sehingga kode terpendek di setiap bahasa menang.
Kasus uji:
Valves
dalam kasus uji ini diberikan sebagai daftar boolean, di mana 0 berarti tertekan dan 1 berarti ditekan.
Embouchure: Valves: Output:
B♭ 0 0 0 B♭
B♭ 0 1 0 A
B♭ 1 0 1 F
C♯ 0 0 1 B♭
C♯ 1 1 1 G
E♭ 1 0 0 C♯
G 0 1 1 E♭
G♯ 1 0 0 F♯
G♯ 0 0 1 F
G 1 0 0 F
F♯ 1 0 0 E
D 1 0 1 A
A 1 1 1 E♭
E 1 1 0 C♯
E 0 0 1 C♯
Penafian: Saya belum banyak menjadi musisi, jadi saya minta maaf atas pemotongan yang mungkin saya lakukan pada kasus uji. Koreksi dihargai.
F# 100
E bukan F?C#
trompet tanpa menekan katup apa pun. Hanya catatan khusus (B♭-F-B♭-D-F-A♭-B♭...
), seri nadaB♭
. Namun, bahkan jika itu tidak mencerminkan instrumen nyata tantangannya didefinisikan dengan sangat baik.Jawaban:
Python
32,12511981 byteCobalah online!
Menyimpan banyak byte berkat Jonathan Allan.
Solusi asli saya (dalam Python 3 ):
Cobalah online!
Disimpan 6 byte berkat @HyperNeutrino.
Penjelasan
Pertama, saya membuat array catatan, tetapi panjangnya dua kali lipat jadi saya tidak perlu khawatir tentang perulangan dari
Bb
keA
.Lalu, saya mengambil input dalam format berikut (misalnya):
Saya kemudian menemukan indeks catatan awal menggunakan
n.index(e,9)
(9
ada di sana untuk memastikan bahwa saya mulai dengan baik di tengah daftar (dua kali lipat). Saya menghitung offset yang diinginkan dengan ekspresi:Di mana
f
katup pertama,s
katup kedua, dan katupt
ketiga.Akhirnya, ia hanya mencetak catatan yang ditemukan dalam daftar dengan mengurangi offset dari indeks awal.
sumber
"<some string>".split()
terbagi secara spasi putih secara defaultstr
danint
gips dan memungkinkan masukan dievaluasi) dan membalikkan catatan dan mengimbangi maju (menghindari,9
diindex
. Panggilan Cobalah online!'Bb', 1, 1, 1
membawa Anda ke indeks-6
yang akanE
, sesuai kebutuhan) - itulah yang dimiliki TFeld sejak selesai .Bahasa Wolfram (Mathematica) , 100 byte (dan 134 untuk trompet yang berfungsi)
Cobalah online!
Cukup mudah.
Output yang lebih baik untuk biaya 34 byte.
sumber
Jelly ,
3736 byteSebuah link diad yang menerima katup sebagai daftar
1
s atau0
s sebagai daftar yang mewakili[second, first, third]
di sebelah kiri dan kotak sebagai daftar karakter di sebelah kanan yang mengembalikan daftar karakter.Cobalah online!
Bagaimana?
sumber
Ruby , 71 byte
Cobalah online!
70 karakter tetapi 80 byte
Cobalah online!
sumber
Javascript 96 byte
Mengikuti ide @vasilescur, ini adalah implementasi di js
sumber
b
dan#
diizinkan) tetapi Anda harus menggunakanb
dan#
bukannya flat dan benda tajam.Batch, 188 byte
Menggunakan
#
danb
: ini berarti bahwaEb
danBb
merupakan nama variabel hukum;#
ditangani dengan melakukan penggantian string ke+1
. Hasil penggantian string kemudian secara otomatis dievaluasi dan katup kemudian diperhitungkan sebelum hasilnya dicari dalam daftar.sumber
Stax , 32 byte
Jalankan dan debug secara online
Dibutuhkan nama catatan dan daftar katup yang tertekan. Itu membangun array nama catatan, kemudian menghitung interval katup total, dan mendapatkan catatan itu diimbangi dalam array.
Jalankan yang ini
sumber
Python 2 ,
8479 byteCobalah online!
sumber
C (gcc) ,
92 8682 byteCobalah online!
Diadaptasi dari implementasi @ Vazt .
sumber
Perl6 / Rakudo 73 karakter
Secara teknis ini adalah 83 byte karena saya memasukkan karakter Unicode, tetapi menukarnya dengan ASCII setara akan memberikan 73 byte.
Sebagai
{code block}
parameter dengan seperti$^a
ini adalah lambda, dengan tanda tangan($a, $b, $c, $d)
.Sebut saja:
Kurang bermain golf:
Di sini kita menggandakan string
'...' x 2
menggunakanx
operator infiks, kemudian mencari embouchure diikuti oleh n catatan menggunakan operator smartmatch'...' ~~ /.../
- regex bergantung pada\w\W?
yang merupakan kata char kemudian mungkin char non-kata.Kami mencari n contoh dari itu via
(\w\W?)**{$_}
, di mana kami telah menghitung n =$_
dari params$b
ke$d
. Ini menghasilkan kecocokan dari catatan embouchure ke catatan yang dihasilkan, yang kami hanya ingin yang terakhir jadi kami cocokkan dengan yang lain~~ /\w\W?$/
.Perhitungan
$_
pertama diperlukan untuk mengizinkan$^b
pembuatan param implisit di blok.76 karakter
Alternatif menggunakan array daripada pencocokan string adalah 3 karakter lainnya:
Menemukan embouchure dalam daftar dicapai dengan
@arr.first: $^a, :k
, yang mengembalikan indeks (kunci) dari elemen yang ditemukan dengan:k
.Mengatur array ke
$_
(sebagai objek) memungkinkan kita menggunakan.first
dan menggunakannya.[ ]
tanpa menghabiskan terlalu banyak karakter.sumber
C (gcc) , 155 byte
Cobalah online!
Pendekatan sederhana.
Input katup adalah 0,1.
Input embouchure harus huruf kecil. Menariknya, TiO tidak menemukan
strcmpi()
tanpa menyertakanstring.h
, sedangkan mingw-gcc memungkinkannya dengan-Wimplicit-function-declaration
peringatan standar .sumber