ช่วยฉันเล่นทรัมเป็ต


14

ทรัมเป็ตเป็นเครื่องดนตรี aerophone valved B♭มักจะตั้งค่ายอยู่ เสียงจะเกิดขึ้นเมื่อผู้เล่นสั่นริมฝีปากเพื่อไล่อากาศออกจากเครื่องดนตรี การสั่นสะเทือนนั้นเกิดขึ้นได้จากการตั้งปากในลักษณะเฉพาะเรียกว่าการสัมผัส การตกแต่งที่แตกต่างกันด้วยริมฝีปากที่แน่นหรือแน่น

นอกจากนี้แต่ละวาล์วในทรัมเป็ตยังเปลี่ยนระดับเสียงของเครื่องดนตรี เมื่อหดหู่วาล์วจะปิดทางเดินภายในท่อของเครื่องมือทำให้อากาศไหลผ่านทางที่ยาวขึ้นซึ่งจะลดระดับเสียงของเสียงต้นฉบับ สำหรับจุดประสงค์ของการท้าทายนี้เราจะพิจารณาถึงมาตรฐานB♭ทรัมเป็ตซึ่งวาล์วตัวแรกลดระดับเสียงลงด้วยขั้นตอนเต็มขั้นที่สองจะลดระดับเสียงลงครึ่งก้าวและอีกระดับหนึ่งลดระดับเสียงลงหนึ่งและหนึ่ง ครึ่งก้าว

ความท้าทาย

ความท้าทายของคุณคือการสร้างโปรแกรมหรือฟังก์ชั่นที่กำหนดอินพุตสองตัว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
นักดนตรียอดนิยมที่นี่ รอเดี๋ยวนะนั่นเป็นวิธีที่คุณสะกดคำว่า embouchure คิดเสมอว่ามันเริ่มต้นด้วย ;-)
MayorMonty

1
@vasilescur คุณพูดถูก ฉันจะแก้ไขและทบทวนข้อผิดพลาดอื่น ๆ ที่เป็นไปได้ ขอบคุณสำหรับหัวขึ้น.
J. Sallé

1
ในฐานะที่เป็นคนที่เล่นทรัมเป็ตมาเป็นเวลานานฉันสับสนกับการวัด Embouchure ... ตัวอย่างเช่น C # Embouchure คืออะไร?
งอ

1
ควรF# 100เป็น E ไม่ใช่ F หรือ
เลเวลริเวอร์เซนต์

2
@bendl ไม่มีสิ่งนั้น คุณไม่สามารถเล่นC#กับทรัมเป็ตได้โดยไม่ต้องกดวาล์วใด ๆ เพียงแค่บันทึกเฉพาะ ( B♭-F-B♭-D-F-A♭-B♭...) B♭ชุดรองของ ถึงแม้ว่ามันจะไม่ได้สะท้อนถึงอุปกรณ์ที่ใช้จริงความท้าทายก็ถูกกำหนดไว้อย่างสมบูรณ์แบบ
Chris

คำตอบ:


4

หลาม 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]

ลองออนไลน์!

บันทึกจำนวนมากต้องขอบคุณ Jonathan Allan


โซลูชันดั้งเดิมของฉัน (ใน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)])

ลองออนไลน์!

บันทึกแล้ว 6 ไบต์ขอบคุณ @HyperNeutrino


คำอธิบาย

ครั้งแรกผมให้อาร์เรย์ของบันทึก แต่สองเท่าในระยะเวลาดังนั้นผมจึงไม่ต้องกังวลเกี่ยวกับการวนลูปไปรอบ ๆ จากการBbA

จากนั้นฉันรับอินพุตในรูปแบบต่อไปนี้ (ตัวอย่าง):

Bb 1 0 1

ฉันพบดัชนีของบันทึกย่อเริ่มต้นที่ใช้n.index(e,9)( 9อยู่ที่นั่นเพื่อให้แน่ใจว่าฉันเริ่มต้นได้ดีในช่วงกลางของรายการ (สองเท่า) ฉันคำนวณออฟเซ็ตที่ต้องการด้วยนิพจน์:

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

ที่fวาล์วแรกคือที่ไหนวาล์วsที่สองและtที่สามคือ

ในที่สุดมันก็พิมพ์โน้ตที่พบในรายการโดยการลบออฟเซ็ตจากดัชนีเริ่มต้น


3
บันทึกสองสามไบต์โดยคั่นด้วยช่องว่าง "<some string>".split()แยกโดยช่องว่างตามค่าเริ่มต้น
HyperNeutrino

บันทึก 30 ไบต์ด้วยการย้ายไปที่ Python 2 (หลีกเลี่ยงstrและintปลดเปลื้องและอนุญาตอินพุตที่ประเมินค่า) และย้อนกลับบันทึกย่อและหักล้างไปข้างหน้า (หลีกเลี่ยง,9การindexโทรลองใช้แบบออนไลน์!
Jonathan Allan

... และอีก 8 ย้ายไปฟังก์ชั่น (ซึ่งทำงานใน Python 2 หรือ 3) ลองใช้ออนไลน์!
Jonathan Allan

@JanathanAllan ฉันได้เรียนรู้เทคนิคการเล่นกอล์ฟ Python จากการปรับปรุงของคุณ ขอบคุณมาก!
vasilescur

... ในความเป็นจริงคุณสามารถใช้รายการในลำดับเดิมโดยไม่ต้องทำซ้ำและลบค่าเนื่องจากดัชนีลบจะไม่ออกนอกขอบเขต (ลบมากที่สุดจะ'Bb', 1, 1, 1นำคุณไปยังดัชนี-6ซึ่งจะเป็นEตามที่ต้องการ) - เป็นสิ่งที่TFeld มี ตั้งแต่เสร็จแล้ว
Jonathan Allan

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 มีเอาท์พุทเสียง ??? ชั่วร้าย!
ติตัส

แน่นอนว่า Mathematica มีเอาท์พุทในตัว นี่คือทองคำ
J. Sallé

2

เยลลี่ ,  37  36 ไบต์

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

ลิงก์ dyadic ยอมรับ valves เป็นรายการของ1s หรือ0s เป็นรายการที่แสดง[second, first, third]ทางด้านซ้ายและ embouchure เป็นรายการของอักขระทางด้านขวาซึ่งส่งคืนรายการของอักขระ

ลองออนไลน์!

อย่างไร?

Ø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 ไบต์;) BTW แฟลตและชาร์ปควรนับเป็น 3 ไบต์ใช่ไหม
Shieru Asakoto

โอ้ nmm (ฉันไม่เห็นbและ#ได้รับอนุญาต) แต่คุณต้องใช้bและ#แทนที่จะเป็นแฟลตและชาร์ป
Shieru Asakoto

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

ใช้#และb: ซึ่งหมายความว่าEbและBbเป็นชื่อตัวแปรทางกฎหมาย จะถูกจัดการโดยการทำทดแทนสตริง# +1ผลลัพธ์ของการแทนที่สตริงจะถูกประเมินโดยอัตโนมัติและวาล์วจะถูกนำมาพิจารณาก่อนที่ผลลัพธ์จะถูกค้นหาในรายการ


1

Stax , 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 2โดยใช้ตัวxดำเนินการ infix จากนั้นค้นหาคำว่า embouchure ตามด้วยหมายเหตุ n โดยใช้ตัวดำเนินการ smartmatch '...' ~~ /.../- บานพับ regex \w\W?ซึ่งเป็นตัวอักษรคำ

เรามองหากรณี n ของผ่านทางที่(\w\W?)**{$_}ซึ่งเราได้คำนวณแล้ว n = $_จาก params ไป$b $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

อินพุตแบบฝังต้องเป็นตัวพิมพ์เล็ก ที่น่าสนใจคือ TiO ไม่พบstrcmpi()หากไม่มีการรวมstring.hไว้ในขณะที่ mingw-gcc อนุญาตให้มีการ-Wimplicit-function-declarationเตือนมาตรฐาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.