Nota : Anders Kaseorg mi avverte che questo potrebbe essere un duplicato di un'altra domanda precedente . Sembra di sì, e mi dispiace di non aver trovato quella domanda prima di pubblicarla. Tuttavia, quella domanda ha ricevuto solo una risposta e questa è più semplice, nel caso in cui tutti voi vogliate provare questa volta. Capirò se questa domanda finirà per essere contrassegnata come duplicata, però.
La sfida
Dato un input come questo:
8g 8Df 4cs 2C 1A
Scrivi il programma / funzione più breve che produce un output come questo:
/\ -o-
| |
---|-|---------------------------------------------------|-|
|/ | |
---/|--------|\----b-*-----------------------------------|-|
/ | | | | o | |
-|--|--------|------|-----------------|------------------|-|
| (| \ | | | | | |
-|--|--)----*-------|/---------|------|------------------|-|
\ | / | | | |
-----|-------------------------|-------------------------|-|
| |
*_/ #-*-
Regole
L'output deve essere composto da un rigo a cinque righe che inizia con il disegno di una G-clef esattamente come mostrato sopra, allineato a sinistra del rigo e che lascia una singola colonna dopo l'avvio del rigo.
/\
| |
---|-|--
|/
---/|---
/ |
-|--|---
| (| \
-|--|--)
\ | /
-----|--
|
*_/
^
Single column
Le note devono iniziare con un *
o un o
carattere a seconda del tipo.
Ci devono essere esattamente otto colonne di separazione ogni *
o un o
personaggio:
/\ -o-
| |
---|-|---------------------------------------------------|-|
|/ | |
---/|--------|\----b-*-----------------------------------|-|
/ | | | | o | |
-|--|--------|------|-----------------|------------------|-|
| (| \ | | | | | |
-|--|--)----*-------|/---------|------|------------------|-|
\ | / | | | |
-----|-------------------------|-------------------------|-|
| |
*_/ #-*-
↑ ↑ ↑ ↑ ↑ ↑ ↑
8 columns of separation
Il personale deve terminare con la terminazione allineata a destra, come mostrato nell'esempio. La barra di sinistra del terminatore deve essere separata da 8 colonne dall'ultima nota.
L'input sarà una singola stringa contenente le note (almeno una, nessun input vuoto), ognuna separata da uno spazio bianco (puoi considerare che ogni nota sarà una corretta, quindi non c'è bisogno di verificare la presenza di errori). Puoi anche prendere l'input come un array di stringhe, con una nota per elemento nell'array. Per ogni nota, il primo carattere sarà il denominatore della lunghezza della nota ( 1
per un'intera nota / semibreve , inizia con o
; 2
per una mezza nota / minimo , inizia con o
; 4
per una nota / un quarto , inizia con *
; e 8
per un ottavo note / quaver , inizia con*
). Il secondo carattere sarà la nota (vedere la tabella successiva) e il terzo carattere facoltativo sarà f
o F
per le note piatte e s
o S
per le note acute.
--- A (ledger line)
G
-------- F
E
-------- D
C
-------- b
a
-------- g
f
-------- e
d
--- c (ledger line)
Ovviamente, l'input deve rispettare il caso delle note, ma è possibile scegliere il caso dei modificatori f
e s
.
Note c
e A
devono aggiungere due -
(righe di libro mastro), una per lato, in quanto devono estendere il personale. Note d
e G
sono fuori dallo staff ma non hanno bisogno di righe di contabilità generale.
Le note appiattite o affilate devono aggiungere b
o #
due posizioni a sinistra della nota.
Gli steli (se presenti) devono essere disegnati con 4 barre verticali. Le note da b
e sopra devono disegnare il gambo verso il basso e sul lato sinistro della nota. Le note da a
e sotto devono disegnare il gambo verso l'alto e sul lato destro della nota. I quavers devono aggiungere la bandiera, sempre a destra ed esattamente come mostrato, e non devono essere irradiati se ce ne sono diversi di fila.
--------------------------
-----|\----b-*------------
| | |
-----|------|-------------
| | |
----*-------|/---------|--
↑↑ |
----||------↑↑---------|--
|| || |
|| || #-*-
|\ |\ ↑↑
| Stem | Note | Stem
Note Stem Note
Come al solito, il tuo programma / funzione può disegnare direttamente l'output o restituire una stringa, una matrice di stringhe, una matrice di caratteri o qualsiasi altro formato ragionevole.
Link utili
Questo è code-golf , quindi può vincere il programma / funzione più breve per ogni lingua!
Bonus: prova a scrivere esempi con melodie famose e lascia che tutti provino a indovinare quale melodia sia!