Die Trompete ist ein ventiliertes Aerophoninstrument, das normalerweise eingestimmt ist B♭
. Der Ton wird erzeugt, wenn der Player mit den Lippen vibriert, um die Luft im Inneren des Instruments zu verdrängen. Diese Schwingung wird dadurch erreicht, dass man den Mund auf eine bestimmte Art und Weise einstellt, die Embouchure genannt wird. Unterschiedliche Prägungen mit festeren oder lockereren Lippen erzeugen unterschiedliche Tonhöhen.
Darüber hinaus ändert jedes Ventil in der Trompete auch die Tonhöhe des Instruments. Durch Drücken eines Ventils wird ein Pfad im Inneren des Instrumentenschlauchs geschlossen, wodurch die Luft durch einen längeren Pfad strömt und somit die Tonhöhe des Originaltons verringert wird. Für die Zwecke dieser Herausforderung betrachten wir die Standard- B♭
Trompete, bei der das erste Ventil die Tonhöhe um eine volle Stufe absenkt, das zweite die Tonhöhe um eine halbe Stufe und das dritte die Tonhöhe um eins und a absenkt halber Schritt.
Die Herausforderung
Ihre Herausforderung besteht darin, ein Programm oder eine Funktion zu erstellen, die bei zwei Eingaben embouchure
undvalves
der Tonhöhe der gespielten Note bestimmt.
Für die Zwecke dieser Herausforderung folgen die Notizen der Reihenfolge:
B♭, B, C, C♯, D, E♭, E, F, F♯, G, G♯, A.
Regeln
- I / O kann auf jede vernünftige Weise genommen / gegeben werden .
- Standard-Schlupflöcher gelten .
- Sie dürfen
b
und#
anstelle von♭
und verwenden,♯
wenn Sie möchten. - Die Eingabe für
valves
kann als Liste niedergedrückter Ventile (1, 3
) oder als Boolesche Liste (1, 0, 1
) erfolgen. - Das ist Code-Golf , also gewinnt der kürzeste Code in jeder Sprache.
Testfälle:
Valves
In diesen Testfällen wird eine Boolesche Liste angegeben, in der 0 für gedrückt und 1 für gedrückt steht.
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♯
Haftungsausschluss: Ich bin noch kein großer Musiker, daher entschuldige ich mich für die Schlachtung der Testfälle. Korrekturen sind erwünscht.
F# 100
E nicht F sein?C#
auf einer Trompete spielen, ohne Ventile zu drücken. Nur bestimmte Noten (B♭-F-B♭-D-F-A♭-B♭...
), die Obertonreihe vonB♭
. Auch wenn es sich nicht um ein echtes Instrument handelt, ist die Herausforderung perfekt definiert.Antworten:
Python
32,12511981 BytesProbieren Sie es online!
Dank Jonathan Allan konnten viele Bytes gespart werden.
Meine ursprüngliche Lösung (in Python 3 ):
Probieren Sie es online!
6 Bytes gespart dank @HyperNeutrino.
Erläuterung
Zuerst mache ich eine Reihe von Noten, aber in der Länge verdoppelt , so ich zu kümmern, nicht um Umschlingung aus
Bb
zuA
.Dann nehme ich Eingaben in folgendem Format vor (zum Beispiel):
Ich finde dann den Index der Startnote mit
n.index(e,9)
(das9
ist da, um sicherzustellen, dass ich gut in der Mitte der (doppelten) Liste beginne. Ich berechne den gewünschten Versatz mit dem Ausdruck:Wo
f
ist das erste Ventil,s
ist das zweite Ventil undt
ist das dritte.Zum Schluss wird einfach die in der Liste gefundene Notiz gedruckt, indem der Versatz vom Startindex abgezogen wird.
quelle
"<some string>".split()
Standardmäßig wird nach Leerzeichen geteiltstr
und Umsetzenint
und Zulassen ausgewerteter Eingaben) und die Noten umkehren und weiterleiten (Vermeiden,9
desindex
Anrufs. Probieren Sie es online aus!'Bb', 1, 1, 1
Sie indizieren nehmen ,-6
die sein würde , jeE
nach Bedarf) - es ist , was TFeld hat da getan .Wolfram Language (Mathematica) , 100 Bytes (und 134 für eine Arbeitstrompete)
Probieren Sie es online!
Recht einfach.
Eine bessere Ausgabe für die Kosten von 34 Bytes.
quelle
Jelly ,
3736 BytesEin dyadischer Link, der die Ventile als Liste von
1
s oder0
s als Liste[second, first, third]
auf der linken Seite und die Embouchure als Liste von Zeichen auf der rechten Seite akzeptiert, die eine Liste von Zeichen zurückgibt.Probieren Sie es online!
Wie?
quelle
Ruby , 71 Bytes
Probieren Sie es online!
70 Zeichen aber 80 Bytes
Probieren Sie es online!
quelle
Javascript 96 Bytes
Nach der Idee von @vasilescur ist dies die Implementierung in js
quelle
b
und bin#
erlaubt) aber du musstb
und#
anstelle von Wohnungen und scharfen Gegenständen benutzen.Batch, 188 Bytes
Verwendet
#
undb
: dies bedeutet, dassEb
undBb
zulässige Variablennamen sind;#
wird behandelt, indem ein String-Ersatz an vorgenommen wird+1
. Das Ergebnis des Stringwechsels wird dann automatisch ausgewertet und die Ventile berücksichtigt, bevor das Ergebnis in einer Liste nachgeschlagen wird.quelle
Stax , 32 Bytes
Führen Sie es online aus und debuggen Sie es
Es enthält einen Notennamen und eine Liste der niedergedrückten Ventile. Es wird ein Array von Notennamen erstellt, dann das gesamte Ventilintervall berechnet und die Note an diesem Offset im Array abgerufen.
Führen Sie dieses aus
quelle
Python 2 ,
8479 BytesProbieren Sie es online!
quelle
C (gcc) ,
92 8682 BytesProbieren Sie es online!
Angepasst an die Implementierung von @ Vazt .
quelle
Perl6 / Rakudo 73 Zeichen
Technisch sind das 83 Bytes, weil ich die Unicode-Zeichen eingebe, aber wenn ich sie gegen die ASCII-Entsprechungen austausche, ergeben sich 73 Bytes.
Als
{code block}
mit Parametern wie$^a
diesem ist ein Lambda mit einer Signatur($a, $b, $c, $d)
.Nennen:
Weniger Golf:
Hier verdoppeln wir eine Zeichenfolge ,
'...' x 2
die mitx
Infixoperator, dann die Suche nach der embouchure von n Anmerkungen folgten dem Smartmatch Operator'...' ~~ /.../
- die Regex Scharniere auf\w\W?
denen ein Wort char dann vielleicht ein nicht-Wort char.Wir suchen nach n Instanzen davon
(\w\W?)**{$_}
, bei denen wir bereits n =$_
von params$b
bis berechnet haben$d
. Dies ergibt eine Übereinstimmung von der Embouchure-Note zu der resultierenden Note, von der wir nur die letzte wollen, damit wir diese mit einer anderen abgleichen~~ /\w\W?$/
.Die Berechnung von
$_
first ist erforderlich, um die$^b
implizite Erstellung von Parametern auf dem Block zu ermöglichen.76 Zeichen
Eine Alternative, bei der ein Array anstelle von Zeichenfolgenübereinstimmungen verwendet wird, sind drei weitere Zeichen:
Das Auffinden der Embouchure in der Liste erfolgt mit
@arr.first: $^a, :k
, wobei der Index (Schlüssel) des gefundenen Elements mit zurückgegeben wird:k
.Wenn Sie das Array auf
$_
(als Objekt) setzen, können Sie.first
und.[ ]
darauf verwenden, ohne zu viele Zeichen zu verbrauchen.quelle
C (gcc) , 155 Bytes
Probieren Sie es online!
Einfacher Ansatz.
Der Ventileingang beträgt 0,1.
Die Embouchure-Eingabe muss in Kleinbuchstaben erfolgen. Interessanterweise findet TiO nicht
strcmpi()
ohne Einschlussstring.h
, wohingegen mingw-gcc es mit der Standardwarnung erlaubt-Wimplicit-function-declaration
.quelle