Schnelle musikalische Auffrischung:
Die Klaviertastatur besteht aus 88 Noten. Zu jeder Oktave gibt es 12 Töne C, C♯/D♭, D, D♯/E♭, E, F, F♯/G♭, G, G♯/A♭, A, A♯/B♭
und B
. Jedes Mal, wenn Sie ein 'C' drücken, wird das Pattern eine Oktave höher wiederholt.
Eine Note wird eindeutig identifiziert durch 1) den Buchstaben, einschließlich aller scharfen oder flachen Stellen, und 2) die Oktave, die eine Zahl von 0 bis 8 ist. Die ersten drei Noten der Tastatur sind A0, A♯/B♭
und B0
. Danach folgt die volle chromatische Skala auf Oktave 1. C1, C♯1/D♭1, D1, D♯1/E♭1, E1, F1, F♯1/G♭1, G1, G♯1/A♭1, A1, A♯1/B♭1
und B1
. Danach folgt eine volle chromatische Tonleiter auf den Oktaven 2, 3, 4, 5, 6 und 7. Dann ist die letzte Note a C8
.
Jede Note entspricht einer Frequenz im Bereich von 20-4100 Hz. Mit A0
genau 27.500 Hertz ist jede entsprechende Note die vorherige Note mal die zwölfte Wurzel von zwei oder ungefähr 1,059463. Eine allgemeinere Formel lautet:
Dabei ist n die Nummer der Note, wobei A0 1 ist. (Weitere Informationen hier )
Die Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die eine Zeichenfolge für eine Note aufnimmt und die Häufigkeit dieser Note ausgibt oder zurückgibt. Wir verwenden ein #
Pfundzeichen für das scharfe Symbol (oder ein Hashtag für Ihre Youngins) und ein Kleinbuchstaben b
für das flache Symbol. Alle Eingaben werden (uppercase letter) + (optional sharp or flat) + (number)
ohne Leerzeichen aussehen . Wenn die Eingabe außerhalb des Tastaturbereichs liegt (niedriger als A0 oder höher als C8) oder ungültige, fehlende oder zusätzliche Zeichen vorhanden sind, handelt es sich um eine ungültige Eingabe, die Sie nicht verarbeiten müssen. Sie können auch davon ausgehen, dass Sie keine seltsamen Eingaben wie E # oder Cb erhalten.
Präzision
Da unendliche Präzision nicht wirklich möglich ist, werden wir sagen, dass alles innerhalb eines Cent des wahren Wertes akzeptabel ist. Ohne ins Detail zu gehen, ist ein Cent die 1200. Wurzel von zwei oder 1.0005777895. Lassen Sie uns ein konkretes Beispiel verwenden, um es klarer zu machen. Angenommen, Ihre Eingabe war A4. Der genaue Wert dieser Note beträgt 440 Hz. Einmal Cent Flat ist 440 / 1.0005777895 = 439.7459
. Sobald Cent 440 * 1.0005777895 = 440.2542
Sharp ist, ist jede Zahl größer als 439,7459, aber kleiner als 440,2542 genau genug, um zu zählen.
Testfälle
A0 --> 27.500
C4 --> 261.626
F#3 --> 184.997
Bb6 --> 1864.66
A#6 --> 1864.66
A4 --> 440
D9 --> Too high, invalid input.
G0 --> Too low, invalid input.
Fb5 --> Invalid input.
E --> Missing octave, invalid input
b2 --> Lowercase, invalid input
H#4 --> H is not a real note, invalid input.
Denken Sie daran, dass Sie nicht mit ungültigen Eingaben umgehen müssen. Wenn Ihr Programm vorgibt, echte Eingaben zu sein, und einen Wert ausgibt, ist dies akzeptabel. Wenn dein Programm abstürzt, ist das auch akzeptabel. Alles kann passieren, wenn du eins bekommst. Eine vollständige Liste der Ein- und Ausgänge finden Sie auf dieser Seite
Wie üblich ist dies Codegolf, so dass Standardlücken gelten und die kürzeste Antwort in Bytes gewinnt.
H
?H
Bedeutung B ist AFAIK nur im deutschsprachigen Raum verwendet. (WoB
übrigens Bb bedeutet.) Was die Briten und Iren B nennen, heißt in Spanien und Italien Si oder Ti, wie in Do Re Mi Fa Sol La Si.H
wird laut Wikipedia in Deutschland, Tschechien, der Slowakei, Polen, Ungarn, Serbien, Dänemark, Norwegen, Finnland, Estland und Österreich verwendet . (Ich kann es auch für Finnland selbst bestätigen.)Antworten:
Japt,
41373534 BytesIch habe endlich die Chance, es
¾
gut zu gebrauchen! :-)Probieren Sie es online!
Wie es funktioniert
Testfälle
Alle gültigen Testfälle kommen gut durch. Es sind die Invaliden, bei denen es komisch wird ...
quelle
Pyth,
464443423935 BytesProbieren Sie es online aus. Testsuite.
Der Code verwendet jetzt einen ähnlichen Algorithmus wie die Japt-Antwort von ETHproductions .
Erläuterung
Alte Version (42 Bytes, 39 mit gepacktem String)
Erläuterung
Code-Snippet anzeigen
quelle
Mathematica, 77 Bytes
Erklärung :
Die Hauptidee dieser Funktion besteht darin, die Notenfolge in ihre relative Tonhöhe umzuwandeln und dann ihre Frequenz zu berechnen.
Die Methode, die ich benutze, ist das Exportieren des Sounds nach Midi und das Importieren der Rohdaten, aber ich vermute, dass es einen eleganteren Weg gibt.
Testfälle :
quelle
MATL ,
56535049 48 BytesVerwendet die aktuelle Version (10.1.0) , die älter als diese Herausforderung ist.
Probieren Sie es online !
Erläuterung
quelle
JavaScript ES7,
737069 BytesVerwendet die gleiche Technik wie meine Japt-Antwort .
quelle
Ruby,
6965Ungolfed im Testprogramm
Ausgabe
quelle
ES7, 82 Bytes
Gibt bei Eingabe von "B # 2" wie erwartet 130.8127826502993 zurück.
Bearbeiten: 3 Bytes dank @ user81655 gespeichert.
quelle
2*3**3*2
ist 108 in der Firefox-Browserkonsole, was dem entspricht2*(3**3)*2
. Beachten Sie auch, dass diese Seite auch besagt, dass sie?:
eine höhere Priorität hat als,=
aber tatsächlich die gleiche Priorität haben (beachten Siea=b?c=d:e=f
).**
daher konnte ich es noch nie testen. Ich denke,?:
hat eine höhere Priorität, als=
wenn, weil in Ihrem Beispiela
auf das Ergebnis des Ternärs festgelegt ist, anstattb
dann das Ternär auszuführen. Die anderen beiden Aufgaben sind im Ternär enthalten, daher handelt es sich um einen Sonderfall.e=f
im Ternary ?a=b?c=d:e=f?g:h
. Wenn sie die gleiche Priorität und die erste ternären am Ende gegangene=
nache
wäre es einen ungültigen linken Zuordnungsfehler verursachen.?:
höher priorisiert wäre als=
ohnehin. Der Ausdruck muss gruppiert werden, als ob es wara=(b?c=d:(e=(f?g:h)))
. Sie können das nicht tun, wenn sie nicht die gleiche Priorität haben.C, 123 Bytes
Verwendung:
Der berechnete Wert liegt immer um ca. 0,8 Cent unter dem exakten Wert, da ich aus den Gleitkommazahlen so viele Ziffern wie möglich ausgeschnitten habe.
Übersicht über den Code:
quelle
R,
157150141136 BytesMit Einzug und Zeilenumbrüchen:
Verwendung:
quelle
Python,
97 bis95 BytesBasierend auf dem alten Ansatz von Pietu1998 (und anderen), nach dem Index der Note in der Zeichenfolge
'C@D@EF@G@A@B'
für ein Leerzeichen zu suchen . Ich benutze iterables Auspacken, um den Notenstring ohne Bedingungen zu analysieren. Am Ende habe ich ein bisschen Algebra gemacht, um den Konvertierungsausdruck zu vereinfachen. Ich weiß nicht, ob ich es kürzer machen kann, ohne meinen Ansatz zu ändern.quelle
b==['#']
verkürzt werden könnte'#'in b
, undnot b
zub>[]
.Wolfram Language (Mathematica), 69 Bytes
Wenn Sie das Musikpaket verwenden , bei dem Sie einfach eine Note als Ausdruck eingeben, wird die Häufigkeit folgendermaßen bewertet:
So speichern Bytes durch die Vermeidung des Pakets mit importieren
<<Music
, ich bin die vollqualifizierten Namen verwenden:Music`Eflat3
. Allerdings muss ich immer nochb
mitflat
und#
mit ersetzensharp
, um dem Eingabeformat der Frage zu entsprechen, was ich mit einem einfachen macheStringReplace
.quelle