Richtlinien
Aufgabe
Berechnen Sie bei zwei als Zeichenfolgen oder Listen / Arrays eingegebenen Noten, wie viele Halbtöne (einschließlich der Noten selbst) voneinander entfernt sind, und geben Sie sie als Zahl aus.
Erklärung eines Halbtons:
Ein Halbton ist eine Stufe höher oder tiefer auf der Tastatur. Ein Beispiel ist C bis C #. Wie Sie unten sehen können, befindet sich die Note C auf einer weißen Note und C # ist die schwarze Note direkt darüber. Halbtöne sind die Sprünge von einer schwarzen Note zur nächsten weißen Note nach oben oder unten, mit Ausnahme von:
- B bis C
- C nach B
- E bis F
- F bis E
Beispiele
'A, C' -> 4
'G, G#' -> 2
'F#, B' -> 6
'Bb, Bb' -> 13
Regeln
- Der größte Abstand zwischen zwei Noten beträgt 13 Halbtöne.
- Die zweite eingegebene Note steht immer über der ersten eingegebenen Note.
- Sie können Eingaben entweder als Zeichenfolge oder als Array / Liste annehmen. Wenn Sie es als Zeichenfolge verwenden, werden die Noten durch Kommas getrennt (z
String -> 'A, F'
. B.Array -> ['A', 'F']
). - Sie können davon ausgehen, dass Sie immer zwei gültige Noten erhalten.
- Scharfe Stellen werden als
#
und flache Stellen als bezeichnetb
- Ihr Code muss Enharmonic-Entsprechungen unterstützen (z. B. muss er sowohl F # als auch Gb unterstützen)
- Ihr Code muss keine Notizen unterstützen, die mit, aber ohne Scharf oder Flach benannt werden können (dh Sie müssen E # oder Cb nicht unterstützen). Bonuspunkte, wenn Ihr Code dies unterstützt.
- Ihr Code muss keine Double Sharps oder Double Flats unterstützen.
- Sie können davon ausgehen, dass die zweite nicht genau eine Oktave über der ersten liegt, wenn Sie die gleichen Noten oder die gleiche Tonhöhe (z. B. 'Gb, Gb' oder 'A #, Bb') erhalten.
- Dies ist Codegolf, daher gewinnt die Antwort mit der geringsten Anzahl von Bytes.
G -> G#
weil sie beide enthalten sind.Cb
oder sorgenE#
? Was ist mit Double Sharps / Wohnungen?(X, Y]
dass C bis C # 1 Halbton und C bis C 12 Halbtöne sind.Antworten:
Python 2 , 66 Bytes
Probieren Sie es online!
Python 2 , 68 Bytes
Probieren Sie es online!
quelle
JavaScript (ES6), 78 Byte
1 Byte dank @Neil gespeichert
Nimmt die Notizen in Curry-Syntax auf
(a)(b)
.Testfälle
Code-Snippet anzeigen
Hash-Funktion
Der Zweck der Hash-Funktion besteht darin, eine Note in einen Zeiger in einer Nachschlagetabelle umzuwandeln, die die hexadezimal gespeicherten Halbton-Offsets (C = 0, C # = 1, ..., B = 11) enthält.
Wir fügen zuerst eine '3' an die Note an und analysieren den resultierenden String in base-36, was zu einer Ganzzahl N führt . Weil '#' ein ungültiges Zeichen ist, wird es einfach ignoriert, zusammen mit allen darauf folgenden Zeichen.
Dann berechnen wir:
Nachfolgend finden Sie eine Zusammenfassung der Ergebnisse.
Über Wohnungen und scharfe Gegenstände
Unten ist der Beweis, dass diese Hash-Funktion sicherstellt, dass eine Note gefolgt von einem '#' dasselbe Ergebnis liefert wie die nächste Note gefolgt von einem 'b' . In diesem Absatz verwenden wir das Präfix @ für Basis-36-Mengen.
Beispielsweise wird Db in @ db3 und C # konvertiert. in @c konvertiert (siehe vorherigen Absatz). Wir wollen beweisen, dass:
Oder im allgemeinen Fall mit Y = X + 1 :
@ b3 ist 399 dezimal. Deshalb:
1296 ist kongruent zu 1 modulo 37 , daher kann dies vereinfacht werden als:
Ein Sonderfall ist der Übergang von G # nach Ab , da wir erwarten würden, dass Hb den obigen Formeln entspricht. Dies funktioniert jedoch auch, weil:
quelle
Perl,
3932 BytesEnthält
+1
fürp
Geben Sie die Start- und Endnoten als zwei Zeilen auf STDIN an
Nur der Code:
quelle
Japt , 27 Bytes
Online testen!Übernimmt die Eingabe als Array von zwei Zeichenfolgen.
Funktioniert auch für eine beliebige Anzahl von Spitzen oder Abflachungen auf jeder Basisnote!
Erläuterung
quelle
Perl 5+
-p
, 66 BytesProbieren Sie es online!
Nimmt durch Kommas getrennte Werte an. Funktioniert auch für Cb, B #, E #, Fb und multiple # / b.
Erläuterung:
Erklärung zur Auswertung:
quelle
Ruby , 56 Bytes
Probieren Sie es online!
Die Buchstaben werden
5/3
wie folgt gemäß ihrer ASCII-Code-Zeiten analysiert (dies ergibt die erforderliche Anzahl von Halbtönen plus einen Versatz von 108).Das letzte Zeichen (
#
,b
oder der Brief wieder) als sein ASCII - Code durch 32 geteilt geparst wie folgtDies wird vom Buchstabencode abgezogen.
Dann wird das Endergebnis als zurückgegeben
13-(difference in semitones)%12
quelle
Stax ,
2524 BytesFühren Sie es online aus und debuggen Sie es
Dies ist die entsprechende ASCII-Darstellung desselben Programms.
Tatsächlich berechnet es den Tastaturindex jeder Note mithilfe einer Formel und berechnet dann das resultierende Intervall.
2 - code / 32
wobeicode
der ASCII-Code des letzten Zeichens ist.quelle
["F#","B"]
sollte 6.Batch,
136135 BytesErläuterung: Die Ersetzungen im
c
Unterprogramm ersetzen#
im Notennamen mit+1
undb
mit-1
. Da dies case insensitiv ist,Bb
wird-1-1
. Die Variablen fürC
...A
(auch ohne Berücksichtigung der Groß- / Kleinschreibung) werden daher so gewählt, dass sie die entsprechende Anzahl von Halbtönen entfernt sindB=-1
. Die resultierende Zeichenfolge wird dann ausgewertet, und @ xnors Trick, das Ergebnis vom Wert zu subtrahieren, ergibt den gewünschten Effekt, die Notenwerte voneinander zu subtrahieren. Bearbeiten: Schließlich verwende ich @ Arnauld's Trick, das Modulo von 13 zu subtrahieren, um die gewünschte Antwort zu erhalten und 1 Byte zu sparen.quelle
Python 3 , 95 Bytes
Probieren Sie es online!
-14 Bytes dank user71546
quelle
ord(q[0])-65
Ersetzen"ABCDEFG".find(q[0])
;)(g(b)+~g(a))%12+2
Ersetzen1+((g(b)-g(a))%12or 12)
Gelee , 28 Bytes
Ein monadischer Link, der eine Liste mit zwei Zeichenlisten akzeptiert und eine Ganzzahl zurückgibt.
Probieren Sie es online! oder sehen alle möglichen Fälle .
Wie?
Führt eine bizarre Arithmetik an den Ordnungszahlen der eingegebenen Zeichen durch, um die Noten auf die Ganzzahlen Null bis Zwölf abzubilden, und führt dann eine Basisdekomprimierung als Proxy für Modulo durch Zwölf durch, wobei dann Null durch 12 ersetzt und Eins addiert wird.
Auch bei 28 Bytes ...
Ein (nicht so direkter) Port von Xnors Python 2 Antwort ...
Versuche alle möglichen Fälle
quelle
CJam , 67 Bytes
Online-Dolmetscher: http://cjam.aditsu.net/
quelle