Hintergrundgeschichte [was nicht stimmt]
Ein Klavier ist wie folgt aufgebaut:
Bei meinem Klavier sind jedoch alle schwarzen Tasten defekt!
Ich möchte trotzdem einige Akkorde auf meinem kaputten Klavier spielen können.
In der Musik ist ein Akkord eine Gruppe von Noten, die zusammen gespielt werden. Um die Eingabe von Akkorden zu ermöglichen, werde ich zunächst definieren, was ein Halbton ist.
Was ist ein Halbton?
Ein Halbton ist die kleinste Entfernung in der westlichen Musik. Wenn Sie sich den oberen Teil des Klaviers ansehen, sehen Sie, dass Sie normalerweise von einer schwarzen zu einer weißen Taste wechseln können oder umgekehrt. Zwischen B
und C
und E
und F
gibt es jedoch keinen schwarzen Schlüssel.
Was ist ein Akkord?
Für diese Herausforderung definieren wir einen Akkord als eine Reihe von Noten mit einer bestimmten Anzahl von Halbtönen dazwischen. Nehmen wir zum Beispiel eine Aufnahme eines 4-3-3
Akkords ab C
(für Musiker ist dies ein V 7- Akkord in F-Dur). Wir fangen an bei C
. Wir zählen bis 4 Halbtonschritte: C#
, D
, D#
, E
. Die nächste Note ist E
, und wir zählen 3 Halbtonschritten nach oben danach: F
, F#
, G
. Die nächste Note ist G
, und wir zählen 3 Halbtonschritten nach oben danach: G#
, A
, Bb
. Also bekommen wir C-E-G-Bb
. Yay! Aber warte ... Bb
ist ein schwarzer Schlüssel und die sind kaputt ... Wenn wir jedoch anfangen G
, bekommen wir G-B-D-F
! Yay!
Eingang
Die Eingabe erfolgt als Liste von Ganzzahlen in einem beliebigen vernünftigen Format. Dies stellt den oben beschriebenen Akkord dar.
Ausgabe
Die Ausgabe sollte eine Liste von Notizen sein, für die ich anfangen kann, nur weiße Tasten zu verwenden. Dies kann auch nur eine Zeichenfolge aller bis zu 7 Noten sein, da alle Schlüsselnamen aus einem Zeichen bestehen. Sie müssen auch mit einer leeren Ausgabe umgehen können.
Testfälle
input -> output // comments
4 3 -> C F G // this is a major triad
3 4 -> D E A // this is a minor triad
4 3 3 -> G // this is the major-minor seventh chord
3 3 3 -> [empty output] // this is the diminished-diminished seventh chord. All of them use black keys
4 4 -> [empty output] // this is an augmented triad
3 3 -> B // this is a diminished triad
1 -> B E // this is just a minor second
11 -> C F // this is just a major seventh
Andere Spezifikationen
- Standardschlupflöcher verboten
- Sie können davon ausgehen, dass die Eingabe mindestens eine Ganzzahl hat
- Sie können davon ausgehen, dass alle Ganzzahlen nicht negativ und kleiner als 12 sind (da das Klavier alle 12 Noten wiederholt).
- Die Ausgabe kann in beliebiger Reihenfolge erfolgen
Gewinnkriterien
Die kürzeste gültige Einreichung ab dem 15. April wird akzeptiert.
Antworten:
Gelee , 25 Bytes
Probieren Sie es online aus! oder sehen Sie sich eine Testsuite an
Wie?
quelle
MATL , 31 Bytes
Vielen Dank an Jonathan Allan für die Korrektur.
Probieren Sie es online aus! Oder überprüfen Sie alle Testfälle .
Erläuterung
Das Muster
2 2 1 2 2 2 1
gibt die Intervalle zwischen aufeinanderfolgenden weißen Tasten an. Das Programm verwendet eine Schleife, die alle zyklischen Verschiebungen auf dieses Grundmuster anwendet, um jede Taste als potenziell tiefste Note des Eingangsakkords zu testen. Für jede Verschiebung wird die kumulative Summe des Musters erhalten. Zum Beispiel wurdeB
das Muster als potenziell niedrigste Note verschoben1 2 2 1 2 2 2
und seine kumulative Summe ist1 3 5 6 8 10 12
.Um zu sehen, ob dies einen
4 3 3
Akkord unterstützen kann, berechnen wir die kumulative Summe der Akkordintervalle4 7 10
. reduzieren Sie es über 1-basiertes Modulo 12 (ein Intervall von14
würde geben2
); und prüfen Sie, ob diese Zahlen alle Mitglieder der zulässigen Werte sind1 3 5 6 8 10 12
. Dies ist in diesem Beispiel nicht der Fall. Wäre dies der Fall gewesen, würden wir den Brief ausgebenB
.Die Entsprechung zwischen zyklischen Verschiebungen und Ausgabebuchstaben wird durch die Zeichenfolge definiert
'BAGFEDC'
. Dies zeigt an, dass'B'
(erstes Zeichen) einer zyklischen Verschiebung um entspricht1
;'A'
(zweites Zeichen) entspricht einer zyklischen Verschiebung um2
etc.quelle
Mathematica, 110 Byte (ISO 8859-1-Codierung)
Definiert eine unäre Funktion,
±
die eine Liste von Ganzzahlen als Eingabe verwendet (eigentlich keine Einschränkungen hinsichtlich der Größe oder der Vorzeichen der Ganzzahlen) und gibt eine Liste von Zeichenfolgen mit einem Zeichen zurück. Gibt zum Beispiel±{3,4}
zurück{"A","D","E"}
."A#BC#D#EF#G#"~StringTake~{Mod[#,12,1]}&/@#
ist eine Funktion, die eine Liste von Ganzzahlen in die entsprechenden Notennamen umwandelt, außer dass sie#
für eine beliebige schwarze Taste steht. Dies wird auf jedes Element von angewendetAccumulate[i~Prepend~#]&/@Range@12
, das eine Liste von Notenwerten aus der Listeneingabeliste der Notenintervalle erstellt, beginnend mit jeder möglichen Note von 1 bis 12. Wir filtern alle diese Notennamenlisten heraus, die"#"
using enthaltenSelect[...,FreeQ@"#"]
, und dann Geben Sie die erste Note in jeder verbleibenden Liste mit zurück#&@@@
.quelle
+/-
Symbols 111 Bytes .Accumulate[i~Prepend~#]&
da es sonst zu einem Curry-Konflikt kommen würde. Fühlen Sie sich frei, eine Problemumgehung zu finden!Python 2,
159155 Bytes(Veröffentlichen Sie dies, nachdem Sie sichergestellt haben, dass es eine gültige Einreichung gibt, die kürzer als diese ist.)
So ziemlich nur die triviale Lösung. Eingaben als Liste von Ganzzahlen und Ausgaben mit jedem Zeichen in einer einzelnen Zeile.
-4 Bytes durch Entfernen einer unnötigen Variablen
quelle
JavaScript (ES6),
727168 ByteDurchläuft jede Taste, wobei schwarze Tasten weggelassen werden, und überprüft dann, ob die kumulierte Summe der Halbtöne niemals auf einer schwarzen Taste landet.
Bearbeiten: 3 Bytes dank @Arnauld gespeichert.
quelle