Aufgabe
Schreiben Sie ein Programm, um die Note einer Saite zu bestimmen, die auf eine bestimmte Frequenz gestimmt und an einem bestimmten Punkt gedrückt wurde.
Nehmen Sie der Einfachheit halber an, dass die Frequenz des erzeugten Klangs und die Länge der Saite rechts von der Stelle, an der sie gedrückt wird, umgekehrt proportional sind.
Hinweis: Diese Aufgabe befasst sich ausschließlich mit dem Grundton und nicht mit Obertönen / anderen Harmonischen.
Eingang
Ihr Programm erhält zwei Daten:
Eine Zeichenfolge beliebiger Länge, die die betreffende Zeichenfolge darstellt. Diese Zeichenfolge wird mit einem X markiert, an dem die Zeichenfolge gedrückt werden soll.
[-----] is a string divided in six sections (five divisions). [--X--] is a string pressed at the exact center of the string. [X----] is a string pressed at 1/6 the length of the string. (Length used is 5/6) [-X--] is a string pressed at 2/5 of the length of the string. (Length used is 3/5)
Angenommen, die Note ertönt mit dem Teil der Saite rechts von
X
.- Eine Zahl (nicht unbedingt eine Ganzzahl), die die Frequenz angibt, mit der die Zeichenfolge gestimmt wird. Die Genauigkeit dieser Zahl beträgt höchstens vier Nachkommastellen.
Es kann angenommen werden, dass die durchgelassenen Frequenzen zwischen 10 Hz
und liegen 40000 Hz
.
Die Eingabe kann in einem Format Ihrer Wahl übergeben werden. Bitte geben Sie in Ihrer Antwort an, wie Eingaben in Ihr Programm akzeptiert werden.
Ausgabe
Ihr Programm muss sowohl die nächste Note * im Zwölfton-Stimmsystem für gleiches Temperament als auch die Anzahl der Cent von der nächsten Note entfernt ausgeben, die der durch die Saite angegebene Klang sein würde (auf den nächsten Cent gerundet).
+n
Cent sollte verwendet werden, um n
Cent scharf / über der Note und -n
Cent für flach / unter der Note zu bezeichnen.
Die Note sollte in wissenschaftlicher Tonhöhennotation ausgegeben werden. Angenommen, A4 ist auf abgestimmt 440Hz
. Verwenden Sie b und # für flache / scharfe Noten. Hinweis: Es kann entweder scharf oder flach verwendet werden. Für die Note bei 466.16Hz
kann entweder A#
oder Bb
für die Note ausgegeben werden.
Das Format der Ausgabe liegt bei Ihnen, solange die Ausgabe nur die beiden zuvor angegebenen Informationen enthält (dh das Drucken jeder einzelnen möglichen Ausgabe ist nicht zulässig).
* Die nächste Note bezieht sich auf die Note, die dem durch die Eingabe angegebenen Ton am nächsten kommt, gemessen in Cent (daher die Note, die sich innerhalb 50 cents
des Tons befindet). Wenn der Ton 50 cents
von zwei verschiedenen Noten entfernt ist (nach dem Runden), kann eine der beiden Noten ausgegeben werden.
Beispiele
Ihr Programm sollte für alle Fälle funktionieren, nicht nur für die folgenden Beispiele.
Output Input Frequency Input String
A4, +0 cents 220 [-----X-----]
A5, +0 cents 220 [--------X--]
D5, -2 cents 440 [--X--------]
B4, -49 cents 440 [X----------]
A#4, +19 cents* 314.1592 [X-]
Eb9, +8 cents* 400 [-----------------------X]
Eb11,+8 cents* 100 [--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------X]
D#1, +49 cents* 10 [--X]
A0, -11 cents 11.7103 [---X--]
* Es könnte entweder scharf oder flach ausgegeben worden sein.
Potenziell hilfreiche Links
- Notizen und Frequenzen
- Wikipedia-Seite zur wissenschaftlichen Tonhöhennotation
- Wikipedia-Seite über Cent
Dies ist Code-Golf, so dass die kürzeste Antwort gewinnt.
[--X--]
die Zeichenfolge in der Mitte der Abteilung gedrückt, in der diex
platziert ist, während die letzte[-X--]
bei 3/8 (nicht 2/5) liegen würde, wenn Sie dieser Logik folgen. Oder verstehe ich etwas falsch?[-X--]
, die Zeichenfolge wird an 4 Stellen (und daher in 5 Teile) geteilt und an der zweiten dieser Unterteilungen gedrückt. Somit wird auf gedrückt2/5
und die verwendete Länge ist3/5
.-
repräsentiert jeder im Grunde die Position der Abteilungen, danke für die Erklärung!Antworten:
BBC Basic, 161 #
Punktzahl schließt Kommentare aus. Noch nicht Golf gespielt.
Ausgabe
Funktioniert in allen Testfällen mit Ausnahme der beiden langen korrekt. Denn
Eb9
es scheint, dass im Testfall ein Strich fehlt: Es gibt 22-
und einenX
, der die Saite in 24 gleiche Teile teilt. Nach meinen manuellen Berechnungen sind dies 9600 Hz, was 37 Cent über einem D9 liegt. Genau das gibt mein Programm aus. Wenn ich einen weiteren Strich hinzufüge, bekomme ich Eb9 + 8 Cent. Leider kann BBC Basic keine Zeichenfolgen mit mehr als 255 Zeichen verarbeiten, daherEb11
gibt der Fall einen Fehler aus.quelle
C, 179
Empfängt das ASCII-Bild in einer Zeile für sich und die Frequenz in einer separaten Zeile.
Einige Zeichen können entfernt werden, indem die Genauigkeit der magischen Zahlen
17.3123
und verringert wird57.376
.Ohne das Golfen sieht das Programm folgendermaßen aus:
quelle
scanf
Formatzeichenfolge. Ich hatte keine Ahnung, dass du das tun könntest. Ich werde Ihren Ausgabecode später überprüfen (ich habe darüber nachgedacht, dies in C zu tun, und obwohl mir bei der Ausgabe etwas Ähnliches eingefallen ist, konnte ich keine Möglichkeit finden, das Ganze wettbewerbsfähig zu machen.) Ich gehe davon aus,d+9
dass Sie indiziert sind Note A, also müssen Sie die Oktavzahl an den Index in Note C anpassen: Ich frage mich, ob es einen Weg gibt, das zu umgehen.JavaScript (199)
Nennen Sie es zB als
t('[X-]',314.1592)
Fest. (Da ich in Europa lebe, habe ich B anstelle von Bb und H anstelle von B = verwendet.)
quelle
t('[---X--]',11.7103)
(letztes Beispiel)-10
anstelle von-11
p="C0C#0D0D#0E0F0F#0G0G#0A0B0H".split(0)
spart Sie zusätzlich 2 Zeichen.round(x) = x+.5|0
der nur positive Zahlen korrekt sind, werde ich das später beheben. @ipi danke!Python 3: 175
Ungolfed:
quelle