Catatan : Anders Kaseorg memperingatkan saya bahwa ini bisa menjadi duplikat dari pertanyaan sebelumnya . Sepertinya begitu, dan saya minta maaf saya tidak menemukan pertanyaan itu sebelum memposting yang ini. Meskipun demikian, pertanyaan itu hanya menerima satu jawaban dan yang ini lebih sederhana, kalau-kalau Anda semua ingin mencoba kali ini. Saya akan mengerti jika pertanyaan ini akhirnya ditandai sebagai duplikat.
Tantangan
Diberikan input seperti ini:
8g 8Df 4cs 2C 1A
Tulis program / fungsi terpendek yang menghasilkan keluaran seperti ini:
/\ -o-
| |
---|-|---------------------------------------------------|-|
|/ | |
---/|--------|\----b-*-----------------------------------|-|
/ | | | | o | |
-|--|--------|------|-----------------|------------------|-|
| (| \ | | | | | |
-|--|--)----*-------|/---------|------|------------------|-|
\ | / | | | |
-----|-------------------------|-------------------------|-|
| |
*_/ #-*-
Aturan
Keluaran harus terdiri dari staf lima baris yang diawali dengan gambar G-clef persis seperti yang ditunjukkan di atas, disejajarkan ke kiri staf dan meninggalkan satu kolom setelah dimulainya staf.
/\
| |
---|-|--
|/
---/|---
/ |
-|--|---
| (| \
-|--|--)
\ | /
-----|--
|
*_/
^
Single column
Catatan harus dimulai dengan a *
atau o
karakter tergantung pada jenisnya.
Harus ada tepat delapan kolom pemisahan setiap *
atau o
karakter:
/\ -o-
| |
---|-|---------------------------------------------------|-|
|/ | |
---/|--------|\----b-*-----------------------------------|-|
/ | | | | o | |
-|--|--------|------|-----------------|------------------|-|
| (| \ | | | | | |
-|--|--)----*-------|/---------|------|------------------|-|
\ | / | | | |
-----|-------------------------|-------------------------|-|
| |
*_/ #-*-
↑ ↑ ↑ ↑ ↑ ↑ ↑
8 columns of separation
Staf harus diakhiri dengan terminator yang diluruskan ke kanan seperti yang ditunjukkan dalam contoh. Bilah kiri terminator harus dipisahkan 8 kolom dari not terakhir.
Input akan berupa string tunggal yang berisi catatan (setidaknya satu, tidak ada input kosong), masing-masing dipisahkan oleh spasi (Anda dapat menganggap setiap catatan akan menjadi yang tepat, jadi tidak perlu memeriksa kesalahan). Anda juga dapat mengambil input sebagai array string, dengan catatan per elemen dalam array. Untuk setiap not, karakter pertama akan menjadi penyebut panjang note ( 1
untuk keseluruhan note / semibreve , dimulai dengan o
; 2
untuk half note / minim , dimulai dengan o
; 4
untuk quarter note / crotchet , dimulai dengan *
; dan 8
untuk yang kedelapan note / quaver , dimulai dengan*
). Karakter kedua akan menjadi catatan (lihat tabel berikut), dan yang ketiga, karakter opsional akan menjadi f
atau F
untuk nada datar dan s
atau S
untuk nada tajam.
--- A (ledger line)
G
-------- F
E
-------- D
C
-------- b
a
-------- g
f
-------- e
d
--- c (ledger line)
Jelas, input harus menghormati kasing untuk catatan, tetapi Anda dapat memilih kasing f
dan s
pengubah.
Catatan c
dan A
harus menambahkan dua -
(garis besar buku), satu di setiap sisi, karena mereka harus memperpanjang staf. Catatan d
dan di G
luar staf tetapi tidak perlu garis besar.
Ratakan atau runcing catatan harus menambah b
atau #
dua posisi di sebelah kiri catatan.
Batang (jika ada) harus digambar dengan 4 batang vertikal. Catatan dari b
dan di atas harus menarik batang ke bawah dan di sisi kiri catatan. Catatan dari a
dan di bawah harus menarik batang ke atas dan di sisi kanan catatan. Quavers harus menambahkan bendera, selalu ke kanan dan persis seperti yang ditunjukkan, dan tidak perlu berseri-seri jika ada beberapa dari mereka secara berurutan.
--------------------------
-----|\----b-*------------
| | |
-----|------|-------------
| | |
----*-------|/---------|--
↑↑ |
----||------↑↑---------|--
|| || |
|| || #-*-
|\ |\ ↑↑
| Stem | Note | Stem
Note Stem Note
Seperti biasa, program / fungsi Anda dapat langsung menggambar output atau mengembalikan string, array string, matriks karakter atau format lain yang masuk akal.
Tautan yang bermanfaat
Ini adalah kode-golf , jadi semoga program / fungsi terpendek untuk setiap bahasa menang!
Bonus: cobalah menulis contoh dengan melodi terkenal dan biarkan semua orang mencoba menebak melodi yang mana itu!