トランペットの演奏を手伝ってください


14

トランペットは、通常で登板バルブ付きaerophone機器、ですB♭。プレイヤーが唇を振動させて楽器内の空気を移動させると、音が鳴ります。その振動は、アンブシュアと呼ばれる特定の方法で口を設定することによって取得されます。唇がよりタイトまたはルーズなアンブシュアは、ピッチが異なります。

さらに、トランペットの各バルブは、楽器のピッチも変更します。押されると、バルブが楽器のチューブ内の経路を閉じ、空気が長い経路を流れるようにし、元の音のピッチを下げます。この課題のために、標準のB♭トランペットを考えます。最初のバルブはピッチをフルステップ下げ、2番目はピッチをハーフステップ下げ、3番目はピッチを1段下げ、半歩。

チャレンジ

あなたの課題は、2つの入力embouchureとが与えられたときvalvesに、演奏されるノートのピッチを決定するプログラムまたは関数を作成することです。

このチャレンジの目的のために、メモはシーケンスに従います。

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

ルール

  • I / Oは、合理的な方法で取得/指定できます。
  • 標準の抜け穴が適用されます。
  • 必要に応じて、bおよびの#代わりに使用することができます。
  • の入力はvalves、押し下げられたバルブのリスト(1, 3)またはブールリスト(1, 0, 1)として取得できます。
  • これはなので、各言語で最も短いコードが優先されます。

テストケース:

Valves これらのテストケースでは、0が押され、1が押されたことを意味するブールリストとして与えられます。

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♯

免責事項:私はまだミュージシャンではないので、テストケースで行ったかもしれない屠殺について謝罪します。訂正を歓迎します。


2
ここで打楽器奏者。待って、待って、それがアンブシュアのスペルです。常にそれがa ;-)で始まったと考えていた
MayorMonty

1
@vasilescurあなたは正しい。それらを修正し、その他の可能性のある間違いを確認します。ヘッドアップをありがとう。
J.サレ

1
長い間トランペットを演奏している人として、私はEmbouchureの測定値に本当に混乱しています...たとえば、C#Embouchureとは何ですか?
-18:39

1
すべきであるF# 100EないFなりますか?
レベルリバーセント

2
@bendlそのようなことはありません。C#バルブを押さずにトランペットを演奏することはできません。特定の音符(B♭-F-B♭-D-F-A♭-B♭...)、の倍音シリーズB♭。それでも、実際の楽器を反映していない場合でも、課題は完全に明確に定義されています。
クリス

回答:


4

Python 3 2、 125 119 81バイト

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]

オンラインでお試しください!

ジョナサンアランのおかげで多くのバイトを節約できました。


私の元のソリューション(Python 3で):

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)])

オンラインでお試しください!

@HyperNeutrinoのおかげで6バイト節約されました。


説明

最初に、ノートの配列を作成しますが、長さを2倍にしたので、からBbにループすることを心配する必要はありませんA

次に、次の形式(たとえば)で入力します。

Bb 1 0 1

私は、使用開始のノートのインデックスを見つけるn.index(e,9)9必ず私が(倍)リストの途中でうまく始めることを確認することがあり、私が表現して所望のオフセットを計算します。:

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

どこfが最初のバルブ、s2番目のバルブ、t3 番目のバルブです。

最後に、開始インデックスからオフセットを減算することにより、リストで見つかったノートを単に印刷します。


3
スペースで区切って数バイト節約します。"<some string>".split()デフォルトで空白で分割
HyperNeutrino

(回避のPython 2に移動することで保存30バイトstrint回避(キャストと評価された入力が可能)やメモを逆転し、前方の相殺,9indexコール。オンラインそれを試してみてください!
ジョナサン・アラン

...そして別の8つの機能に移行(Python 2または3で動作)オンラインで試してみてください!
ジョナサンアラン

@JonathanAllan私はあなたの改善からいくつかのPythonゴルフのトリックを学びました。どうもありがとうございます!
-vasilescur

...実際、リストを繰り返しずに元の順序で使用し、負のインデックスが範囲外になることはないため、値を減算できます(最も負の値は、必要に応じ'Bb', 1, 1, 1てインデックスに移動-6しますE)-それはTFeldが持っているものです以来
ジョナサンアラン

3

Wolfram言語(Mathematica)、100バイト(および動作するトランペットの場合は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]]&

オンラインでお試しください!

とても簡単です。

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バイトのコストでより良い出力。


待ってください... Mathematicaにはオーディオ出力がありますか?邪悪な!
タイタス

@タイタスはい。音のノートについては、midiによって提供されます
Keyu Gan

もちろん、Mathematicaにはオーディオ出力用のビルトインがあります。これは金です。
J.サレ

2

ゼリー 37  36 バイト

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

バルブを1sまたは0sのリストとして受け入れ、[second, first, third]左側にアンブシュアを、右側に文字のリストとして返し、文字のリストを返すダイアディックリンク。

オンラインでお試しください!

どうやって?

Ø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バイト

@vasilescurのアイデアに従って、これは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バイト少ない;)ところで、フラットとシャープは3バイトではないのですか?
朝琴シエル

NVMああ(私はそれを見ていないb#許可されている)がありますが、使用する必要があるb#代わりにフラットとシャープの。
浅琴しえる

1

バッチ、188バイト

@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

#andの使用b:これはEband Bbが有効な変数名であることを意味します。#に文字列置換を行うことで処理され+1ます。その後、文字列置換の結果が自動的に評価され、結果がリストで検索される前にバルブが考慮されます。


1

スタックス、32 バイト

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

オンラインで実行してデバッグする

それは音名と押されたバルブのリストを取ります。ノート名の配列を作成し、合計バルブ間隔を計算し、配列内のそのオフセットでノートを取得します。

"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

これを実行する




0

Perl6 / Rakudo 73文字

技術的にはこれは83バイトですが、Unicode文字を入力しますが、ASCII文字に置き換えると73バイトになります。

この{code block}ようなパラメータを使用$^aする場合、シグネチャを持つラムダ($a, $b, $c, $d)です。

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

あれを呼べ:

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

ゴルフの少ない:

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;
}

ここでは'...' x 2x中置演算子を使用して文字列を2倍にした後、スマートマッチ演算子を使用してアンブシュアに続いてn個のノートを検索します。'...' ~~ /.../正規表現は\w\W?単語文字多分非単語の文字です。

を介してそのインスタンスのn個のインスタンスを探します(\w\W?)**{$_}。ここで、既に$_params $bからn = を計算しました$d。これにより、アンブーシュア音符から結果の音符への一致が生成されます。その最後の音符が必要なため、別の音符と一致させます。~~ /\w\W?$/ます。

$_最初の計算は許可するために必要です$^bブロックの暗黙的なパラメーター作成です。

76文字

文字列の一致ではなく配列を使用する代替方法は、さらに3文字です。

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

リストでアンブシュアを見つけるには@arr.first: $^a, :k、を使用します。これにより、見つかった要素のインデックス(キー)が返されます。:k

配列を$_(オブジェクトとして)に設定する.first.[ ]、あまり多くの文字を消費せずに使用できます。


0

C(gcc)、155バイト

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;}

オンラインでお試しください!

シンプルなアプローチ。

バルブ入力は0,1です。

Embouchure入力は小文字でなければなりません。興味深いことに、TiOはstrcmpi()を含めずに検出されませんがstring.h、mingw-gccでは標準の-Wimplicit-function-declaration警告で許可されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.