Trąbka jest zaworem instrumentem aerofony, zwykle obozem B♭
. Dźwięk jest emitowany, gdy odtwarzacz wibruje wargami, aby wyprzeć powietrze z wnętrza instrumentu. Wibrację tę uzyskuje się przez ustawienie ust w określony sposób, zwany tłoczeniem. Różne tłoczenia, z węższymi lub luźniejszymi ustami, wytwarzają różne wysokości.
Co więcej, każdy zawór w trąbce również zmienia wysokość instrumentu. Po wciśnięciu zawór zamyka ścieżkę wewnątrz rurki instrumentu, dzięki czemu powietrze przepływa dłuższą ścieżką, obniżając w ten sposób wysokość dźwięku oryginalnego. Na potrzeby tego wyzwania rozważymy standardową B♭
trąbkę, w której pierwszy zawór obniża skok o pełny stopień, drugi obniża skok o pół stopnia, a trzeci obniża skok o jeden i jeden pół kroku.
Wyzwanie
Wyzwanie polega na utworzeniu programu lub funkcji, która przy dwóch wejściach embouchure
i valves
określa wysokość odtwarzanej nuty.
Na potrzeby tego wyzwania notatki będą przebiegać w następującej kolejności:
B♭, B, C, C♯, D, E♭, E, F, F♯, G, G♯, A.
Zasady
- We / Wy można przyjmować / podawać dowolną rozsądną metodą .
- Obowiązują standardowe luki .
- Możesz używać
b
i#
zamiast♭
i♯
jeśli chcesz. - Dane wejściowe dla
valves
można przyjmować jako listę zaworów o obniżonym ciśnieniu (1, 3
) lub listę wartości boolowskich (1, 0, 1
). - To jest golf golfowy , więc wygrywa najkrótszy kod w każdym języku.
Przypadki testowe:
Valves
w tych przypadkach testowych podano jako listę logiczną, gdzie 0 oznacza wciśnięty, a 1 wciśnięty.
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♯
Oświadczenie: Nie jestem jeszcze muzykiem, więc przepraszam za rzeź, jaką mogłem zrobić na testach. Poprawki są mile widziane.
F# 100
E powinno być F?C#
na trąbce bez naciskania jakichkolwiek zaworów. Tylko konkretne uwagi (B♭-F-B♭-D-F-A♭-B♭...
), seria tonówB♭
. Mimo to, nawet jeśli nie odzwierciedla prawdziwego instrumentu, wyzwanie jest doskonale dobrze zdefiniowane.Odpowiedzi:
Pyton
3)2,12511981 bajtówWypróbuj online!
Zaoszczędź dużo bajtów dzięki Jonathanowi Allanowi.
Moje oryginalne rozwiązanie (w Python 3 ):
Wypróbuj online!
Zaoszczędź 6 bajtów dzięki @HyperNeutrino.
Wyjaśnienie
Najpierw robię szereg notatek, ale o podwójnej długości, więc nie muszę się martwić, że będę przechodził od
Bb
doA
.Następnie biorę dane wejściowe w następującym formacie (na przykład):
Następnie znajduję indeks nuty początkowej za pomocą
n.index(e,9)
(9
jest tam, aby upewnić się, że zaczynam dobrze na środku (podwójnej) listy. Obliczam pożądane przesunięcie za pomocą wyrażenia:Gdzie
f
jest pierwszy zawór,s
jest drugi zawór it
jest trzeci.Wreszcie, po prostu drukuje notatkę znalezioną na liście, odejmując przesunięcie od indeksu początkowego.
źródło
"<some string>".split()
splits by whitespace by defaultstr
andint
casts and allowing evaluated input) and reversing the notes and offsetting forward (avoiding the,9
in theindex
call. Try It Online!'Bb', 1, 1, 1
taking you to index-6
which would beE
, as required) - it's what TFeld has since done.Wolfram Language (Mathematica), 100 bytes (and 134 for a working trumpet)
Try it online!
Quite straightforward.
A better output for the cost of 34 bytes.
źródło
Jelly,
3736 bytesA dyadic link accepting the valves as a list of
1
s or0
s as a list representing[second, first, third]
on the left and the embouchure as a list of characters on the right which returns a list of characters.Try it online!
How?
źródło
Ruby, 71 bytes
Try it online!
70 chars but 80 bytes
Try it online!
źródło
Javascript 96 bytes
Following @vasilescur idea, this is the implementation in js
źródło
b
and#
are allowed) but you need to useb
and#
instead of flats and sharps.Batch, 188 bytes
Uses
#
andb
: this means thatEb
andBb
are legal variable names;#
is handled by doing a string replacement to+1
. The result of the string replacement is then automatically evaluated and the valves are then taken into account before the result is looked up in a list.źródło
Stax, 32 bytes
Run and debug it online
It takes a note name and a list of depressed valves. It builds an array of note names, then calculates the total valve interval, and gets the note at that offset in the array.
Run this one
źródło
Python 2,
8479 bytesTry it online!
źródło
C (gcc),
92 8682 bytesTry it online!
Adapted from @Vazt's implementation.
źródło
Perl6/Rakudo 73 chars
Technically this is 83 bytes because I put the Unicode characters in, but swapping them for the ASCII equivalents would give 73 bytes.
As a
{code block}
with parameters like$^a
this is a lambda, with a signature($a, $b, $c, $d)
.Call it:
Less-golfed:
Here we double a string
'...' x 2
using thex
infix operator, then searching for the embouchure followed by n notes using the smartmatch operator'...' ~~ /.../
- the regex hinges on\w\W?
which is a word char then maybe a non-word char.We look for n instances of that via
(\w\W?)**{$_}
, where we've already calculated n=$_
from params$b
to$d
. This yields a match from the embouchure note to the resulting note, of which we just want the last so we match that with another~~ /\w\W?$/
.The calculation of
$_
first is necessary to permit$^b
implicit param creation on the block.76 chars
An alternative using an array rather than string matches is 3 more chars:
Finding the embouchure in the list is achieved with
@arr.first: $^a, :k
, which returns the index (key) of the found element with:k
.Setting the array to
$_
(as an object) lets us use.first
and.[ ]
on it without spending too many characters.źródło
C (gcc), 155 bytes
Try it online!
Simple approach.
Valve input is 0,1.
Embouchure input must be lowercase. Interestingly, TiO is not finding
strcmpi()
without includingstring.h
, whereas mingw-gcc allows it with the standard-Wimplicit-function-declaration
warning.źródło