Die Dur-Tonleiter (oder Ionian-Tonleiter) ist eine der am häufigsten verwendeten Tonleitern, insbesondere in der westlichen Musik. Es ist eine der diatonischen Skalen. Wie viele musikalische Skalen besteht es aus sieben Noten: Die achte dupliziert die erste mit der doppelten Frequenz, so dass es eine höhere Oktave derselben Note heißt.
Die sieben Noten sind:
C, D, E, F, G, A, B , C (zum Beispiel wiederholt)
Eine Hauptskala ist eine diatonische Skala. Nehmen Sie die vorherige Notenfolge als Dur-Tonleiter (Tatsächlich ist es die Tonleiter C-Dur) . Die Reihenfolge der Intervalle zwischen den Noten einer Dur-Tonleiter ist:
ganz, ganz, halb, ganz, ganz, ganz, halb
Dabei steht "ganz" für einen ganzen Ton (eine rote U-förmige Kurve in der Figur) und "halb" für einen Halbton (eine rote gestrichelte Linie in der Figur).
In diesem Fall existiert von C nach D ein ganzer Ton, von D nach E existiert ein ganzer Ton, von E nach F existiert ein halber Ton, etc ...
Wir haben 2 Komponenten, die den Tonabstand zwischen den Noten beeinflussen. Dies sind das scharfe Symbol (♯) und das flache Symbol (♭).
Das Sharp-Symbol (♯) fügt der Note einen Halbton hinzu. Beispiel. Von C nach D haben wir erwähnt, dass es einen ganzen Ton gibt. Wenn wir C♯ anstelle von C verwenden, dann gibt es von C♯ nach D einen halben Ton.
Das flache Symbol (♭) ist das Gegenteil des scharfen Symbols und subtrahiert den Halbton von der Note. Beispiel: Von D nach E haben wir erwähnt, dass es einen ganzen Ton gibt. Wenn wir stattdessen D verwenden, dann gibt es von Db nach E eineinhalb Töne.
Standardmäßig ist von Note zu Note ein ganzer Ton vorhanden, mit Ausnahme von E to F
und B to C
in denen nur ein Halbton vorhanden ist.
Hinweis in einigen Fällen mit enharmonic Teilungen kann eine äquivalent zu einem Dur - Tonleiter erstellen. Ein Beispiel hierfür ist, C#, D#, E#, F#, G#, A#, B#, C#
wo E#
und B#
sind Enharmonie, aber die Skala folgt der Reihenfolge einer Dur-Skala.
Herausforderung
Geben Sie bei einer gegebenen Skala einen Wahrheitswert aus, wenn es sich um eine Hauptskala oder ein Äquivalent handelt, andernfalls geben Sie einen Falschwert aus.
Regeln
- Standard-E / A-Methode zulässig
- Standard Code-Golfregeln gelten
- Sie müssen die Achtelnote nicht berücksichtigen. Angenommen, die Eingabe besteht nur aus 7 Noten
- Angenommen, es gibt kein doppeltes flaches (♭♭), doppeltes scharfes (♯♯) oder natürliches Vorzeichen (♮)
Testfälle
C, D, E, F, G, A, B => true
C#, D#, E#, F#, G#, A#, B# => true
Db, Eb, F, Gb, Ab, Bb, C => true
D, E, Gb, G, A, Cb, C# => true
Eb, E#, G, G#, Bb, B#, D => true
-----------------------------------------------
C, D#, E, F, G, A, B => false
Db, Eb, F, Gb, Ab, B, C => false
G#, E, F, A, B, D#, C => false
C#, C#, E#, F#, G#, A#, B# => false
Eb, E#, Gb, G#, Bb, B#, D => false
quelle
Antworten:
Perl 6 ,
76656359 Bytes-4 Bytes dank Phil H
Probieren Sie es online!
Erläuterung
quelle
Node.js 10.9.0 ,
78767169 BytesProbieren Sie es online!
Wie?
Jede Noten wird in [ - 118 , - 71 ] mit:
Welches gibt:
Wir berechnen die paarweisen Differenzen modulo12 zwischen diesen Werten.
Der kleinstmögliche Unterschied zwischen 2 Noten ist- 47 , es reicht also aus, ihn hinzuzufügen4 × 12 = 48 bevor Sie das Modulo anwenden, um ein positives Ergebnis zu.
Da wir ein Modulo12 anwenden , ist der von a erzeugte Versatz 36 mod 12 = 0 Halbton, während der von a erzeugte Versatz 38 mod 12 = 2 Halbtöne.
'#'
tatsächlich'b'
istWir verwenden die Eingabevariableein NaN
Für eine größere Skala sollten wir[ NaN , 2 , 2 , 1 , 2 , 2 , 2 ] .
Wir verwenden den Zählerich , um den 4. Wert mit 1 zu vergleichen, anstatt2
quelle
JavaScript (Node.js) ,
150131125 ByteProbieren Sie es online!
-19 Bytes dank Luis Felipe
-6 Bytes dank Shaggy
Ungolfed:
quelle
[...'C0D0EF0G0A0B']
statt'C0D0EF0G0A0B'.split('')
und+""
statt.toString()
, um einige Bytes zu speichernx[1]=='#'|-(x[1]=='b')
anstatt auch einx[1]=='#'?1:(x[1]=='b'?-1:0)
paar Bytes zu speichern-10 % 12 == 2
. Obwohl dies in einigen Fällen scheitern könnte ...Dart ,
198 197 196189 BytesProbieren Sie es online!
Lose Portierung der alten Perl 6-Antwort /codegolf//a/175522/64722
Alte Version :
Dart , 210 Bytes
Probieren Sie es online!
Ungolfed:
Ein ganzer Schritt ist 2, ein Viertel ist 1. Mod 12 für den Fall, dass Sie zu einer höheren Oktave springen. Durchläuft alle Noten und berechnet den Unterschied zwischen der i-ten Note und der i-1-ten Note. Verkettet das Ergebnis und sollte 221222 (2 ganze, 1 halbe, 3 ganze) erwarten.
quelle
i=1
zui=0
können , indem ein Byte reduzierenfor(;i<7;i++)
zufor(;++i<7;)
. Darüber hinaus können die Klammern{}
können um diese Schleife entfernt werden, indem die Umsetzungj+=...
in dem dritten Teil des Loop:for(;++i<7;j+='${(y[0]-y[1])%12}')
. Und eine letzte Sache ändertreturn j=='221222';
sichreturn'221222'==j;
, um den Raum loszuwerden. -6 ( 210 Byte ) nach diesen Änderungen.if(k>9)k--;if(k>3)k--;
zuk-=k>3?k>9?2:1:0;
undk+=m.length<2?0:m[1]=='#'?1:m[1]=='b'?-1:0;return k;
zu wechselnreturn m.length<2?k:m[1]=='#'?k+1:m[1]=='b'?k-1:k;
. :)C (gcc) ,
-DA=a[i]
+ 183 = 191 BytesProbieren Sie es online!
Basierend auf der Perl-Antwort.
Nimmt die Eingabe als breite Zeichenfolge.
Ungolfed:
quelle
[Wolfram Language (Mathematica) + Musikpaket], 114 Bytes
Ich liebe Musik und fand das interessant, aber ich war gerade dabei, richtig Golf zu spielen, als diese Codegolf-Gelegenheit auf mich zukam, so dass mein Beitrag etwas verspätet ist.
Ich dachte, ich würde es auf eine ganz andere Weise versuchen und dabei tatsächlich Musikkenntnisse nutzen. Es stellt sich heraus, dass das Musikpaket von Mathematica die Grundfrequenz der genannten Noten kennt. Zuerst konvertiere ich die Eingabezeichenfolge in eine Folge benannter Noten. Als nächstes nehme ich die Verhältnisse jeder aufeinanderfolgenden Note und verdopple alle, die kleiner als 2 sind (um die Oktavverschiebung zu berücksichtigen). Dann vergleiche ich diese Verhältnisse mit den Verhältnissen der Ionischen Skala, die einen Frequenzunterschied von ungefähr 6% zwischen halben Noten und 12% zwischen vollen Noten aufweisen.
Mehr als die Hälfte der hier verbrachten Bytes dient dazu, die Eingabe in benannte Symbole umzuwandeln.
Probieren Sie es online!
quelle
Python 3 ,
175136134114112 BytesProbieren Sie es online!
Eine einzeilige Python 3-Implementierung.
Vielen Dank an @Arnauld für die Idee, Töne mit Division und Modulo zu berechnen.
Vielen Dank an @Jo King für -39 Bytes.
quelle
[Python]
269202 BytesVerbesserungen von
Jo King
:Versuch es!
Ungolfed, mit Testfahrer:
quelle
Ruby , 109 Bytes
Probieren Sie es online!
quelle