Bevor Sie gehen, müssen Sie nicht viel musikalische Notation verstehen, um diese Herausforderung zu tun.
ERLÄUTERUNG
In Standardnoten gehen Doppelschlüssel über die Seite, die als Referenzpunkte zu den Noten dienen, damit Sie wissen, welche Note gespielt werden soll. Wenn Sie mit dem Violinschlüssel und dem Bassschlüssel noch nicht vertraut sind, finden Sie hier eine Beschreibung aus Wikipedia:
Ein Notenschlüssel ist ein musikalisches Symbol, das die Tonhöhe geschriebener Noten angibt. Auf einer der Zeilen am Anfang der Daube platziert, zeigt es den Namen und die Tonhöhe der Noten in dieser Zeile an. Diese Linie dient als Bezugspunkt, an dem die Namen der Noten in einer anderen Linie oder einem anderen Raum der Daube festgelegt werden können.
In der obigen Abbildung ist die obere Hälfte der Linien der Violinschlüssel, der mit a bezeichnet ist
Die untere Hälfte ist der mit a bezeichnete Bassschlüssel
Wie man auf dem Violinschlüssel eine Note auf der am weitesten unten liegenden Linie ein sieht E . Auf dem Bassschlüssel (Ich bin nicht Noten außerhalb der Schlüssel Linien für diese Herausforderung zu zählen), ist die unterste Zeile ein G . Um diese Herausforderung abzuschließen, müssen Sie folgende Schritte ausführen:
HERAUSFORDERUNG
Konvertieren Sie eine Eingabe in einer der folgenden Formen (Ihrer Wahl) in den entgegengesetzten Schlüssel. Ob es sich um den Violinschlüssel oder den Bassschlüssel handelt, kann ein Truthey / Falsey-Wert in Ihrer Sprache sein (nicht nur zwei beliebige Werte), z
F # T oder F # True oder F # Treble
aber nicht
F # -1 oder F # 4
Leerzeichen und Großschreibung sind optional, Wohnungen werden nicht angezeigt und nachfolgende Leerzeichen sind nicht zulässig.
Input Expected Output
E Treble G
F Treble A
F# Treble A#
G Treble B
G# Treble C
A Treble C
A# Treble C#
B Treble D
C Treble E
C# Treble F
D Treble F
D# Treble F#
E Treble G
F Treble A
F# Treble A#
G Bass E
G# Bass F
A Bass F
A# Bass F#
B Bass G
C Bass A
C# Bass A#
D Bass B
D# Bass C
E Bass C
F Bass D
F# Bass D#
G Bass E
G# Bass F
A Bass F
A# Bass F#
Seien Sie gewarnt, dies ist keine triviale Herausforderung für konstante Unterschiede. Schauen Sie sich die Ein- und Ausgänge genau an. Wenn Sie ein Klavier anschauen,
Die schwarzen Tasten sind scharfe Stellen, die mit # gekennzeichnet sind. Beachten Sie, dass es kein E # oder B # gibt. Dies bedeutet, dass Sie, wenn Sie G # für den Bassschlüssel erhalten, anstatt E # zurückzugeben, F zurückgeben müssen
Dies ist Code-Golf , also gewinnt die kleinste Anzahl von Bytes.
quelle
C
stattC
) in Ordnung?1
und-1
(oder sogar sagen4
und-4
) für die Eingabe des Notenschlüssel-Indikators zulässig oder wäre dies nur akzeptabel, wenn es sich um wahrheitsgemäße / falsche Werte in unserer Sprache handelt?Antworten:
Jelly ,
3534 BytesIch habe das Gefühl, dass eine gewisse Arithmetik diese Methode für sich gewinnen könnte.
Probieren Sie es online!
Ein vollständiges Programm, das 1 ) die Notenschlüsselanzeige
0
oder1
für Bässe bzw. Höhen und 2) die Note nimmt; und Drucken der resultierenden Notiz.Wäre 31 Bytes, wenn
-4
und wäre4
akzeptabel als Schlüsselindikator-Eingabewerte (Ñi+_⁸?4ị¢
kann dann werdenÑi+⁸ị¢
), aber dies wurde klargestellt als nicht erlaubt, es sei denn -4 ist falsch und 4 ist wahr, was für Jelly nicht der Fall ist.Wie?
Baut eine Tastatur mit Phantom
B#
undE#
Tasten auf, findet den Index der Eingabe und versetzt diese4
in die gewünschte Richtung, indexiert zurück in eine Tastatur, wobei diese Phantomtasten durch die erforderlichen Ergebnisse (die Taste darüber) ersetzt werden:quelle
Befunge,
7064 BytesProbieren Sie es online!
Die Eingabe sollte in der Form
C# Treble
oder erfolgenF Bass
, obwohl der Schlüssel einfach der erste Buchstabe (dhT
oderB
) sein kann, da der Rest der Eingabe sowieso ignoriert wird.Erläuterung
Infolge dieser Codeänderung wird die nächste Befehlssequenz eine von zwei Formen annehmen:
Zu diesem Zeitpunkt enthält der Stapel entweder
note,0,sharp,space
odernote,0,space
.Zu diesem Zeitpunkt enthält der Stapel entweder
note,0
oder nurnote
(mit einer impliziten Null darunter).quelle
Perl 5, 56 Bytes
Liest die Notiz und den Notenschlüssel als zwei Zeilen von STDIN und druckt die neue Notiz an STDOUT. Der Notenschlüssel ist
0
für Höhen und1
für Bässe.quelle
-p
Flag tio.run/##K0gtyjH9/79YX08/OaNIwcxUW0PXRMvGTju/KEVFTVPVXD/…JavaScript (ES6) 74 Byte
Nimmt die Eingabe in currying Syntax
(note)(clef)
woclef
ist0
für Bass und1
für die Höhen .Demo
Code-Snippet anzeigen
Wie?
Das macht zwar etwas weniger Spaß als meine Vorgängerversion, aber die zugrunde liegende Nachschlagetabelle
F#,C#,(unused),D#,A#,F,C,G,D,A,E,B,F
ermöglicht es nun, die # -Bedingung zu verkürzen und gleichzeitig den NUL- Zeichentrick zu vermeiden - was vermutlich ein bisschen grenzwertig war.Vorherige Version
7675 BytesDemo
Code-Snippet anzeigen
Wie?
Die Eingabe (n, c) wird durch die folgenden Schritte verarbeitet:
Wir bewerten zuerst,
4 * !!n[1] + c + n
wo wahr ist (auf 1 erzwungen ), wenn die Note ein # enthält , und falsch (auf 0 erzwungen ), wenn dies nicht der Fall!!n[1]
ist . Der Ausdruck ergibt einen numerischen Wert, der vor dem String n eingefügt wird .4 * !!n[1] + c
Impliziter Schritt: Führende Nullen und nachfolgende # werden von ignoriert
parseInt()
. Beispielsweise"5G#"
wird tatsächlich analysiert als"5G"
.Wir konvertieren den neuen String in einen Dezimalwert, indem wir ihn als Basis-21-Größe analysieren.
Wir wenden modulo 24 an.
Wir wenden modulo 17 an.
Unten finden Sie eine Übersichtstabelle für alle möglichen Eingabepaare sowie die erwartete Ausgabe. Beachten Sie, dass der Ausgabe ein # hinzugefügt werden muss, wenn das Endergebnis 0 , 2 , 3 oder 5 ist . Daher die Verwendung der Binärmaske 101101 ( 45 dezimal).
quelle
Python 2 , 77 Bytes
Funktion, die nach druckt
STDOUT
.True
wandelt Bässe in Höhen undFalse
Höhen in Bässe um.Probieren Sie es online!
Erläuterung:
N=ord(n[0])-63-4*c;
berechnet den Index (0 bis 7) des Buchstabens der neuen Note, ohne Berücksichtigung von Schärfen.ord(N[0])-63-4*c
Ruft den Index des aktuellen Buchstabens ab und addiert oder subtrahiert 2 je nach dem Wert vonc
(Variable zum Umschalten der Konvertierungsrichtung).M=-~N%3<1<len(n);
berechnet, ob diese Variable angepasst werden muss. Wenn zum Beispiel die neue NoteE
scharf ist und die ursprüngliche Note scharf war, muss dies auf eine eingestellt werdenF
. Die verkettete Ungleichung funktioniert wie folgt:-~N%3<1
prüft, ob der Index der neuen Note in der Reihenfolge ist3n-1
. Dies ergibt nur wahr fürE
undB
, die beiden Noten, die kein scharfes haben.1<len(n)
prüft, ob die ursprüngliche Note scharf war (dies würde die Länge der Saite größer als 1 machen). Dies ist erforderlich, da die neuen Notizbuchstaben nicht angepasst werden müssen, wenn kein Scharfzeichner vorhanden ist.M
entwederTrue
oderFalse
, der bei der Berechnung als verwendet werden kann ,1
und die0
jeweils, so dass die Einstellung durchzuführen brauchen wir nur M zu N hinzufügen und modulo um 7.chr((N+M)%7+65)
Fügt die Anpassung bei Bedarf hinzu und konvertiert den Wert von einem Index zurück in ein Zeichen.+n[1:2-M]
fügt ein scharfes Symbol hinzu, wenn sowohlM=0
(keine Einstellung vorgenommen wurde) als auch der ursprüngliche Wert scharf waren.quelle
Java 8, 119 Bytes
Erläuterung:
Probieren Sie es hier aus.
quelle
n->b->((char)((n.charAt(0)-(b?0:4))%7+65)+n.substring(1)).replaceAll("B#","C").replaceAll("E#","F")
R , 111 Bytes
Probieren Sie es online!
Ungolfed:
quelle