Wir schreiben das Jahr 930 und die Gregorianische Kirche hat ein Problem. Sie haben Tausende von Seiten mit Gesangsmusik, aber das Problem ist, dass alle Noten einfach auf einen Stapel geworfen wurden, anstatt über ein echtes Organisationssystem zu verfügen:
Bild von User gamerprinter bei Cartographers 'Guild .
Die Kirche muss alle Noten organisieren, deshalb haben sie einen mittelalterlichen Software-Ingenieur beauftragt, ein Programm zu schreiben, um es für sie zu organisieren. Sie sind der Softwareentwickler, der eingestellt wurde. Bei der Zusammenstellung im Mittelalter wird das Programm jedoch von einem Team langsamer Bibelschreiber auf Papier geschrieben. Um die Zeit zu verkürzen, die das Schreiberteam benötigt, um Ihren Code zu kompilieren, müssen Sie das Programm so klein wie möglich halten.
Die Kirche möchte, dass die Gesangsmusik auf der Grundlage der musikalischen Skala organisiert wird, in der sie geschrieben ist. Alle Gesangsmusik der Kirche ist in dorischen Skalen geschrieben . Ausgehend von den Noten eines bestimmten Musikstücks gibt Ihr Programm die dorische Skala aus, in der es sich befindet. Hier erkläre ich genau, was eine dorische Skala ist. Wenn Sie es bereits wissen, können Sie diesen Abschnitt überspringen.
Es gibt 12 mögliche Noten in jeder Melodie. Hier sind sie in Ordnung:
C C# D D# E F F# G G# A A# B
Ein Halbton (dargestellt mit a S
) wird um einen Schritt nach rechts erhöht und umbrochen (ein Halbton von B nach C). Ein Ton (dargestellt mit einem T
) besteht aus zwei Halbtönen. Zum Beispiel wäre ein Halbton von F # nach oben G. Ein Ton von F # nach oben wäre G #.
Um eine dorische Skala zu erstellen, gehen wir von einer beliebigen Notiz in der Liste aus und bewegen uns dann in folgendem Muster nach oben, wobei wir die Noten auflisten, auf die wir stoßen:
T, S, T, T, T, S
Ein Beispiel. Ich gehe von A aus. Die Noten meiner dorischen Skala werden:
A
B (up a tone)
C (up a semitone)
D (up a tone)
E (up a tone)
F# (up a tone)
G (up a semitone)
Die Skala hat die Noten A, B, C, D, E, F # und G. Da ich von A ausging, werden wir dies die dorische Skala in A nennen . Es gibt also 12 verschiedene dorische Skalen, von denen jede nach der Note benannt ist, mit der sie begonnen haben. Jeder von ihnen verwendet das gleiche Muster von Tönen und Halbtönen, nur ausgehend von einer anderen Position. Wenn meine Erklärung nicht kohärent ist, können Sie auch Wikipedia konsultieren .
Die Eingabe des Programms kann von einer beliebigen Stelle aus erfolgen, die für Ihr Programm geeignet ist (z. B. STDIN, Befehlszeilenargument, raw_input()
). Es kann sein, dass es in einer Variablen nicht vorinitialisiert ist. Die Eingabe ist eine Liste von durch Kommas getrennten Noten, die die Melodie des Stücks darstellen. Möglicherweise werden Notizen wiederholt. Die Eingabe wird immer genug unterschiedliche Noten enthalten, um die Tonleiter des Stückes entscheidend bestimmen zu können. Ein Beispiel Input:
B,B,D,E,D,B,A,G#,A,G#,E,D,F#,E,F#,E,F#,G#,A
Die Ausgabe des Programms sollte der String sein Dorian scale in X
, wobei X die Startnote der Skala ist. Die Ausgabe der Beispieleingabe:
Dorian scale in B
Vergleicht man dies mit der Dorian-Skala in B ( B C# D E F# G# A
), so sieht man, dass alle Noten der Melodie innerhalb dieser Skala liegen. Die Note C # wird in diesem Fall nicht verwendet. Es gibt jedoch genügend Hinweise, um B Dorian eindeutig als den richtigen Schlüssel zu identifizieren. Keine andere dorische Tonleiter passt, denn egal welche andere Tonleiter wir versuchen, es gibt immer mindestens eine Note der Melodie, die nicht zur Tonleiter gehört.
Dies ist Codegolf, daher gewinnt der Eintrag mit der kürzesten Anzahl von Zeichen. Fragen Sie in den Kommentaren, wenn Sie Fragen haben.
Antworten:
CJam - 61
Versuchen Sie es unter http://cjam.aditsu.net/
quelle
C
171,146Das Parsen von Strings in C ist nicht so einfach, deshalb habe ich mich für einen mathematischeren Ansatz entschieden.
Ich nutze den Kreis der Fünftel. Wenn wir die Noten in der folgenden Reihenfolge anordnen, indem wir 7 Halbtöne gleichzeitig zählen (als "fünfte" bezeichnet), stellen wir fest, dass alle in einer bestimmten Skala zugelassenen Noten einen aufeinanderfolgenden Block von 7 Noten und alle verbotenen Noten bilden Bilden Sie einen fortlaufenden Block mit 5 Noten.
(Es ist ein Kreis, der sich
F
am Ende nach hinten dreht .)Die Position einer natürlichen Note in der obigen Reihenfolge kann wie folgt berechnet werden
(ASCII code) * 2 % 7
. Wenn das nächste Zeichen ungerade ist (gilt#
jedoch nicht für Komma, Leerzeichen oder Null-Byte), addieren wir 7, um es scharf zu machen. Wir speichern eine Bitmap der verwendeten Notizen.Die Zahl
243
(binär11111000
) entspricht den in der Skala von A # Dorian verbotenen Noten. Ich multiplizierte dies mit(1<<12)+1=4097
der magischen Zahl1016056
. Dies wird mit der rechten Maustaste verschoben, um zu überprüfen (durch UND-Verknüpfung), ob die Melodie verbotene Noten für jede der 12 Skalen enthält. Wenn die Melodie keine verbotenen Noten enthält, wird die Skala gedruckt.Denken Sie daran, dass wir für die Ausgabe den Skalennamen in umgekehrter Reihenfolge drucken müssen, um die oben genannten Fünftel zu durchlaufen, da wir die Rechte verschieben.) Die ASCII-Sequenz
ADGCFBEADGCF
wird von generiert65+i*3%7
. Für die ersten fünf muss zusätzlich ein Scharfes gedruckt werden.Ungolfed Code
Ungültiges Eingabeverhalten: Werden nicht genügend Noten zur Verfügung gestellt, um die Skala eindeutig zu bestimmen, werden alle möglichen Skalen ausgegeben. Wenn eine unmögliche Kombination von Noten angegeben wird, wird nichts ausgegeben. Notizen müssen durch ein Komma (oder ein anderes Nicht-Leerzeichen mit einem geraden ASCII-Code <= 64) getrennt werden. Leerzeichen können nicht verwendet werden, da alles, was nach dem ersten Leerzeichen steht, als anderes Argument angesehen wird. ASCII-Codes> 64 werden wie beschrieben als Hinweise interpretiert.
quelle
Haskell - 152
Ungolfed
quelle
Python 2 - 177 Zeichen
Es ist nicht so kurz, aber ich finde es die Freude von Python, mehrere geschachtelte for-Loops in einer Zeile zu schreiben, auch wenn Sie nicht Golf spielen. Leider musste ich die Eingabeanweisung in eine separate Zeile stellen, damit sie nicht mehr als einmal ausgeführt wurde.
Ich verwende Python 3 nicht, aber ich glaube, dies ist ein seltener Fall, in dem die print-Anweisung keine weiteren Zeichen benötigt. Da
print
es dort eine Funktion gibt, wäre ich in der Lage, die Notwendigkeit von Klammern durch die Verwendung des*
Operators zum Auspacken der Liste auszugleichen, um die letzte zu ersetzen[0]
.quelle
input
fürraw_input
und speichern 4 Zeichen in Python 3.Rubin - 132
Eingabe über Befehlszeilenargumente.
z.B
ruby dorianscale.rb B,B,D,E,D,B,A,G#,A,G#,E,D,F#,E,F#,E,F#,G#,A
Probieren Sie es bei: ideone
quelle
Haskell - 140
Nutzen Sie die von @steveverrill eingeführte Circle of Fifths-Eigenschaft. Wenn wir
circle0 = words "C G D A E B F# C# G# D# A# F"
und lassencircle = circle0 ++ circle0
, können wir alle Skalen konstruieren, indem wir 7 aufeinanderfolgende Noten aufnehmencircle
.In jeder auf diese Weise konstruierten Skala
scale !! 3
ist das vierte Element der Skalenname.Code
Ungolfed
quelle
Scala,
130128127Nach der Methode des Quintenkreises. Eingabe von Kommandozeilenargumenten dh
quelle