Ein Gitarren-Griffbrett-Diagramm sieht folgendermaßen aus:
0 1 2 3 4 5 6 7 8 9 10 11 12 <- Fret number (0 means it's open)
|-E--F--F#-G--G#-A--A#-B--C--C#-D--D#-E
|-B--C--C#-D--D#-E--F--F#-G--G#-A--A#-B
|-G--G#-A--A#-B--C--C#-D--D#-E--F--F#-G
|-D--D#-E--F--F#-G--G#-A--A#-B--C--C#-D
|-A--A#-B--C--C#-D--D#-E--F--F#-G--G#-A
|-E--F--F#-G--G#-A--A#-B--C--C#-D--D#-E
Wie Sie sehen können, ist der erste geöffnete String (von oben) ein E
. Der erste Bund auf der ersten Saite ist ein F
. Der vierte Bund auf der dritten Saite ist a B
. Beachten Sie, dass die erste Note der nullte Bund ist, nicht der erste.
Dies kann mit Zahlen im Format geschrieben werden string, fret
. Die Zeichenfolgen sind von oben nach unten von 1 bis 6 nummeriert. Die Bünde sind von links nach rechts von 0 bis 12 nummeriert. Der erste E
ist also 1, 0
. Einige andere Beispiele:
1, 0 --> E
1, 1 --> F
3, 5 --> C
5, 1 --> A#
6, 6 --> A#
Herausforderung:
Nehmen Sie N
Zahlenpaare ( s
und f
) und geben Sie eine begrenzte Notenfolge aus.
- Die Eingabe kann in jedem geeigneten Format erfolgen. Tupel, 2D-Matrix, zwei getrennte Listen, eine verwobene Liste (String, Bund, String, Bund ...) usw.
- Der Ausgabeton sollte getrennt sein, das Trennzeichen ist jedoch optional (Komma, Leerzeichen, Bindestrich ...). Die Ausgabe kann in Groß- oder Kleinschreibung erfolgen.
s
(für Zeichenkette) liegt im Bereich[1, 6]
(Sie können wählen, ob i 0 indiziert werden soll)f
(für Bund) wird im Bereich sein[0, 12]
Testfälle und Beispiele:
1 4 5 2 1 3 <- String
4 2 6 3 5 1 <- Fret
G# E D# D A G#
6 2 3 1 4 2 3 2 2 2 6 5 2
0 1 2 3 4 5 6 7 8 9 10 11 12
E C A G F# E C# F# G G# D G# B
3 3 3 3 3 3 3 3 3 3 3 3 3 <- String
0 3 5 0 3 6 5 0 3 5 3 0 0 <- Fret
G A# C G A# C# C G A# C A# G G
// The same test case, but different input and output format:
(3,0)(3,3)(3,5)(3,3)(3,6)(3,5)(3,0)(3,3)(3,5)(3,3)(3,0)(3,0)
G,A#,C,G,A#,C#,C,G,A#,C,A#,G,G
Viel Glück und viel Spaß beim Golfen!
Antworten:
05AB1E ,
48474340 BytesVerwendet die CP-1252- Codierung.
Sowohl Saiten als auch Bünde basieren auf 0.
Erläuterung
Probieren Sie es online!
7 Bytes gespart dank Adnan
quelle
"AA#BCC#DD#EFF#GG#"•7V3•3BS£
stattdessen"A A# B C C# D D# E F F# G G#"#
ist ein paar bytes kürzer :)."AA#BCC#DD#EFF#GG#"
Strings:•™ÎÚ,Ülu•žh'#A«‡
(da Kleinbuchstaben erlaubt sind: p).JavaScript (ES6),
79-70ByteBenötigt 1-basierte Zeichenfolgen. Bearbeiten: Speichert 9 Bytes durch direkte Berechnung der Konvertierung von Zeichenfolge in Bund basierend auf der alten Antwort von @ nimi.
quelle
Mathematica, 62 Bytes (nicht konkurrierend)
Das
{24,19,15,10,5,0}
und dasE2
stellen die offenen Saitentöne der sechs Gitarrensaiten dar (die oberste Saite ist beispielsweise 24 Halbtöne über der Note E2). Nichtkonkurrierende , weil sie die Namen der nicht gedruckt Noten-it spielt die Reihenfolge der Noten! (nur wenn Sie leider Mathematica haben) Zum Beispiel,spielt die ersten 4 Takte von Pachelbels Canon. (Das ist ungefähr so viel von Pachelbels Canon, wie ich ausstehen kann)
quelle
MATL ,
484745 BytesVielen Dank an @Emigna für die Korrektur des Eingabeformats.
Gitarren- und Codegolf ... ich musste das beantworten!
Das Eingabeformat ist: ein Array von (1-basierten) Zeichenfolgen, dann ein Array von (0-basierten) Bünden.
Probieren Sie es online!
Erläuterung
Einige in dieser Antwort verwendete Sprachfunktionen:
Kommentierter Code:
quelle
Java, 174
Ungolfed:
quelle
C
104103 BytesNimmt Zahlen als
string fret
Paare auf stdin und gibt die Note nach jedem Paar aus. Z.B:quelle
Ruby, 63 Bytes
Nimmt ein Array von 2-Element-Arrays in der Reihenfolge
[string,fret]
.Erläuterung
In der Standardstimmung ist die Gitarre eines der wenigen Saiteninstrumente (Streichinstrumente oder Bünde) mit inkonsistenten Abständen zwischen den Saiten. Die meisten haben entweder ein konsistentes 5-Halbton-Intervall zwischen allen Paaren benachbarter Saiten (ein "viertes") oder ein konsistentes 7-Halbton-Intervall zwischen allen Paaren benachbarter Saiten (ein "fünftes"). Dies entspricht einem Frequenzverhältnis von 3: 4 und 2: 3 und sind nur in der "Oktave" mit dem Frequenzverhältnis 1: 2 von zweiter Bedeutung.
Die Gitarre hat meist 5 Halbtonintervalle. Wenn es 5 davon hätte, hätte es einen Unterschied von 25 Halbtönen zwischen der 1. und 6. Saite. Stattdessen wird das Intervall zwischen der 2. und 3. Saite auf 4 Halbtöne reduziert, was einen Unterschied von 24 Halbtönen (2 Oktaven) ergibt, was für das Spielen von Akkorden besser ist.
Dies ist für das Programm unpraktisch. Daher ändern wir zunächst die 1-indizierte Gitarren-Intonation in eine 0-indizierte 5-Saiten-Bass-Intonation, die alle Intervalle von 5 Halbtönen aufweist:
Als nächstes addieren wir 2 und geben die Stimmung eines fiktiven 12-Saiter-Basses mit der folgenden Intonation der offenen Saiten an, und alle Intervalle sind 5 Halbtöne (12-Saiter- "Bässe" existieren, aber ich bin nicht sicher, ob es viele mit genau diesem gibt Abstimmung.)
Wie zu sehen ist, sind alle Scharfe zu einer Gruppe zusammengefasst. Dieses Muster kann unendlich oft wiederholt werden. Es wird als „Quintenzirkel“ bekannt und ist von grundlegender Bedeutung für den westlichen Tonleiter (mit einem wenig Tuning Einstellung des Kreis kann aufgrund der Tatsache geschlossen wird , dass
(3/2)**12
und2**7
sind sehr ähnliche Zahlen.Jetzt beschäftigen wir uns mit dem Bund-Parameter. Im Gegensatz zu vielen anderen Antworten, bei denen der String-Parameter in mehrere Bünde übersetzt wird, übersetze ich den Bund-Parameter in mehrere Strings. In der obigen Tabelle ist zu sehen, dass durch Hinzufügen von 7 zur String-Nummer ein String entsteht, dessen Notenname einen Halbton höher liegt. (Es ist in einer völlig anderen Oktave, aber das spielt keine Rolle.) Also addieren wir
i[1]*7
die String-Nummer und nehmen es modulo 12:Wir subtrahieren diesen Wert von 6, um eine Zahl im Bereich von 6 bis -5 zu erhalten, und schlagen den Buchstaben in nach
BEADGCF
(Ruby lässt zu, dass negative Indizes zum Ende des Arrays zurücklaufen.) Wennn>=7
wir ein#
Symbol hinzufügen müssen, um die Ausgabe zu vervollständigen .Testprogramm
Ausgabe
quelle
C # 131 Bytes
Geben Sie zwei separate Listen ein. Die Zeichenfolgen basieren auf 1.
quelle
Clora , 55 Bytes
@T[0,7,2,10,5,0,7]+N%12@T[,A,A#,B,C#,D,D#,E,F,F#,G,G#]!
Erläuterung
@
numerischer Modus (Eingabe als Zahlen lesen)T[0,7,2,10,5,0,7]
Eingaben mit dem Array transformieren, ex array [Input]+N
Addiere N (Nächster Eingabewert) zum aktuellen Eingang%12
Modulo 12 der aktuelle Eingabewert@
Den numerischen Modus ausschaltenT[,A,A#,B,C#,D,D#,E,F,F#,G,G#]
Übersetzen Sie die Eingabe in ein Array!
Eingabe als Ausgabewert verwendenquelle
Java 7
197163 BytesUngolfed
quelle
Python 2,
94, 91, 88 BytesEs gibt wahrscheinlich einige offensichtliche Verbesserungen. Die Eingabe ist eine Liste von Paaren, und die Zeichenfolgen sind mit 0 indiziert, z.
quelle
Haskell,
8382 BytesNimmt eine Liste von Strings und eine Liste von Bünden, beide 0-indiziert. Anwendungsbeispiel:
Löschen Sie aus der unendlichen Liste der Noten, die mit beginnt
A#
, die Anzahl der Noten, die in der Liste[6,1,9,4,11,6]
am Index der Zeichenfolge angegeben sind, und wählen Sie die Note am Index des Bundes aus der verbleibenden Liste aus.quelle
(s*7)+(s>2)
ich diese jetzt in meiner Antwort.JavaScript (ES6),
8281 BytesIch wollte eine rein mathematische Antwort versuchen, aber es stellte sich heraus, dass es ein wenig lang war. Vielleicht gibt es eine Möglichkeit, Golf zu spielen ...
Testschnipsel
Code-Snippet anzeigen
quelle
toString(17)
aber Mühe, es in einer vernünftigen Anzahl von Bytes zu bekommen.PHP, 102 Bytes
Geben Sie beide 0 als Mehrfacharray ein, zum Beispiel '[[2,0], [5,3], [2,12], [3,8], [0,3]]'.
Schöne Alternative 106 Bytes um das # basierend auf Mod 7 kongruent zu setzen
quelle