Giúp tôi chơi Trumpet


14

Các trumpet là một công cụ điện thoại trên không valved, thường dốc trong B♭. Âm thanh được tạo ra khi người chơi rung môi để thay thế không khí bên trong nhạc cụ. Sự rung động đó có được bằng cách đặt miệng của một người theo một cách cụ thể, được gọi là phôi. Các kiểu đắp khác nhau, với đôi môi căng hơn hoặc lỏng hơn, tạo ra các nốt khác nhau.

Hơn nữa, mỗi van trong kèn cũng thay đổi cao độ của nhạc cụ. Khi bị đè nén, một van sẽ đóng một đường dẫn bên trong ống của nhạc cụ, làm cho luồng không khí đi qua một đường dài hơn, do đó làm giảm cao độ của âm thanh gốc. Đối với mục đích của thử thách này, chúng tôi sẽ xem xét tiêu chuẩn, B♭kèn, trong đó van thứ nhất hạ thấp độ cao xuống một bước, lần thứ hai hạ thấp độ cao xuống một nửa và thứ ba hạ thấp độ cao xuống một và một Nửa bước.

Các thách thức

Thử thách của bạn là tạo ra một chương trình hoặc chức năng, đưa ra hai đầu vào embouchurevalves, xác định cao độ của nốt nhạc đang được phát.

Đối với mục đích của thử thách này, các ghi chú sẽ tuân theo trình tự:

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

Quy tắc

  • I / O có thể được thực hiện / đưa ra trong bất kỳ phương pháp hợp lý nào .
  • Tiêu chuẩn áp dụng.
  • Bạn được phép sử dụng b#thay vì nếu bạn muốn.
  • Đầu vào cho valvescó thể được lấy dưới dạng danh sách các van bị đè nén ( 1, 3) hoặc danh sách boolean ( 1, 0, 1).
  • Đây là , vì vậy mã ngắn nhất trong mỗi ngôn ngữ sẽ thắng.

Các trường hợp thử nghiệm:

Valves trong các trường hợp thử nghiệm này được đưa ra dưới dạng danh sách boolean, trong đó 0 có nghĩa là chán nản và 1 có nghĩa là bị ép.

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♯

Tuyên bố miễn trừ trách nhiệm: Tôi chưa phải là một nhạc sĩ, vì vậy tôi xin lỗi vì bất kỳ hành vi lừa đảo nào tôi có thể thực hiện trong các trường hợp thử nghiệm. Sửa chữa được đánh giá cao.


2
Bộ gõ ở đây. Đợi đã, đó là cách bạn đánh vần. Luôn luôn nghĩ rằng nó bắt đầu với một ;-)
MayorMonty 15/03/18

1
@vasilescur bạn nói đúng. Tôi sẽ sửa những lỗi đó và xem xét mọi lỗi có thể khác. Cảm ơn cho những người đứng đầu lên.
J. Sallé 15/03/18

1
Là một người đã chơi kèn trong một thời gian dài, tôi thực sự bối rối với phép đo Embouchure ... Ví dụ: Embouchure C # là gì?
bẻ cong

1
Có nên F# 100E không F?
Cấp sông St

2
@bendl Không có điều đó. Bạn không thể chơi C#kèn mà không nhấn bất kỳ van nào. Chỉ cần ghi chú cụ thể ( B♭-F-B♭-D-F-A♭-B♭...), loạt âm lượng của B♭. Tuy nhiên, ngay cả khi nó không phản ánh một nhạc cụ thực sự, thách thức vẫn được xác định rõ ràng.
Chris

Câu trả lời:


4

Con trăn 3 2, 125 119 81 byte

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]

Hãy thử trực tuyến!

Lưu được rất nhiều byte nhờ Jonathan Allan.


Giải pháp ban đầu của tôi (trong 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)])

Hãy thử trực tuyến!

Đã lưu 6 byte nhờ @HyperNeutrino.


Giải trình

Đầu tiên, tôi tạo một loạt các ghi chú, nhưng gấp đôi chiều dài để tôi không phải lo lắng về việc lặp đi lặp lại từ Bbđến A.

Sau đó, tôi lấy đầu vào theo định dạng sau (ví dụ):

Bb 1 0 1

Sau đó, tôi tìm thấy chỉ mục của ghi chú bắt đầu bằng cách sử dụng n.index(e,9)( 9có để đảm bảo rằng tôi bắt đầu tốt ở giữa danh sách (nhân đôi). Tôi tính toán phần bù mong muốn với biểu thức:

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

Trong trường hợp flà van đầu tiên, slà van thứ hai, và tlà thứ ba.

Cuối cùng, nó chỉ đơn giản là in ghi chú được tìm thấy trong danh sách bằng cách trừ phần bù khỏi chỉ mục bắt đầu.


3
lưu một vài byte bằng cách phân tách bằng dấu cách. "<some string>".split()chia tách theo khoảng trắng theo mặc định
HyperNeutrino 15/03/18

Lưu 30 byte bằng cách di chuyển đến Python 2 (tránh strintdàn diễn viên và cho phép đầu vào đánh giá) và đảo ngược các ghi chú và bù đắp về phía trước (tránh ,9trong index. Gọi Try It Online!
Jonathan Allan

... và 8 chức năng khác đang hoạt động (hoạt động trong Python 2 hoặc 3) Dùng thử trực tuyến!
Jonathan Allan

@Jonathan ALLan Tôi đã học được một số mẹo chơi gôn Python từ những cải tiến của bạn. Cảm ơn bạn rất nhiều!
vasilescur 16/03/18

... trên thực tế bạn có thể sử dụng danh sách theo thứ tự ban đầu của nó mà không lặp lại và trừ giá trị kể từ khi chỉ số tiêu cực không bao giờ đi ra khỏi giới hạn (các tiêu cực nhất sẽ được 'Bb', 1, 1, 1đưa bạn đến chỉ số -6đó sẽ là E, theo yêu cầu) - đó là những gì TFeld có kể từ khi thực hiện .
Jonathan Allan

3

Ngôn ngữ Wolfram (Mathicala) , 100 byte (và 134 cho một cây kèn làm việc)

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

Hãy thử trực tuyến!

Khá đơn giản.

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"]&

Một đầu ra tốt hơn cho chi phí 34 byte.


Đợi ... Mathicala có đầu ra Audio ??? Xấu xa!
Tít

@Titus có. Đối với ghi chú âm thanh, nó được cung cấp bởi midi
Keyu Gan

Tất nhiên Mathicala có tích hợp sẵn cho đầu ra âm thanh. Đây là vàng.
J. Sallé 16/03/18

2

Thạch ,  37  36 byte

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

Một liên kết dyadic chấp nhận các van như một danh sách 1s hoặc 0s như một danh sách đại diện [second, first, third]ở bên trái và phôi là một danh sách các ký tự ở bên phải trả về một danh sách các ký tự.

Hãy thử trực tuyến!

Làm sao?

Ø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 byte

Theo ý tưởng @vasilescur, đây là cách triển khai trong 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))


Ít hơn 3 byte;) BTW các căn hộ và vật sắc nhọn nên được tính là 3 byte phải không?
Shieru Asakoto 16/03/18

Oh nvm (Tôi không thấy điều đó b#được cho phép) nhưng bạn cần sử dụng b#thay vì căn hộ và vật sắc nhọn.
Shieru Asakoto 16/03/18

1

Mẻ, 188 byte

@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

Sử dụng #b: điều này có nghĩa là EbBblà tên biến hợp pháp; #được xử lý bằng cách thay thế chuỗi +1. Kết quả của việc thay thế chuỗi sau đó được tự động đánh giá và các van sau đó được tính đến trước khi kết quả được tra cứu trong một danh sách.


1

Stax , 32 byte

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

Chạy và gỡ lỗi trực tuyến

Nó có một tên ghi chú và một danh sách các van chán nản. Nó xây dựng một mảng các tên ghi chú, sau đó tính toán tổng khoảng thời gian của van và nhận được ghi chú ở phần bù đó trong mảng.

"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

Chạy cái này




0

Perl6 / Rakudo 73 ký tự

Về mặt kỹ thuật, đây là 83 byte vì tôi đặt các ký tự Unicode, nhưng việc hoán đổi chúng cho các tương đương ASCII sẽ cho 73 byte.

Như một {code block}tham số như thế $^anày là lambda, có chữ ký ($a, $b, $c, $d).

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

Gọi nó đi:

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

Ít chơi gôn:

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

Ở đây, chúng tôi nhân đôi một chuỗi '...' x 2bằng xtoán tử infix, sau đó tìm kiếm phần đính kèm theo n ghi chú bằng toán tử smartmatch '...' ~~ /.../- bản lề regex trên \w\W?đó là một char từ có thể là một char không từ.

Chúng tôi tìm kiếm n trường hợp thông qua đó (\w\W?)**{$_}, nơi chúng tôi đã tính n = $_từ params $bđến $d. Điều này mang lại một kết quả khớp từ ghi chú phôi đến ghi chú kết quả, trong đó chúng tôi chỉ muốn cuối cùng để chúng tôi khớp với ghi chú khác ~~ /\w\W?$/.

Việc tính toán $_đầu tiên là cần thiết để cho phép $^btạo param ẩn trên khối.

76 ký tự

Một thay thế bằng cách sử dụng một mảng thay vì khớp chuỗi là thêm 3 ký tự:

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

Việc tìm kiếm sự thay đổi trong danh sách đạt được @arr.first: $^a, :k, trong đó trả về chỉ mục (khóa) của phần tử được tìm thấy với :k.

Đặt mảng thành $_(như một đối tượng) cho phép chúng ta sử dụng .first.[ ]trên đó mà không tốn quá nhiều ký tự.


0

C (gcc) , 155 byte

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

Hãy thử trực tuyến!

Cách tiếp cận đơn giản.

Đầu vào van là 0,1.

Nhập liệu phải là chữ thường. Thật thú vị, TiO không tìm thấy strcmpi()mà không bao gồm string.h, trong khi mingw-gcc cho phép nó với -Wimplicit-function-declarationcảnh báo tiêu chuẩn .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.