Hinweis : Anders Kaseorg warnt mich, dass dies ein Duplikat einer anderen vorherigen Frage sein könnte . Es scheint so, und es tut mir leid, dass ich diese Frage nicht gefunden habe, bevor ich diese gepostet habe. Dennoch hat diese Frage nur eine Antwort erhalten, und diese ist einfacher, nur für den Fall, dass Sie diesmal alle versuchen möchten. Ich werde es verstehen, wenn diese Frage als Duplikat markiert wird.
Die Herausforderung
Bei einer Eingabe wie dieser:
8g 8Df 4cs 2C 1A
Schreiben Sie das kürzeste Programm / die kürzeste Funktion, die eine Ausgabe wie die folgende erzeugt:
/\ -o-
| |
---|-|---------------------------------------------------|-|
|/ | |
---/|--------|\----b-*-----------------------------------|-|
/ | | | | o | |
-|--|--------|------|-----------------|------------------|-|
| (| \ | | | | | |
-|--|--)----*-------|/---------|------|------------------|-|
\ | / | | | |
-----|-------------------------|-------------------------|-|
| |
*_/ #-*-
Regeln
Die Ausgabe muss aus einem fünfzeiligen Stab bestehen, der mit der Zeichnung eines G-Schlüssels genau wie oben beginnt, links vom Stab ausgerichtet ist und nach dem Start des Stabes eine einzelne Spalte verlässt.
/\
| |
---|-|--
|/
---/|---
/ |
-|--|---
| (| \
-|--|--)
\ | /
-----|--
|
*_/
^
Single column
Die Notizen müssen je nach Typ mit einem *
oder einem o
Zeichen beginnen .
Es müssen genau acht Trennspalten für jedes *
oder ein o
Zeichen vorhanden sein:
/\ -o-
| |
---|-|---------------------------------------------------|-|
|/ | |
---/|--------|\----b-*-----------------------------------|-|
/ | | | | o | |
-|--|--------|------|-----------------|------------------|-|
| (| \ | | | | | |
-|--|--)----*-------|/---------|------|------------------|-|
\ | / | | | |
-----|-------------------------|-------------------------|-|
| |
*_/ #-*-
↑ ↑ ↑ ↑ ↑ ↑ ↑
8 columns of separation
Der Stab muss mit dem rechts ausgerichteten Abschlusszeichen enden, wie im Beispiel gezeigt. Der linke Balken des Abschlusszeichens muss 8 Spalten von der letzten Note entfernt sein.
Die Eingabe ist eine einzelne Zeichenfolge, die die Noten enthält (mindestens eine, keine leeren Eingaben), wobei jede durch ein Leerzeichen getrennt ist (Sie können davon ausgehen, dass jede Note eine richtige Note ist, sodass Sie nicht nach Fehlern suchen müssen). Sie können die Eingabe auch als ein Array von Zeichenfolgen mit einer Note pro Element im Array annehmen. Für jede Note ist das erste Zeichen der Nenner der Notenlänge ( 1
für eine ganze Note / ein halbes Blatt beginnt er mit o
; 2
für eine halbe Note / ein Minimum beginnt er mit o
; 4
für eine Viertelnote / einen Schritt beginnt er mit *
; und 8
für eine Achtel note / quaver , beginnt mit*
). Das zweite Zeichen ist die Notiz (siehe nächste Tabelle), und das dritte optionale Zeichen ist f
oder F
für flache Noten und s
oder S
für scharfe Noten.
--- A (ledger line)
G
-------- F
E
-------- D
C
-------- b
a
-------- g
f
-------- e
d
--- c (ledger line)
Natürlich muss die Eingabe die Groß- und Kleinschreibung der Noten berücksichtigen, aber Sie können die Groß- f
und Kleinschreibung der und s
-Modifikatoren auswählen .
Notiert c
und A
fügt zwei -
(Hauptbuchzeilen) an jeder Seite hinzu, da die Belegschaft erweitert werden muss. Notizen d
und G
sind aus dem Personal, brauchen aber keine Hauptbuchzeilen.
Abgeflachte oder geschärfte Noten müssen links von der Note eine b
oder #
zwei Positionen hinzufügen .
Die Stiele (falls vorhanden) müssen mit 4 vertikalen Balken gezeichnet werden. Noten von b
und über müssen den Stiel nach unten und links von der Note ziehen. Noten von a
und unter müssen den Stiel nach oben und rechts von der Note ziehen. Quaver müssen die Flagge immer nach rechts und genau wie gezeigt anbringen und müssen nicht gebeamt werden, wenn mehrere von ihnen hintereinander sind.
--------------------------
-----|\----b-*------------
| | |
-----|------|-------------
| | |
----*-------|/---------|--
↑↑ |
----||------↑↑---------|--
|| || |
|| || #-*-
|\ |\ ↑↑
| Stem | Note | Stem
Note Stem Note
Wie üblich kann Ihr Programm / Ihre Funktion die Ausgabe direkt zeichnen oder einen String, ein Array von Strings, eine Matrix von Zeichen oder ein anderes vernünftiges Format zurückgeben.
Nützliche Links
Das ist Code-Golf , also kann das kürzeste Programm / die kürzeste Funktion für jede Sprache gewinnen!
Bonus: Versuche Beispiele mit berühmten Melodien zu schreiben und lass jeden raten, um welche Melodie es sich handelt!
Antworten:
SOGL V0.12 ,
178175174173172171 BytesProbieren Sie es hier aus! (θ zur Vereinfachung der Verwendung hinzugefügt; Um 171 Byte auszuführen, wird erwartet, dass sich die Eingabe auf dem Stapel befindet.)
Soweit ich das beurteilen kann, funktioniert es, aber wenn Sie Probleme haben, sagen Sie es mir.
Erläuterung:
Erster Teil: Canvas-Erstellung
Zweiter Teil: Loop, Noten Kopf Platzierung
dritter Teil: Flaggen und Stiele
quelle
2bs
in Ihrem Beispiel den Stiel nach unten zeigen muss.JavaScript (ES6),
616.527ByteVielen Dank an @shaggy für das Entfernen von fast 90 Bytes
Ich hatte keine Ahnung von Notizen ... bis jetzt hoffe ich habe es richtig verstanden.
Erläuterung
quelle
t[0]
und speichernt[2]
, und dann einfach tunq=t.length*9
s>6&&(
dem Sie ein Byte sparen können. Sie können auch ein anderes Byte mit speichern, indem Sie(w=q+12)
mitw
,repeat(q=i.length*9)
mitrepeat(w=i.length*9)
undrepeat(q)
mit ersetzenrepeat(w,w+=12)
.Charcoal ,
180171168163 BytesProbieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Drucken Sie die Daube.
Notenschlüssel drucken.
Durchlaufen Sie jede Note.
Finden Sie die Y-Koordinate der Notiz.
Das ist wirklich hinterhältig: Es
χ
handelt sich um eine Variable, die auf 10 vordefiniert ist. Dies ist genau die X-Koordinate des Versehens der ersten Note, falls vorhanden. Nach dem Springen zu dieser Position wird 9 hinzugefügt, die die nächste Notenposition darstellt.Drucken Sie den Unfall aus, falls vorhanden.
Drucken Sie ggf. die Hauptbuchzeilen und die Notiz aus. Tatsächlich wird die Linie auf einer geraden y-Koordinate gedruckt, obwohl das Drucken über die Daube natürlich keine Auswirkung hat.
Nichts mehr für Halbrebe zu tun.
Für Noten unterhalb des Mittelpunkts
ziehe den Stiel nach oben,
und die Flagge für Achtel.
Für Noten über dem Mittelpunkt
den Stiel nach unten ziehen,
und die Flagge für Achtel.
quelle