Eingang
Das Symbol eines Triadenakkords (siehe http://en.wikipedia.org/wiki/Chord_(music)#Triads ).
Ausgabe
Die Noten, die den gegebenen Akkord bilden.
Beispiele
Eingabe: AM
Ausgabe:A C# E
Eingabe: C#m
Ausgabe:C# E G#
Eingabe: Db+
Ausgabe:C# F A
Eingabe: C0
Ausgabe:C D# F#
Boni
-50, wenn Sie auch mit Septakkorden umgehen können
-150 für das tatsächliche Spielen des Akkordklangs
-150 für die Verwendung druckbarer Zeichen, um das Spielen des Akkords auf einem Klavier zu zeigen; Beispiel für AM
:
┌─┬─┬┬─┬─┬─┬─┬┬─┲┱─┬─┬─┲━┱┬─┲━┱─┬─┬┬─┬┬─┬─┐
│ │ ││ │ │ │ ││ ┃┃ │ │ ┃ ┃│ ┃ ┃ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ┃┃ │ │ ┃ ┃│ ┃ ┃ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ┃┃ │ │ ┃ ┃│ ┃ ┃ │ ││ ││ │ │
│ └┬┘└┬┘ │ └┬┘└┲┛┗┱┘ │ ┗┯┛└┲┛ ┃ └┬┘└┬┘└┬┘ │
│ │ │ │ │ ┃ ┃ │ │ ┃ ┃ │ │ │ │
└──┴──┴──┴──┴──┺━━┹──┴──┴──┺━━┹──┴──┴──┴──┘
-100 für die Verwendung druckbarer Zeichen, um das Spielen des Akkords auf einer Gitarre zu zeigen; Beispiel für AM
:
x o o o o o
┌───┬───┬───┬───┬───┐
│ │ │ │ │ │
├───┼───┼───┼───┼───┤
│ │ │ │ │ │
├───┼───┼───┼───┼───┤
│ │ █ █ █ │
├───┼───┼───┼───┼───┤
│ │ │ │ │ │
(siehe https://en.wikipedia.org/wiki/Box-drawing_character )
Regeln
Das Ergebnis muss ein Befehlszeilenprogramm oder ein Skript sein.
Die Ein- und Ausgabe kann in beliebiger Form erfolgen, sofern sie einem Musiknotationsstandard entspricht.
Eine Gitarren- oder Klavierdarstellung gilt nur dann als gültig, wenn sie die drei (Triade) oder vier (Siebte) erforderlichen Noten enthält und sonst nichts. Dieselbe Note kann mehrmals im Akkord enthalten sein.
Externe Bibliotheken sind nicht zulässig, mit Ausnahme der Klangerzeugung (in diesem Fall werden die Direktiven
#include
,import
... nicht zur Zeichenanzahl hinzugefügt).Dies ist Codegolf, der kürzeste Code gewinnt!
Ein bisschen Musiktheorie ...
In der modernen westlichen Klangmusik besteht jede Oktave aus zwölf aufeinanderfolgenden Noten, die häufig notiert werden:
A
A#
B
C
C#
D
D#
E
F
F#
G
G#
Oder:
La
La#
Si
Do
Do#
Re
Re#
Mi
Fa
Fa#
Sol
Sol#
In diesem System werden zwei aufeinanderfolgende Noten (z. B. A
und A#
, oder E
und F
) durch einen Halbton getrennt. Auch die Noten sind eine Art "Schleife": Was unmittelbar folgt, G#
ist A
.
Ein Akkord besteht aus ein paar (2, 3, 4, manchmal mehr) Noten, die "zusammen gut klingen". Zum Beispiel enthalten triadische Akkorde drei verschiedene Noten und siebente Akkorde vier verschiedene Noten.
Definieren wir die vier triadischen Akkorde als:
Dur-Dreiklang : Enthält den Grundton des Akkords (in dieser Frage die als Eingabe angegebene Note), das große Drittel für den Grundton (4 Halbtöne höher als der Grundton) und das perfekte Fünftel für den Grundton (7 Halbtöne höher als der Grundton) ); Dies kann durch 0-4-7 symbolisiert werden
Kleine Triade , symbolisiert 0-3-7
Erweiterte Triade , symbolisiert 0-4-8
Verminderte Triade , symbolisiert 0-3-6
So zum Beispiel, wenn Sie einen machen wollen C - Dur - Dreiklang , bemerkt C
, CM
, Cmaj
, müssen Sie drei fest:
- 0: die Wurzel , in diesem Fall a
C
- 4: das kleine Drittel , 4 Halbtöne höher als die Wurzel; das ist ein
E
- 7: das perfekte Fünftel , 7 Halbtöne höher als die Wurzel: a
G
Dies ist , was die 0-4-7
, 0-3-7
, 0-4-8
und 0-3-6
Notationen über die mittleren verwendet! Verwenden Sie für die siebten Akkorde das folgende Muster:
Das war `s für heute! Überraschen Sie mich jetzt mit erstaunlichem Code ... Wenn Sie Fragen haben, fügen Sie unten einige Kommentare hinzu.
Db+
gibtDb F A
es kein D # oder G drin. Das ist vielleicht ein bisschen mehr Theorie als nötig, die Formeln waren der wichtige Teil. Wenn Sie wirklich alle acht der in Wikipedia aufgelisteten siebten Akkorde einschließen möchten, sollten Sie die Eingabe angeben. Ich gehe davon aus, dass die Ascii-Art-Ausgabe von Klavier und Gitarre flexibel ist.Antworten:
BBC BASIC
Emulator bei bbcbasic.co.uk
Rev 1, 340 - 150 Tastatur - 150 spielen = 40
Hier ist die neueste Version, in der ich es geschafft habe, die folgenden Verbesserungen einzubeziehen, während ich mich nur um ein paar Zeichen verlängere.
Die Eingabe kann bequem auf dem Bildschirm bearbeitet werden, bevor die Eingabetaste gedrückt wurde (ich habe zuvor GET $ verwendet, um einzelne Tastendrücke zu erhalten, da Sie in BBC Basic nicht auf ein einzelnes Zeichen aus einer Zeichenfolge zugreifen können, als ob die Zeichenfolge ein Array wäre sperrige MID $ -Funktion zum Extrahieren einer Zeichenfolge aus einer Zeichenfolge.
Beide Tastaturseiten werden angezeigt sowie die vollständige Linie zwischen E und F.
Um die oben hinzugefügten Zeichen zu kompensieren, habe ich das Programm neu angeordnet, um unnötige Druckanweisungen zu eliminieren, und einige Leerzeichen gelöscht, die auf den ersten Blick so aussahen, als könnten sie nicht gelöscht werden. IN BBC Basic sind alle eingebauten Funktionen reservierte Wörter, und Sie können einen Variablennamen ohne Leerzeichen davor setzen. Variablennamen dürfen nicht mit einem reservierten Wort beginnen. Um das Lesen des Programms zu vereinfachen, habe ich alle Variablen in Kleinbuchstaben geändert.
Obwohl die Präsentation viel besser aussieht, ist das folgende Programm tatsächlich schon
voll besetzt.(Siehe Korrektur unten.) Im Allgemeinen sind Zeilenumbrüche und Doppelpunkte austauschbar, außer wenn eine IF-Anweisung verwendet wird. In diesem Fall werden alle Anweisungen in derselben Zeile (durch Doppelpunkte getrennt) bedingt ausgeführt. Anweisungen nach dem Zeilenumbruch werden nicht von der IF gesteuert und immer ausgeführt.Programm Rev. 1 340 Zeichen
KORREKTUR: Mit BBC BASIC für Windows von RT Russell können Sie einige Zeilenumbrüche und Doppelpunkte entfernen und die Gesamtsumme auf 327 reduzieren (siehe unten). Außerdem werden die Schlüsselwörter vor dem Speichern in einzelne Zeichen unterteilt und auf 279 reduziert.
Ausgangsdrehzahl 1
Rev 0, 337 - 150 Tastatur - 150 spielen = 37Dies ist ein ähnliches Konzept wie bei meiner Arduino-Antwort, aber ich wusste immer, dass ich diese Byteanzahl mit BBC Basic übertreffen kann. Erkennt nur scharfe Stellen, aber hält B # für ungültig, müssen Sie C setzen. Dies könnte behoben werden, wenn es wirklich als wichtig erachtet wurde.
Ich gab die Idee der Gitarre auf und konzentrierte mich auf die Verbesserung des Keyboards. Es läuft jetzt von C nach B, und ich habe auf der linken Seite der Tastatur und der Linie zwischen E und F hinzugefügt. Das kostet 28 Zeichen. Die rechte Seite würde nicht viel mehr sein.
Hier sind einige Beispiele, ein A # -reduzierter Akkord (der in dieser Umkehrung einen ziemlich ausgeflippten Klang hat) und ein B-Dur-Akkord. Beachten Sie, dass die Eingabe nicht auf dem Bildschirm wiedergegeben wird. Drehen Sie den Bildschirm gemäß der Arduino-Antwort gegen den Uhrzeigersinn, um ihn anzuzeigen.
Ungolfed-Version
quelle
Wie Sie sehen, habe ich nicht versucht, Golf zu spielen. Ich bin ein Musikfreak und mein Lieblingsfreak ist es, wenn Leute Dinge mit der falschen Enharmonik schreiben (zB sagen, dass ein C-reduzierter Akkord CD # F # anstelle von C Eb Gb ist), also habe ich dieses Programm geschrieben, das die Enharmonik bekommt Recht. Dies geschieht, indem jede Note als die Anzahl der perfekten Quinten über F dargestellt wird.
Wenn Sie die Enharmonik unterscheiden möchten, kann jedes musikalische Intervall in einem Computerprogramm in Form einer Anzahl von perfekten Quinten und einer Anzahl von Oktaven dargestellt werden. Eine erweiterte Quinte besteht beispielsweise aus 6 perfekten Quinten und -3 Oktaven, und eine verminderte Quinte besteht aus -6 perfekten Quinten und 4 Oktaven.
Haskell, 441 Zeichen
Einige Beispielaufrufe:
quelle
Arduino
Die Ein- / Ausgabe wird über einen COM-Port an den Arduino gesendet bzw. von diesem empfangen. Ein Benutzer kann damit über ein Terminal oder den seriellen Monitor in der Arduino IDE interagieren. Wie Sie vielleicht aus meiner Wahl der Plattform erraten haben, plane ich, das eigentliche Spielen des Akkords aufzunehmen (obwohl ich es noch nicht getan habe.)
Ich habe den Keyboard-Bonus erfolgreich in Angriff genommen und mit begrenztem Erfolg versucht, die Gitarre in Angriff zu nehmen.
Die Akkordbox kommt mit 130 Bytes an, was zu lang ist, um es wert zu sein. Deshalb habe ich einen anderen Weg versucht, einfach den Bundnummern-Tab-Stil auszudrucken. Derzeit sind dies 81 Bytes für einen Bonus von 81-100 = -19. Wenn dieser Ansatz als gültig erachtet wird, kann ich versuchen, ihn zu verbessern.
Die verwendeten Akkorde sind alle vom Typ D, wobei der Grundton auf der 2. Saite, der fünfte auf der 3. Saite und der dritte auf der 1. und 4. Saite liegt. Die 5. und 6. Saite werden nicht verwendet und ich markiere dies mit X rechts neben dem Akkordkasten (die linke wäre üblicher, aber die rechts markierten Beispiele sind zu finden.)
Da das Programm F als die tiefste Note ansieht (um die Kompatibilität mit der Tastatur zu gewährleisten und gleichzeitig zu hohe Bünde mit dieser Akkordform zu vermeiden), ist der höchste Akkord ein E (mit Grundton im 17. Bund). Siehe Beispielausgabe.
Die Tastatur ist beim Golfen erfolgreicher. Es läuft aus den oben beschriebenen Gründen eher von FE als von CB. Sie müssen den Bildschirm um 90% gegen den Uhrzeigersinn drehen, um die Konturen der schwarzen Noten und die Abgrenzung zwischen den weißen Noten mit deutlich zu erkennen
---
. Die Linie zwischen B und C könnte um einige____
Bytes verlängert werden.Ich werde als nächstes versuchen, die Noten zu spielen. Dies wird interessant sein, da, obwohl ich glaube, dass der Arduino Uno 3 interne Timer hat, mit dem eingebauten Tonbefehl immer nur eine Note gespielt werden kann. Es gibt eine externe Bibliotheksfunktion, die alle Hardware-Timer verwendet (die die Seriennummer durcheinander bringen, aber in diesem Stadium sowieso nicht benötigt werden). Alternativ kann ich versuchen, die Töne in Softare zu erzeugen.
Wenn ich damit erfolgreich bin, werde ich Golf spielen, aber ich denke nicht, dass es der Gesamtsieger sein wird.
Ungolfed Code
Beispielausgabe Je geringer der Abstand zwischen den Textzeilen ist, desto besser sieht dies aus. Daher sieht es toll aus, wenn ich den Beitrag gerade bearbeite, aber schrecklich in der grauen Box nach dem Posten. Stattdessen habe ich einen Screenshot des seriellen Arduino-Monitors gepostet, der einen mittleren Zeilenabstand aufweist (und daher die Anzeigequalität gewährleistet).
quelle
Python3 - 315 Zeichen
Zum ersten Mal in Codegolf! Unterstützt derzeit nur Moll-, Dur-, verminderte und erweiterte Akkorde.
quelle
'C C# D D# E F F# G G# A A# B'.split(' ')
anstelle Ihres Literal-Arrays, um einige Bytes zu speichern.if('#'in a):j+=1
->if'#'in a:j+=1
= 2 Zeichen weniger für jede Aussage. Wenn Siey
zu einemrange()
Ausdruck wechseln , wird auch etwas gespeichert. Herzlich willkommen! (und denken Sie daran, dass auch Zeilenumbrüche zählen;))'C C# D D# E F F# G G# A A# B'.split()
;) können mehr Bytes gespeichert werdeny
zu speichern[1,2,4,5,6]
, warum gehst du nicht einfach überspringen diey
und ersetzen Linie 4 mitfor i in[1,2,4,5,6]:
? Wie auch immer, willkommen bei Codegolf und ich hoffe, Sie haben Spaß hier.Python 506 (Unicode als 1 Zeichen) -150 (Sound) -150 (Tastatur) = 206
Zum Abspielen von Ton wird verwendet
pygame.midi
. Beachten Sie, dass diepygame.midi.get_default_output_id()
Methode nicht sehr gut funktioniert. So können Sie versuchen , die Linie zu änderno=Output(get_default_output_id())
zuo=Output(1)
,o=Output(2)
usw. Normalerweise ist der richtige Wert zwischen 0 und 5.Ergebnisse
quelle
J - 82 Zeichen
In sich geschlossen, liest von der Konsoleneingabe. Wenn Sie stdin benötigen, ändern Sie das Finale
1
in a3
. Keine Boni beanspruchen und nur die Triaden abdecken.Anstelle einer scharfen Notiz
C#
müssen Sie zB den entsprechenden flachen Namen verwendenDb
. (Wenn Sie dies korrigieren, wird der Code mehr als ein bisschen aufgeblasen.) Die vier Akkordtypen dienen0
zum Verringern,m
für Moll,M
für Dur und+
für Augmented.Die Logik ist wie folgt: Wir verwenden das letzte Zeichen, um der Basis 0-3-6 einen Versatz hinzuzufügen, der die Art des dritten und fünften Zeichens auswählt. In der Zwischenzeit verwenden wir die Notiz, um herauszufinden, von wo in der Skala die Noten gezogen werden sollen. Die
;:
beide machen die Note kompatibel mit der Indizierung in die Wagschale zu Beginn und später (nach&.
) verwandelt sie die gezogenen Noten in einen Raum getrennt String.Anwendungsbeispiel:
quelle
Javascript, 224 Zeichen
Dies ist mein erster Code Golf. Ich denke, es kann kürzer sein, aber ich kann keine Bytes zum Speichern finden.
Unterstützt die wichtigsten,
m
für kleinere,0
für verminderte,+
für Augmented oder 37 mehr Bytes fürdim
,aug
.quelle
n[m]==0
kann einfach sein!n[m]
. Gleiches gilt an anderer Stelle. Insgesamt können Sie 6 Zeichen leicht abschneiden .n
String ist,n[m]==0
wird gegossen0
zu"0"
, so dass es zu gleichn[m]=="0"
."0" == 0
ist wahr, aber!"0"
ist falsch.AM
. Ich könnte mich auch irren.Python (
143134 Zeichen)Meine erste Golfherausforderung :), weiß nicht, ob noch mehr Bytes entfernt werden können.
Die hier verwendete Notation ist * aug / + maj /, min / - dim.
Ich verdiene einen Bonuspunkt für die Konstante 42 im Code: P
quelle
n,q,a='A A# B C C# D D# E F F# G G#'.split(),[4,4,3,3],input();m,i=ord(a[-1])-42,n.index(a[:-1])
Python 3: 257 - 150 = 107
Nur 25 Zeichen zu lang, um die J-Lösung zu übertreffen! Naja. Hier gibt es einige nette Ideen, denke ich.
Die Eingabe entspricht den Beispielen, Sie müssen jedoch scharfe Namen anstelle von flachen Namen verwenden. (zB Gb muss F # sein)
Ausgang ist eine einzelne Oktave eines Klaviers, von oben und links gesehen, mit überlagerten Notennamen. Sollte nur ein winziger Teil der Vorstellungskraft sein.
quelle
CM
wir sollten in der Lage sein zu lesenC E G
...bool(R)
durchR|0
?bool(R)
1 (wahr) ist, wenn es nicht leer ist, und 0 (falsch), wenn es leer ist. Der|
Operator arbeitet nicht mit Listen ...Scala 537 Zeichen - 50
quelle
Haskell, 273 Zeichen
Ergebnisse
quelle