Trompet çalmama yardım et


14

Trompet genellikle perdeli bir valfli nefesli enstrüman vardır B♭. Ses, enstrüman içindeki havayı değiştirmek için oyuncu dudaklarını titreştiğinde verilir. Bu titreşim, kişinin ağzını embouchure adı verilen belirli bir şekilde ayarlayarak elde edilir. Daha sıkı veya daha gevşek dudaklı farklı embouchures farklı perdeler üretir.

Ayrıca, trompetteki her bir valf de cihazın perdesini değiştirir. Bir valf basıldığında, aletin borusunun içindeki bir yolu kapatarak havanın daha uzun bir yoldan akmasını sağlar, böylece orijinal sesin perdesini düşürür. Bu meydan okuma için, B♭ilk valfin adımı tam adım düşürdüğü, ikincisi adımı yarım adım düşürdüğü ve üçüncüsü adımı bir ve bir düşürdüğü standart trompet dikkate alınacaktır. yarım adım.

Meydan okuma

Zorluğunuz, iki girdi verilen embouchureve valvesçalınan notanın perdesini belirleyen bir program veya işlev oluşturmaktır .

Bu zorluğun amaçları için, notlar diziyi takip edecektir:

B♭, B, C, C♯, D, E♭, E, F, F♯, G, G♯, A.

kurallar

  • G / Ç herhangi bir makul yöntemle alınabilir / verilebilir .
  • Standart boşluklar geçerlidir.
  • Kullanmanıza izin verilir bve #bunun yerine ve isterseniz.
  • İçin giriş valves, boşaltma valfleri listesi ( 1, 3) veya bir boole listesi ( 1, 0, 1) olarak alınabilir .
  • Bu , her dilde en kısa kod kazanır.

Test Durumları:

Valves bu test durumlarında, boole listesi olarak verilir; burada 0, depresif ve 1, basılı anlamına gelir.

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♯

Feragatname: Henüz bir müzisyen değilim, bu yüzden test senaryolarında yapabileceğim herhangi bir kasap için özür dilerim. Düzeltmeler takdir edilmektedir.


2
Burada perküsyoncu. Bekle, bekle işte böyle büyürsün. Her zaman bir ;-) ile başladığını düşündüm
MayorMonty

1
@vasilescur haklısın. Bunları gidereceğim ve olası diğer hataları inceleyeceğim. Söylediğin için teşekkürler.
J. Sallé

1
Uzun süre trompet çalmış biri olarak, Embouchure ölçümünden gerçekten kafam karıştı ... Örneğin, C # Embouchure nedir?
18'de bendl

1
Meli F# 100E F olmamak?
Level River St

2
@bendl Böyle bir şey yok. C#Herhangi bir valfe basmadan trompet üzerinde oynatamazsınız . Sadece belirli notlar ( B♭-F-B♭-D-F-A♭-B♭...), aşırı ton serisinin B♭. Yine de, gerçek bir enstrümanı yansıtmasa bile, zorluk mükemmel bir şekilde tanımlanmıştır.
Chris

Yanıtlar:


4

piton 3 2, 125 119 81 bayt

lambda e,f,s,t,n=2*'A G# G F# F E Eb D C# C B Bb'.split():n[n.index(e)+2*f+s+3*t]

Çevrimiçi deneyin!

Jonathan Allan sayesinde çok bayt kurtardı.


Orijinal çözümüm ( Python 3'te ):

n=2*'Bb B C C# D Eb E F F# G G# A'.split()
e,f,s,t=str(input()).split()
print(n[n.index(e,9)-2*int(f)-int(s)-3*int(t)])

Çevrimiçi deneyin!

@HyperNeutrino sayesinde 6 bayt tasarruf edildi.


açıklama

İlk olarak, notlar bir dizi yapmak, ancak uzunluğu iki katına, bu yüzden etrafında döngü hakkında endişelenmenize gerek Bbyok A.

Sonra, aşağıdaki biçimde girdi alıyorum (örneğin):

Bb 1 0 1

Daha sonra n.index(e,9)( notu 9iki katına) ortasında iyi başlamak emin olmak için kullanarak başlangıç ​​notunun dizinini bulmak . Ifade ile istenen ofset hesaplamak:

2*int(f) - int(s) - 3*int(t)

fBirinci valf nerede , sikinci valf ve tüçüncü valf .

Son olarak, ofseti başlangıç ​​dizininden çıkararak listede bulunan notu yazdırır.


3
boşluklarla ayırarak birkaç bayt kaydedin. "<some string>".split()varsayılan olarak boşluklara böler
HyperNeutrino

Python 2 taşıyarak (kaçınarak 30 bayt kaydet strve int(kaçınarak atmalarını ve değerlendirilen girdi sağlayan) ve notlar geri ileri mahsup ,9içinde index. Çağrısı Çevrimiçi Deneyin!
Jonathan Allan

... ve başka bir 8 harekete geçiyor (Python 2 veya 3'te çalışıyor) Çevrimiçi Deneyin!
Jonathan Allan

@JonathanAllan Geliştirmelerinizden birkaç Python golf hilesi öğrendim. Çok teşekkür ederim!
vasilescur

... aslında , negatif indeks asla sınırların dışına çıkmadığı için listeyi orijinal sırasına göre tekrarlayabilir ve değerleri çıkartabilirsiniz (en olumsuz, gerektiğinde 'Bb', 1, 1, 1dizine -6yönlendirirsiniz E) - TFeld'in sahip olduğu şey budur yapıldığından beri .
Jonathan Allan

3

Wolfram Dili (Mathematica) , 100 bayt (ve çalışan bir trompet için 134)

l="Bb,B,C,C#,D,Eb,E,F,F#,G,G#,A"~StringSplit~",";f=l[[Mod[#&@@#&@@l~Position~#-2#2-#3-3#4-1,12]+1]]&

Çevrimiçi deneyin!

Oldukça açık.

l="Bb,B,C,C#,D,Eb,E,F,F#,G,G#,A"~StringSplit~",";f=EmitSound@SoundNote[l[[Mod[#&@@#&@@l~Position~#-2#2-#3-3#4-1,12]+1]],1,"Trumpet"]&

34 bayt maliyeti için daha iyi bir çıktı.


Bekle ... Mathematica'nın Ses çıkışı var ??? Wicked!
Titus

Elbette Mathematica'nın ses çıkışı için yerleşik bir özelliği vardır. Bu altın.
J. Sallé

2

Jöle ,  37  36 bayt

ØAḣ7;⁾#b“®JXrẊỤȥ’ṃnŒl$œṗ$Ḋ©i_⁸æ.J¤ị®

Valfleri solda bir liste olarak 1s veya 0s listesi olarak kabul eden [second, first, third]ve sağda karakterlerin bir listesini döndüren karakter listesi olarak embouchure'u kabul eden ikili bir bağlantı .

Çevrimiçi deneyin!

Nasıl?

ØAḣ7;⁾#b“®JXrẊỤȥ’ṃnŒl$œṗ$Ḋ©i_⁸æ.J¤ị® - Link: list of integers, V; list of characters, E
ØA                                   - yield uppercase alphabet
  ḣ7                                 - head to index 7 = "ABCDEFG"
     ⁾#b                             - literal list of characters = "#b"
    ;                                - concatenate = "ABCDEFG#b"
        “®JXrẊỤȥ’                    - literal integer = 2270857278734171
                 ṃ                   - base decompress (i.e. convert to base 9 using the 'digits' "bABCDEFG#")
                                     -                 = "ABbBCC#DEbEFF#GG#"
                        $            - last two links as a monad:
                     $               -   last two links as a monad:
                   Œl                -     to lower case = "abbbcc#debeff#gg#"
                  n                  -     not equal? (vectorises) = [1,1,0,1,1,1,0,1,1,0,1,1,1,0,1,1,0]
                      œṗ             -   partition at truthy indices = [[],"A","Bb","B","C","C#","D","Eb","E","F","F#","G","G#"]
                         Ḋ           - dequeue = ["A","Bb","B","C","C#","D","Eb","E","F","F#","G","G#"]
                          ©          - copy to register and yield
                           i         - first index of E in there
                                 ¤   - nilad followed by links as a nilad:
                             ⁸       -   chain's left argument, V
                                J    -   range of length [1,2,3]
                              æ.     -   dot product (i.e. 1*second + 2*first + 3*third)
                            _        - subtract
                                   ® - recall from register
                                  ị  - index into (1-based and modular)


1

Javascript 96 bayt

@Vasilescur fikrini takiben, bu js

(a,b,c,d,_="B♭,B,C,C♯,D,E♭,E,F,F♯,G,G♯,A".split`,`)=>(l=_.concat(_))[l.indexOf(a,9)-(2*b+c+3*d)]

a=(a,b,c,d,_="B♭,B,C,C♯,D,E♭,E,F,F♯,G,G♯,A".split`,`)=>(l=_.concat(_))[l.indexOf(a,9)-(2*b+c+3*d)]
console.log(a('B♭',0,0,0))
console.log(a('B♭',0,1,0))
console.log(a('B♭',1,0,1))
console.log(a('C♯',0,0,1))
console.log(a('C♯',1,1,1))
console.log(a('E♭',1,0,0))
console.log(a('G',0,1,1))
console.log(a('G♯',1,0,0))
console.log(a('G♯',0,0,1))
console.log(a('G',1,0,0))
console.log(a('F♯',1,0,0))
console.log(a('D',1,0,1))
console.log(a('A',1,1,1))
console.log(a('E',1,1,0))
console.log(a('E',0,0,1))


3 byte daha az;) BTW düzlükler ve sivri uçlar 3 byte olarak sayılmalıdır, değil mi?
Shieru Asakoto

Nvm Ah (Ben görmedim bve #izin verilir) ancak kullanmak gerekir bve #bunun yerine daire ve Keskilerin.
Shieru Asakoto

1

Toplu, 188 bayt

@set n=%1
@set/aC=0,D=2,Eb=3,E=4,F=5,G=7,A=9,Bb=10,B=11,n=(%n:#=+1%+12-%2*2-%3-%4*3)%%12
@for %%n in (C.0 C#.1 D.2 Eb.3 E.4 F.5 F#.6 G.7 G#.8 A.9 Bb.10 B.11)do @if %%~xn==.%n% echo %%~nn

Kullanımları #ve b: bu araçlar Ebve Bbyasal değişken isimleridir; #, bir dize değiştirme işlemi yapılarak işlenir +1. Daha sonra dizi değişiminin sonucu otomatik olarak değerlendirilir ve sonuç bir listeye bakılmadan önce vanalar dikkate alınır.


1

Stax , 32 bayt

τ┤=Yº○!AÄΔâß₧←╥╟ö'ÄD├æñßf╧å▬tó÷╖

Çevrimiçi çalıştırın ve hata ayıklayın

Bir not adı ve depresif vanaların bir listesini alır. Bir dizi not adı oluşturur, ardından toplam vana aralığını hesaplar ve notu dizideki bu ofsetten alır.

"AbABbBCC#DEbEFF#G" just a literal
{VA#}(Y             partition at capital letters and store in y
,]I                 get the index of the input note
,2R:t               swap 1s and 2s in valve list
{-F                 subtract valve list from note index
y@                  look up result from note array

Bunu çalıştır




0

Perl6 / Rakudo 73 karakter

Teknik olarak bu 83 bayttır, çünkü Unicode karakterleri koydum, ancak ASCII eşdeğerleri için takas etmek 73 bayt verecekti.

Bunun {code block}gibi parametreleri $^aolan bir lambda, imzalı ($a, $b, $c, $d).

{$_=2*$^b+$^c+3*$^d;'AG♯GF♯FEE♭DC♯CBB♭'x 2~~/$^a(\w\W?)**{$_}/~~/\w\W?$/}

Bunu aramak:

say { ... }("D", 1, 0, 1)
>> A

Az-golfed:

sub f($a, $b, $c, $d) {
   my $totalShift = 2*$b + $c + 3*$d;
   my $doubledScale = 'AG♯GF♯FEE♭DC♯CBB♭' x 2;
   my $matchEmbOnward = $doubledScale ~~ / $^a (\w\W?)**{$totalShift} /;
   my $matchFinalNote = $marchEmbOnward ~~ / \w \W? $ /;
   return $matchFinalNote;
}

Burada '...' x 2, xinfix operatörünü kullanarak bir dizeyi ikiye katlıyoruz , daha sonra smartmatch operatörünü kullanarak embouchure ve n notlarını araıyoruz '...' ~~ /.../- üzerinde \w\W?bir kelime char olan regex menteşeleri, belki de kelime olmayan bir char.

Biz o aracılığıyla n örnekleri için bakmak (\w\W?)**{$_}zaten = n hesaplanan ettik $_params $biçin $d. Bu, embouchure notundan ortaya çıkan nota bir eşleşme sağlar, bunun sonuncusunu istiyoruz, böylece bunu başka biriyle eşleştiriyoruz ~~ /\w\W?$/.

İlk hesaplanması blokta örtük param oluşturulmasına $_izin vermek için gereklidir $^b.

76 karakter

Dize eşleşmeleri yerine bir dizi kullanan bir alternatif 3 karakter daha:

{$_=<B♭ B C C♯ D E♭ E F F♯ G G♯ A>;.[((.first: $^a,:k)-2*$^b-$^c-3*$^d)%12]}

Listede embouchure bulunması ile bulunur @arr.first: $^a, :k, bu bulunan öğenin dizinini (anahtarını) döndürür :k.

İçin diziyi ayarlanması $_(bir nesne olarak) bize kullanmanızı sağlar .firstve .[ ]çok fazla karakter harcamadan üzerinde.


0

C (gcc) , 155 bayt

char r[][12]={"bb","b","c","c#","d","eb","e","f","f#","g","g#","a"};u;v(z,y,x,w)char*z;{for(;u<12;u++)if(!strcmp(z,r[u]))break;u=u-2*y-x-3*w;u=u<0?12+u:u;}

Çevrimiçi deneyin!

Basit yaklaşım.

Valf girişi 0,1'dir.

Embouchure girişi küçük harf olmalıdır. İlginç bir şekilde, TiO strcmpi()dahil etmeden string.hbulmuyor, mingw-gcc ise standart -Wimplicit-function-declarationuyarıyla izin veriyor .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.