In den Tiefen Ihres temporären Ordners finden Sie einige Kompositionen für das Klavier. Leider wurden diese Kompositionen nur mit Notennamen und -dauer geschrieben, und Sie haben nur Zugriff auf ein Textterminal. Ihre Aufgabe ist es daher, ein Programm zu schreiben, mit dem die Kompositionen als ASCII-Kunst dargestellt werden.
Eingang
Ihr Programm sollte zwei Zeichenfolgen als Eingabe akzeptieren. Die erste Saite repräsentiert die Noten des oberen Notensystems (mit dem Violinschlüssel), während die zweite Saite die Noten des unteren Notensystems repräsentiert.
Die Noten werden in wissenschaftlicher Tonhöhennotation weitergegeben . Die Notizen des obersten Personals werden immer zwischen C4
und C6
einschließlich sein. Die Notizen des unteren Personals werden immer zwischen C2
und C4
einschließlich sein.
Jede Note wird mit einer Dauer kommen, die sein: 1
, 2
, 4
, 8
. Diese repräsentieren eine ganze Note (Semibreve), eine halbe Note (Minim), eine Viertelnote (Crotchet) bzw. eine Achtelnote (Quaver).
Noten mit einer anderen Dauer werden niemals in der Eingabe angezeigt.
Wie die Note und die Dauer getrennt werden und wie jede Note von anderen Noten in der Eingabe getrennt wird, liegt in Ihrem Ermessen. Das Folgende ist ein Beispiel für die Eingabe der Top-Mitarbeiter:
E4/4 A4/8 C#5/8 E5/2
Hier sind die Noten durch ein Leerzeichen und die Dauer durch einen Schrägstrich von der Note getrennt. Diese Begrenzungslinien sind nicht festgelegt, und Sie können sie ändern oder ganz weglassen.
Sie können davon ausgehen, dass in jedem Notensystem mindestens eine Notiz vorhanden ist. Die Eingabe enthält keine Pausen.
Ausgabe
Ihr Programm soll die Partitur als ASCII-Grafik ausgeben, die den folgenden Beschreibungen entspricht.
Die Schlüssel sollten als erstes links von Ihrer Ausgabe stehen (der Abstand zwischen den beiden Notenzeilen sollte nicht geändert werden):
^
| |
------|/----
/
-----/|-----
/ |
---/--__----
| / \
---\-\|-|---
\ | /
------|-----
|
\_/
----___-----
/ \ |
---\---|----
| |
-------/----
/
-----/------
------------
Der Stiel einer Note (die vertikale Linie neben dem Kreis) sollte nach oben zeigen, wenn sich die Note unter der Mittellinie eines Notensystems befindet. Es sollte nach unten zeigen, wenn sich die Note über der Mittellinie eines Notensystems befindet. Befindet sich die Note in der Mittellinie, kann der Stiel in beide Richtungen zeigen. (Die einzige Ausnahme hiervon betrifft den Bonus und tritt auf, wenn die später beschriebenen Achtelnoten verbunden werden.) Der Stiel sollte in der Linie über / unter dem Kreis beginnen und 6
hoch sein.
Alle Arten von Noten mit Ausnahme ganzer Noten haben Stiele. Das Flag einer Achtelnote wird durch zwei Schrägstriche in verschiedenen Zeilen dargestellt (siehe Beispielnotizen unten).
Ein ausgefüllter Notenkopf (für Viertelnoten und Achtelnoten) wird durch dargestellt (@)
. Ein leerer Notenkopf (für halbe und ganze Noten) wird durch dargestellt ( )
.
Zufällige Zeichen (scharfe, flache, natürliche Zeichen) sollten wie in den Beispielnotizen gezeigt mit genau einem Zeichen zwischen der rechten Seite des zufälligen und der linken Seite des Notenkopfs platziert werden.
Hauptbuchzeilen sollten bei Bedarf verwendet werden und 7
Zeichen umfassen, die um den Notenkopf zentriert sind.
Jede Notiz sollte 12
Zeichen breit sein.
Beispiel Notizen:
|_
|_| ( )
| |------
|
------------ ---------|-- ------------ ------------ ------------
|
------------ ---------|-- ---|-------- ------------ ------------
(@) _|_|_ | |_
-----|------ _|_|_-( )--- ---|/-(@)--- ------------ ---------|\-
| | | | | \
-----|------ ------------ -----|------ ------------ ---------|--
| | |
-----|------ ------------ -----|------ ------------ ---------|--
| | / |
|/ --(@)--
quarter note half note eighth note whole note eighth note
sharped flatted natural
Lassen Sie nach der 12-stelligen Notiz die 2 * 12 - 12 = 12
Zeichen leer (entweder oder
-
abhängig von der Zeile), wenn die Notiz eine Viertelnote ist. Wenn die Note eine halbe Note ist, lassen Sie die 4 * 12 - 12 = 36
Zeichen leer. Wenn die Notiz eine ganze Notiz ist, lassen Sie die 8 * 12 - 12 = 84
Zeichen leer. Fügen Sie keine zusätzlichen Zeichen für Achtelnoten hinzu.
Geben Sie am Ende jedes Taktes (96 Zeichen nach dem Notenschlüssel oder dem Taktstrich) einen Taktstrich aus. Dies wird durch hinunter jedes Zeichen zwischen den obersten und untersten meisten Linien (einschließlich) durchgeführt, und das Ersetzen mit
|
und -
mit +
. (Siehe Beispielausgabe am Ende der Frage).
Geben Sie am Ende des Stücks das Musikende aus, indem Sie 3 Taktstriche hintereinander ausgeben, jedoch mit einem Leerzeichen zwischen dem ersten und dem zweiten. Das ist:
+-++
| ||
+-++
| ||
. ..
. ..
Beachten Sie, dass Schärfen, Abflachungen und Naturtöne bis zum Ende der Messung bestehen bleiben. Das natürliche Zeichen sollte nur verwendet werden, um eine Schärfe oder Abflachung auszugleichen, die zuvor im selben Maß verwendet wurde.
Bei dieser Aufgabe wirken sich Scharfe, Ebenen und Naturtöne nur auf eine Note in einer Oktave und in einem Notenschlüssel aus (ein Scharfzeichen auf A5 bewirkt kein Scharfzeichnen von A4 und ein Scharfzeichen auf C4 im oberen Notensystem bewirkt nichts C4 im unteren Stab abgeflacht sein).
Informationen nur für den Bonus
Der Bonus besteht darin, die Achtelnoten richtig zu verbinden.
Wenn zwei aufeinanderfolgende Achtelnoten vorhanden sind, die auf den Viertelnotentakt ausgerichtet sind (mit anderen Worten, die Anzahl der Zeichen vor der ersten Achtelnote ist ein Vielfaches von 24), müssen die beiden Achtelnoten verbunden werden.
Lassen Sie Note A die Note sein, die am weitesten von der Mitte des Stabes entfernt ist. Wenn beide Noten den gleichen Abstand von der Mitte haben, kann es sich bei jeder Note um Note A handeln . Lassen Sie die andere seine Anmerkung Anmerkung B .
Die Richtung beider Stiele sollte die Richtung des Stiels von Note A sein .
Der Stiel einer der Noten sollte 6
(wie im Allgemeinen bei Stielen) gerade sein, und der Stiel der anderen Note sollte bis zum Ende des Stiels der anderen Note verlängert sein.
Die Stiele sollten mit verbunden sein _
.
Beispiel verbundene Achtelnoten:
___________
| |
| |
| |
| | --(@)--
| | | |
------------------------ ---|_----|-----------|-- -----|------------------
|/ (@) | | |_
------------------------ ---------------------|-- -----|--------|_|-(@)---
(@) _|_|_ | | ||
-----|------_|_|_-(@)--- ---------------------|-- -----|-----------|------
| | | | | | |
-----|-----------|------ ---------------------|-- -----|-----------|------
| | | | |
-----|-----------|------ ------------------(@)--- -----|___________|------
| |
|___________|
Beispiel für Ein- und Ausgabe
Eingabe :
A#4/4 G#4/4 F#4/2 A#4/4 G#4/4 F#4/2 F#4/8 F#4/8 F#4/8 F#4/8 G#4/8 G#4/8 G#4/8 G#4/8 A#4/4 G#4/4 F#4/2
A#3/4 G#3/4 F#3/2 A#3/4 G#3/4 F#3/2 F#3/2 G#3/2 F#3/4 E#3/4 F#3/2
Ausgabe :
^
| | | | |
------|/-------------|-----------------------|--------------------------------------------------------------+---------|-----------------------|--------------------------------------------------------------+----------___________-------------___________------------|\----------|\----------|\----------|\-+---------|-----------------------|--------------------------------------------------------------+-++
/ | | | | | | | | | | | | | \ | \ | \ | \| | | | | ||
-----/|--------------|-----------------------|-----------------------|--------------------------------------+---------|-----------------------|-----------------------|--------------------------------------+---------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|--+---------|-----------------------|-----------------------|--------------------------------------+-++
/ | | | | | | | | | | | | | | | | | | | | | | ||
---/--__----_|_|_----|-----------------------|-----------------------|--------------------------------------+_|_|_----|-----------------------|-----------------------|--------------------------------------+---------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|--+_|_|_----|-----------------------|-----------------------|--------------------------------------+-++
| / \ _|_|_ (@) _|_|_ | | |_|_|_ (@) _|_|_ | | | | | | | _|_|_ | | | | |_|_|_ (@) _|_|_ | | | ||
---\-\|-|----|-|--------------------_|_|_-(@)---------------_|_|_----|--------------------------------------+-|-|--------------------_|_|_-(@)---------------_|_|_----|--------------------------------------+_|_|_----|-----------|-----------|-----------|--_|_|_-(@)---------(@)---------(@)---------(@)---+-|-|--------------------_|_|_-(@)---------------_|_|_----|--------------------------------------+-++
\ | / | | _|_|_ ( ) | | | _|_|_ ( ) |_|_|_ (@) (@) (@) (@) | | | | | _|_|_ ( ) | ||
------|------------------------------------------------------|-|--------------------------------------------+-------------------------------------------------|-|--------------------------------------------+-|-|--------------------------------------------------------------------------------------------+-------------------------------------------------|-|--------------------------------------------+-++
| | | | | ||
\_/ | | | | ||
| | | | ||
| | | | ||
| | | | ||
| | | | ||
_|_|_ |_|_|_ | | | ||
----___-----_|_|_-(@)---------------_|_|_-------------------------------------------------------------------+_|_|_-(@)---------------_|_|_-------------------------------------------------------------------+------------------------------------------------_|_|_-------------------------------------------+------------------------------------------------------------------------------------------------+-++
/ \ | | | | _|_|_ (@) _|_|_ | | | | _|_|_ (@) _|_|_ |_|_|_ _|_|_ ( ) |_|_|_ | ||
---\---|---------|-------------------|-|-|------------------_|_|_-( )---------------------------------------+-----|-------------------|-|-|------------------_|_|_-( )---------------------------------------+_|_|_-( )----------------------------------------|-|-|------------------------------------------+_|_|_ (@)---------------_|_|_-------------------------( )---------------------------------------+-++
| | | | | | | | | | | | | | | | | | | | | | _|_|_ (@) | | ||
-------/---------|-----------------------|-----------------------|------------------------------------------+-----|-----------------------|-----------------------|------------------------------------------+-----|-----------------------------------------------|------------------------------------------+-----|-------------------|-|-|-----------------------|------------------------------------------+-++
/ | | | | | | | | | | | | | | | ||
-----/-----------|-----------------------|-----------------------|------------------------------------------+-----|-----------------------|-----------------------|------------------------------------------+-----|-----------------------------------------------|------------------------------------------+-----|-----------------------|-----------------------|------------------------------------------+-++
| | | | | | | | | | | | | ||
-----------------------------------------------------------------|------------------------------------------+-----------------------------------------------------|------------------------------------------+-----|------------------------------------------------------------------------------------------+-----|-----------------------|-----------------------|------------------------------------------+-++
|
Zur Veranschaulichung sind im dritten Takt die F#
Achtelnoten miteinander verbunden, die G#
Achtelnoten jedoch nicht. Ihr Programm sollte entweder die Achtelnoten verbinden, wenn dies zutreffend ist (für den Bonus), oder sie alle getrennt lassen.
Andere Informationen
- Jede Menge von nachgestellten Leerzeichen / Zeilen ist akzeptabel.
- Es sollte kein zusätzliches Leerzeichen vor den Notenschlüsseln und kein Leerzeichen zwischen den Noten stehen. Vor / nach der Ausgabe können beliebig viele Leerzeilen ausgegeben werden.
- Der Bonus für das Verbinden von Achtelnoten beträgt 0,75 * Byte Quellcode .
- Das ist Code-Golf , also gewinnt der kürzeste Code.
Antworten:
Python - 8.85 ... KB (
93699066 B)Haha! Schnellste Waffe im ... Westen?
Dies ist weit davon entfernt, richtig Golf zu spielen, aber es funktioniert zumindest. Im Moment der Veröffentlichung ist es der kürzeste Eintrag, also ... yay?
Lassen Sie mich zunächst sagen, dass ich noch nie so viel Golf gespielt habe und nicht einmal weiß, wo ich anfangen soll.
Dieser Eintrag enthält noch nicht die Bonuspunkte, aber ich möchte das noch hinzufügen, bevor ich Golf spiele.
Ich habe im Grunde genommen eine Art ASCII-Rendering-Klasse geschrieben, die die Zeichen, aus denen jeder "Block" besteht, in einem 2D-Format speichert, sodass eine beliebige Anzahl verschiedener "Symbole" über das 2D-Raster gezeichnet werden kann. Bei Notenblöcken wurde zuerst der Stab gezeichnet, dann der Stab, der die Stäbe nach Bedarf ausdehnte, dann der Notenkopf, gefolgt von Stamm und Schwanz (falls zutreffend) und zuletzt der Zufall.
Bei folgenden zwei Eingängen für Höhen- und Tiefenschlüssel:
Die folgenden Ausgabeergebnisse:
Hier ist eine funktionierende Version des Codes mit etwas falschem Eingabecode, da diese spezielle Python-Web-IDE keine simulierten Eingaben oder separate Dateien zuließ.
grandstaff.py
Enthält sowohl Trebble- als auch Bassschlüsselstäbe sowie Griffe zum Zeichnen der Taktstriche zwischen den beiden.
staff.py
Ein einziger Stab. Enthält ein Array von "Block" -Objekten, die Noten, Taktstriche, Schlüssel usw. darstellen. Diese Klasse verwaltet den Abstand der Noten und das Einfügen der Taktstriche an den entsprechenden Stellen.
block.py
Diese Klasse behandelt das "Rendern" (oder möglicherweise die Komposition) des ASCII-Texts. Darin befinden sich die hartcodierten Symbole wie der Höhen- und Tiefenschlüssel, ein leerer Stab, Taktstriche, Vorzeichen und die erforderlichen Teile, um Noten mit unterschiedlicher Dauer zu erstellen. Diese werden nacheinander auf ein 2D-Raster von Zeichen- "Pixeln" "gezeichnet", um den endgültigen ASCII-Block zu erzeugen.
main.py
Diese Klasse "führt" das Programm einfach aus, indem sie eine Instanz von GrandStaff erstellt, die angegebenen Zeichenfolgeneingaben übergibt und den Zeichenfolgenwert ausgibt.
quelle