Siehe auch: Musik: Was ist in diesem Akkord? , Hinweise zur Tabulatur , Gitarren-Tabs generieren? , Zahlenpaare in Gitarrennoten übersetzen
Geben Sie bei gegebenem Gitarrengriff den Akkord aus, den er repräsentiert. Sie können die Standardeingabe und -ausgabe verwenden oder eine Funktion schreiben, die eine Zeichenfolge zurückgibt.
Die eingegebenen Fingersätze können als einer der folgenden Akkorde klassifiziert werden, die wie folgt ausgedrückt werden (wenn der Grundton C wäre):
- Haupttriade:
C
- Moll-Triade:
Cm
- (dominante) siebte:
C7
- Moll 7 .:
Cm7
Der Akkord ist möglicherweise invertiert, sodass Sie sich nicht darauf verlassen können, dass die unterste Note der Grundton ist. Sie können sich auch nicht darauf verlassen, dass dies in der realen Welt ein einfacher oder üblicher Fingersatz ist. Im Allgemeinen muss die Ausgabe Ihres Programms die Oktaven der Tonhöhen ignorieren und alle Tonhöhen, die derselben Musiknote (dh derselben Note A
) entsprechen, als gleich behandeln.
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes.
Eingabeformat
Die Eingabe ist eine Reihe von 6 Werten, die für jede Saite einer 6-saitigen Gitarre in der Standardstimmung (EADGBE) angeben, an welchem Bund diese Saite gespielt wird. Dies könnte auch darauf hinweisen, dass die Saite überhaupt nicht gespielt wird. Der "nullte" Bund ist auch als die offene Position bekannt, und die Bundnummern zählen von dort aufwärts. Angenommen, die Gitarre hat 21 Bundpositionen, so dass die höchste Bundposition die Nummer 20 ist.
Zum Beispiel X 3 2 0 1 0
bedeutet die Eingabe , dass Sie Ihre Finger an den folgenden Stellen am oberen Rand des Gitarrenhalses platzieren:
(6th) |---|---|---|---|---
|-X-|---|---|---|---
|---|---|---|---|---
|---|-X-|---|---|---
|---|---|-X-|---|---
(1st) |---|---|---|---|---
und Klimpern der 2. bis 6. Saite. Es entspricht dieser ASCII-Registerkarte :
e |-0-|
B |-1-|
G |-0-|
D |-2-|
A |-3-|
E |---|
Sie können die Art der Eingabe flexibel auswählen: Jede Bundposition kann als Zeichenfolge oder als Zahl ausgedrückt werden. Gitarrensaiten, die nicht gespielt werden, werden normalerweise mit einem gekennzeichnet X
. Sie können jedoch einen anderen Sentinel-Wert auswählen, wenn dies für Sie einfacher ist (z. B. -1
wenn Sie Zahlen verwenden). Die Reihe von 6 Bundpositionen kann als Liste, Array oder Sequenztyp, als einzelne durch Leerzeichen getrennte Zeichenfolge oder als Standardeingabe eingegeben werden.
Sie können sich auf den Eingang verlassen, der einem der oben genannten 4 Akkordtypen entspricht.
Bitte erläutern Sie in Ihrem Beitrag, welche Form der Eingabe Ihre Lösung annimmt.
Ausgabeformat
Sie müssen einen String, der den Akkord beschreibt, für den der Fingersatz bestimmt ist, entweder zurückgeben oder zur Standardausgabe drucken. Diese Zeichenfolge besteht aus zwei miteinander verbundenen Teilen. Kapitalisierung Angelegenheiten. Leerzeichen dürfen nachgestellt werden.
Der erste Teil gibt die Grundnote , eines A
, A#
/ Bb
, B
, C
, C#
/ Db
, D
, D#
/ Eb
, E
, F
, F#
/ Gb
, G
oder G#
/ Ab
. (Ich verwende #
statt ♯
, und b
statt ♭
zu vermeiden Unicode erfordert.) Root stellt fest , dass ohne scharfe oder flach ausgedrückt werden kann , muss ohne sie ausgedrückt werden (nie ausgegeben B#
, Fb
oder Dbb
); diejenigen, die nicht ausgedrückt werden können, müssen durch ein einzelnes scharfes oder flaches Symbol ausgedrückt werden (dh entweder C#
oder Db
, aber niemals B##
). Mit anderen Worten, Sie müssen die Anzahl der Vorzeichen (scharfe oder flache Stellen) im Namen der Notiz minimieren.
Der zweite Teil gibt die Art des Akkords an, entweder leer für eine Dur-Triade, m
für eine Moll-Triade, 7
für die dominante Septime oder m7
für die Moll-Septime. So wird ein G-Dur einfach als ausgegeben G
, während ein d-Moll-Septime als entweder D#m7
oder ausgegeben werden könnte Ebm7
. Weitere Beispiele finden Sie in den Testfällen am Ende.
Theorie & Hinweise
Musiknoten
Die chromatische Skala hat 12 Tonhöhen pro Oktave. Bei gleicher Stimmung ist jede dieser Tonhöhen gleich weit von ihren Nachbarn 1 entfernt . Tonhöhen, die 12 Halbtöne voneinander entfernt sind (eine Oktave), gelten als dieselbe Note. Dies bedeutet, dass wir Noten wie ganze Zahlen modulo 12 von 0 bis 11 behandeln können. Sieben von ihnen werden mit den Buchstaben 2 von A bis G bezeichnet. scharf) zu einer Note macht es einen Halbton höher, und das Hinzufügen eines ♭ (flach) macht es einen Halbton niedriger.
Akkorde
Ein Akkord besteht aus 2 oder mehr gleichzeitig gespielten Noten. Die Art des Akkords hängt von den Beziehungen zwischen den Noten ab, die durch die Abstände zwischen ihnen bestimmt werden können. Ein Akkord hat, wie bereits erwähnt, einen Grundton. In diesen Beispielen wird der Grundton als 0 behandelt, dies ist jedoch willkürlich und alles, was bei dieser Herausforderung wichtig ist, ist der Abstand zwischen den Noten in Modulo-Arithmetik. Es gibt immer einen eindeutigen Akkordtyp für die Antwort, entweder eine Triade oder einen siebten Akkord . Der Grundton ist nicht immer die Tonhöhe mit der niedrigsten Frequenz. Wählen Sie den Grundton so, dass Sie den Akkord als einen der vier folgenden Akkordtypen beschreiben können:
- Eine Dur-Triade ist ein Akkord mit den Noten
0 4 7
. - Eine Moll-Triade ist ein Akkord mit den Noten
0 3 7
. - Ein dominanter (oder Dur / Moll) Septakkord hat die Noten
0 4 7 10
. - Ein Moll- (oder Moll- / Moll-) Septakkord enthält die Noten
0 3 7 10
. 3
Gitarrenstimmung
Standardstimmung auf einer 6-saitigen Gitarre beginnt mit E auf der untersten Saite und trifft dann Noten in Intervallen von 5, 5, 5, 4, dann 5 Halbtönen, die die Saiten hinaufgehen. Wenn Sie das niedrigste E als 0 nehmen, bedeutet dies, dass Sie durch das Anschlagen aller Saiten der Gitarre die Tonhöhen nummerieren 0 5 10 15 19 24
, die Modulo 12 entspricht 0 5 10 3 7 0
, oder die Noten E A D G B E
.
Arbeitsbeispiele
Wenn Ihre Eingabe so ist 0 2 2 0 0 0
, entspricht dies den Noten E B E G B E
, also nur E, B und G. Diese bilden den Akkord Em
, der sichtbar wird, indem Sie sie mit dem Grundton als E nummerieren und uns geben 0 3 7
. (Das Ergebnis wäre dasselbe für X 2 X 0 X 0
, oder 12 14 14 12 12 12
.)
Wenn Ihre Eingabe lautet 4 4 6 4 6 4
, nummerieren Sie diese mit einer Wurzel aus C♯ ergibt 7 0 7 10 4 7
oder 0 4 7 10
, lautet die Antwort C#7
(oder Db7
). Wenn es stattdessen 4 4 6 4 5 4
wäre, würde die Nummerierung geben 7 0 7 10 3 7
, oder 0 3 7 10
, was ist C#m7
(oder Dbm7
).
Testfälle
X 3 2 0 1 0 ---> C
0 2 2 0 0 0 ---> Em
X 2 X 0 X 0 ---> Em
4 4 6 4 6 4 ---> C#7 (or Db7)
4 4 6 4 5 4 ---> C#m7 (or Dbm7)
0 2 2 1 0 0 ---> E
0 0 2 2 2 0 ---> A
X X 4 3 2 2 ---> F# (or Gb)
3 2 0 0 0 1 ---> G7
X X 0 2 1 1 ---> Dm7
3 3 5 5 5 3 ---> C
4 6 6 5 4 4 ---> G# (or Ab)
2 2 4 4 4 5 ---> B7
0 7 5 5 5 5 ---> Am7
7 6 4 4 X X ---> B
8 6 1 X 1 3 ---> Cm
8 8 10 10 9 8 --> Fm
0 19 5 16 8 7 --> Em
6 20 0 3 11 6 --> A# (or Bb)
X 14 9 1 16 X --> G#m (or Abm)
12 14 14 12 12 12 --> Em
15 14 12 12 12 15 --> G
20 X 20 20 20 20 --> Cm7
X 13 18 10 11 10 --> A#7 (or Bb7)
1 durch die Logarithmen ihrer Frequenzen
2 oder, in solfège , Namen wie do, re, mi . Verwenden Sie in dieser Herausforderung die Buchstabennamen.
3 Dies könnte auch als Dur-Sechstel-Akkord bezeichnet werden, mit einer anderen Wahl des Grundtons. Nennen Sie es in dieser Herausforderung beim untergeordneten siebten Namen.
Antworten:
MATL ,
115114 BytesDas Eingabeformat ist
[N 3 2 0 1 0]
, woN
nicht verwendete Zeichenfolge angibt.Die Ausgabezeichenfolge verwendet immer
#
, nichtb
.Probieren Sie es online! Oder überprüfen Sie alle Testfälle in zwei Teilen, um das Timeout des Online-Compilers zu vermeiden:
Erläuterung
quelle
MS-DOS-COM-Datei (179 Byte)
Die Datei (hier als HEX angezeigt):
Die Eingabe erfolgt über die Kommandozeile. Ungültige Eingaben führen zu ungültigem Programmverhalten!
Der Assembler-Code sieht folgendermaßen aus:
Ich habe schon zwei Klavierspieler gesehen, die zusammen "vierhändig" auf einem Klavier gespielt haben.
Dieser Testfall ist das erste Mal, dass ich etwas über Gitarristen lese, die dies tun!
Selbst wenn Sie mit der rechten Hand tippen, können Sie so eine Schnur nicht spielen!
quelle
Ruby, 129 Bytes
Wie die Vorgängerversion, jedoch mit einer einzigen Schleife, mit ternärem Operator, um zwischen dem Analyseschritt und dem Ausgabeschritt zu wechseln. Einige andere geringfügige Änderungen waren erforderlich, um diese Arbeit zu machen.
Rubin, 136 Bytes
Die Llamda-Funktion akzeptiert ein Array mit 6 Zahlen als Argument und gibt es an stdout aus. Nicht verwendete Zeichenfolge wird durch einen falschen Wert dargestellt (die einzigen falschen Werte in Ruby sind
nil
undfalse
.)Erläuterung
Ich benutze eine Darstellung der 12 Tonhöhen basierend auf dem Quintenkreis . Dies bedeutet, dass auf jede Tonhöhe eine um 7 Halbtöne höhere (oder 5 Halbtöne niedrigere) Tonhöhe folgt, die die Sequenz ergibt
F C G D A E B F# C# G# D# A#
. Dies hat zwei Vorteile. Eines ist, dass alle Schärfen zusammen erscheinen. Das andere ist, dass die offenen Saitennoten des 5-Saiter-Basses zusammen erscheinen: GDAEB (die Gitarre ist verwandt, aber etwas komplexer, siehe unten).Die erste Schleife läuft 6 mal. Der Ausdruck
6--~j%5
(äquivalent6-(j+1)%5
) gibt die Notenwerte für die offenen Saiten:E=5 A=4 D=3 G=2 B=6 E=5
. Dazu addieren wir die Bundzahl multipliziert mit 7 (wie oben zu sehen ist, bewegt uns das Hinzufügen eines Halbtons um 7 Stellen in der Sequenz vorwärts.) Dann nehmen wir das Ganze Modulo 12 und machen eine Bitmap der vorhandenen Noten (wir) verwenden4097<<note value
2 aufeinander folgende Oktaven zu geben.)Nachdem wir die Bitmap erstellt haben, können wir den Akkord suchen und ausgeben.
Wir interessieren uns für folgende Hinweise:
Beginnen wir mit der Prüfung auf Akkord F und prüfen, ob der Grundton und der fünfte vorhanden sind: die Bits 0 und 1 (von der niedrigsten Stelle ausgehend: die Bits 1 und 2). Um sechste Akkorde abzulehnen, müssen wir auch den sechsten prüfen fehlt: Bit 3 (8er Bit), also überprüfen wir das
r&&11==3
und drucken den Akkord , wenn ja.Wir ignorieren die Dur-Terz und verlassen uns vollständig auf Bit 9 (Moll-Terz) und Bit 10 (Moll-7.Th.), um den Akkordtyp zu ermitteln. Der Ausdruck
r>>9&3
wird verwendet, um den richtigen Akkordtyp aus einem Array auszuwählen.Am Ende der Schleife, verschieben wir das Bitmap eines Bit nach rechts
r/=2
den möglichen Akkorde Wurzeln in Sequenz zu testen:F C G D A E B F# C# G# D# A#
.Ungolfed im Testprogramm
quelle
Javascript (ES6),
335 -333 ByteIch liebe diese Herausforderung und PPCG SE! Dies ist mein erstes Golf - Vorschläge willkommen, da ich sicher bin, dass es viel verbessert werden könnte. (2 Bytes abgeschlagen, da ich f = in die Zählung einbezogen hatte)
Function verwendet
f
eine Reihe von Zeichenfolgen, die Zahlen und 'X' darstellen,f(['X','3','2','0','1','0'])
und gibt einen Akkord (natürlich oder scharf) zurückE#m7
. Zeilenumbrüche zur Verdeutlichung hinzugefügt (nicht in Byteanzahl enthalten)Anwendungsbeispiel:
So führen Sie Testfälle aus:
Ungolfed Version mit Erklärung:
quelle