Scavando nelle profondità della tua cartella temporanea, trovi alcune composizioni per il piano. Sfortunatamente, queste composizioni sono state scritte solo con nomi di note e durate, e hai solo accesso a un terminale di testo. Pertanto, il tuo compito è quello di scrivere un programma per visualizzare le composizioni come arte ASCII.
Ingresso
Il tuo programma dovrebbe accettare due stringhe come input. La prima stringa rappresenterà le note del rigo superiore (con la chiave di violino), mentre la seconda stringa rappresenterà le note del rigo inferiore.
Le note saranno passate in notazione scientifica . Le note dello staff principale saranno sempre comprese C4
e C6
comprese. Le note dello staff in basso saranno sempre comprese C2
e C4
comprese.
Ogni nota sarà disponibile con una durata, che sarà uno dei: 1
, 2
, 4
, 8
. Questi rappresentano rispettivamente una nota intera (semibreve), una mezza nota (minima), una nota da un quarto (a uncinetto) e un'ottava (tremante).
Note di qualsiasi altra durata non appariranno mai nell'input.
Come la nota e la durata sono separate e come ciascuna nota è separata dalle altre note nell'input è a tua discrezione. Di seguito è riportato un esempio di input per il personale superiore:
E4/4 A4/8 C#5/8 E5/2
Qui, le note sono separate da uno spazio e la durata è separata dalla nota con una barra. Questi delimitatori non sono fissi e puoi scegliere di modificarli o ometterli del tutto.
Puoi presumere che ci sia almeno una nota in ciascun rigo. Non ci sono pause nell'input.
Produzione
Il tuo programma consiste nell'emettere lo spartito come arte ASCII, conforme alle seguenti descrizioni.
Le chiavi dovrebbero essere la prima cosa a sinistra dell'output (la distanza tra i due righi non deve essere modificata):
^
| |
------|/----
/
-----/|-----
/ |
---/--__----
| / \
---\-\|-|---
\ | /
------|-----
|
\_/
----___-----
/ \ |
---\---|----
| |
-------/----
/
-----/------
------------
Lo stelo di una nota (la linea verticale accanto al cerchio) dovrebbe essere rivolto verso l'alto se la nota si trova al di sotto della linea centrale di un rigo. Dovrebbe essere rivolto verso il basso se la nota si trova sopra la linea mediana di uno staff. Se la nota si trova sulla linea di mezzo, lo stelo può puntare in entrambe le direzioni. (L'unica eccezione a questo è per il bonus, e si verifica quando si collegano ottave note, descritte più avanti). Lo stelo dovrebbe iniziare sulla linea sopra / sotto il cerchio ed essere 6
alto.
Tutti i tipi di note tranne le note intere hanno gambi. La bandiera di un'ottava nota è rappresentata da due barre in avanti su linee diverse (vedi note di esempio di seguito).
Una testa di nota riempita (per le note da un quarto e un ottavo) è rappresentata da (@)
. Una testa di nota vuota (per metà e note intere) è rappresentata da ( )
.
Gli incidenti (oggetti taglienti, piatti, naturali) devono essere posizionati come mostrato nelle note di esempio, con esattamente un carattere tra il lato destro dell'incidente e il lato sinistro della testa della nota.
Le righe di registro devono essere utilizzate quando necessario e devono essere 7
lunghe in lunghezza, centrate attorno alla testa della nota.
Ogni nota dovrebbe essere 12
ampia di caratteri.
Note di esempio:
|_
|_| ( )
| |------
|
------------ ---------|-- ------------ ------------ ------------
|
------------ ---------|-- ---|-------- ------------ ------------
(@) _|_|_ | |_
-----|------ _|_|_-( )--- ---|/-(@)--- ------------ ---------|\-
| | | | | \
-----|------ ------------ -----|------ ------------ ---------|--
| | |
-----|------ ------------ -----|------ ------------ ---------|--
| | / |
|/ --(@)--
quarter note half note eighth note whole note eighth note
sharped flatted natural
Dopo la nota di 12 caratteri, lascia i 2 * 12 - 12 = 12
caratteri vuoti (a seconda della riga o a
-
seconda) se la nota è una nota da un quarto. Se la nota è una mezza nota, lascia i 4 * 12 - 12 = 36
caratteri vuoti. Se la nota è una nota intera, lascia i 8 * 12 - 12 = 84
caratteri vuoti. Non aggiungere caratteri extra per le note ottave.
Alla fine di ogni misura (96 caratteri dopo la chiave o la linea della barra), genera una linea della barra. Questo viene fatto scendendo ogni carattere tra le righe più in alto e più in basso (incluso) e sostituendo con
|
e -
con +
. (Vedi l'output di esempio in fondo alla domanda).
Alla fine del pezzo, emetti la fine della musica emettendo 3 linee di battuta di fila, ma con uno spazio tra la prima e la seconda. Questo è:
+-++
| ||
+-++
| ||
. ..
. ..
Nota che oggetti taglienti, piatti e naturali durano fino alla fine della misura. Il segno naturale dovrebbe essere usato solo per cancellare uno sharp o un flat usato prima nella stessa misura.
Ai fini di questa attività, oggetti taglienti, piatti e naturali influiscono solo su una nota in un'ottava e in una chiave (un segno acuto su A5 non provoca l'accuratezza di A4 e un appartamento su C4 nella parte superiore del rigo non provoca C4 nel rigo inferiore da appiattire).
Informazioni solo per il bonus
Il bonus consiste nel collegare correttamente ottavi note.
Quando ci sono due ottavi consecutivi, allineati alla battuta delle note da un quarto (in altre parole, il numero di caratteri prima della prima ottava nota è un multiplo di 24), le due ottave note devono essere collegate.
Lascia che la nota A sia la nota più lontana dal centro del rigo. Se entrambe le note sono alla stessa distanza dal centro, sia nota può essere nota A . Lasciate che l'altra nota be nota B .
La direzione di entrambi steli dovrebbe essere la direzione dello stelo della nota A .
Lo stelo di una delle note dovrebbe essere 6
alto (come nel caso degli steli in generale) e il gambo dell'altra nota dovrebbe essere esteso fino alla fine del gambo dell'altra nota.
Gli steli devono essere collegati _
.
Esempio di ottavi note collegate:
___________
| |
| |
| |
| | --(@)--
| | | |
------------------------ ---|_----|-----------|-- -----|------------------
|/ (@) | | |_
------------------------ ---------------------|-- -----|--------|_|-(@)---
(@) _|_|_ | | ||
-----|------_|_|_-(@)--- ---------------------|-- -----|-----------|------
| | | | | | |
-----|-----------|------ ---------------------|-- -----|-----------|------
| | | | |
-----|-----------|------ ------------------(@)--- -----|___________|------
| |
|___________|
Esempio di input e output
Input :
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
Uscita :
^
| | | | |
------|/-------------|-----------------------|--------------------------------------------------------------+---------|-----------------------|--------------------------------------------------------------+----------___________-------------___________------------|\----------|\----------|\----------|\-+---------|-----------------------|--------------------------------------------------------------+-++
/ | | | | | | | | | | | | | \ | \ | \ | \| | | | | ||
-----/|--------------|-----------------------|-----------------------|--------------------------------------+---------|-----------------------|-----------------------|--------------------------------------+---------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|--+---------|-----------------------|-----------------------|--------------------------------------+-++
/ | | | | | | | | | | | | | | | | | | | | | | ||
---/--__----_|_|_----|-----------------------|-----------------------|--------------------------------------+_|_|_----|-----------------------|-----------------------|--------------------------------------+---------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|--+_|_|_----|-----------------------|-----------------------|--------------------------------------+-++
| / \ _|_|_ (@) _|_|_ | | |_|_|_ (@) _|_|_ | | | | | | | _|_|_ | | | | |_|_|_ (@) _|_|_ | | | ||
---\-\|-|----|-|--------------------_|_|_-(@)---------------_|_|_----|--------------------------------------+-|-|--------------------_|_|_-(@)---------------_|_|_----|--------------------------------------+_|_|_----|-----------|-----------|-----------|--_|_|_-(@)---------(@)---------(@)---------(@)---+-|-|--------------------_|_|_-(@)---------------_|_|_----|--------------------------------------+-++
\ | / | | _|_|_ ( ) | | | _|_|_ ( ) |_|_|_ (@) (@) (@) (@) | | | | | _|_|_ ( ) | ||
------|------------------------------------------------------|-|--------------------------------------------+-------------------------------------------------|-|--------------------------------------------+-|-|--------------------------------------------------------------------------------------------+-------------------------------------------------|-|--------------------------------------------+-++
| | | | | ||
\_/ | | | | ||
| | | | ||
| | | | ||
| | | | ||
| | | | ||
_|_|_ |_|_|_ | | | ||
----___-----_|_|_-(@)---------------_|_|_-------------------------------------------------------------------+_|_|_-(@)---------------_|_|_-------------------------------------------------------------------+------------------------------------------------_|_|_-------------------------------------------+------------------------------------------------------------------------------------------------+-++
/ \ | | | | _|_|_ (@) _|_|_ | | | | _|_|_ (@) _|_|_ |_|_|_ _|_|_ ( ) |_|_|_ | ||
---\---|---------|-------------------|-|-|------------------_|_|_-( )---------------------------------------+-----|-------------------|-|-|------------------_|_|_-( )---------------------------------------+_|_|_-( )----------------------------------------|-|-|------------------------------------------+_|_|_ (@)---------------_|_|_-------------------------( )---------------------------------------+-++
| | | | | | | | | | | | | | | | | | | | | | _|_|_ (@) | | ||
-------/---------|-----------------------|-----------------------|------------------------------------------+-----|-----------------------|-----------------------|------------------------------------------+-----|-----------------------------------------------|------------------------------------------+-----|-------------------|-|-|-----------------------|------------------------------------------+-++
/ | | | | | | | | | | | | | | | ||
-----/-----------|-----------------------|-----------------------|------------------------------------------+-----|-----------------------|-----------------------|------------------------------------------+-----|-----------------------------------------------|------------------------------------------+-----|-----------------------|-----------------------|------------------------------------------+-++
| | | | | | | | | | | | | ||
-----------------------------------------------------------------|------------------------------------------+-----------------------------------------------------|------------------------------------------+-----|------------------------------------------------------------------------------------------+-----|-----------------------|-----------------------|------------------------------------------+-++
|
Per motivi di dimostrazione, nella terza misura, l' F#
ottava nota è connessa, mentre l' G#
ottava non lo è. Il tuo programma dovrebbe connettere le note ottave ove applicabile (per il bonus) o lasciarle tutte disconnesse.
Altre informazioni
- È accettabile qualsiasi quantità di spazi / linee finali finali.
- Non ci dovrebbero essere spazi bianchi extra prima delle chiavi, né spazi bianchi tra le note. Qualsiasi numero di righe vuote può essere emesso prima / dopo l'uscita.
- Il bonus per la connessione di ottave note è 0,75 * numero di byte del codice sorgente .
- Questo è code-golf , quindi vince il codice più corto.