Menggali di kedalaman folder temp Anda, Anda menemukan beberapa komposisi untuk piano. Sayangnya, komposisi ini ditulis dengan nama catatan dan durasi saja, dan Anda hanya memiliki akses ke terminal teks. Karena itu, tugas Anda adalah menulis program untuk menampilkan komposisi sebagai seni ASCII.
Memasukkan
Program Anda harus menerima dua string sebagai input. String pertama akan mewakili not-not staf top (dengan treble clef), sedangkan string kedua akan mewakili not-not staf bottom.
Catatan akan disahkan dalam notasi pitch ilmiah . Catatan staf puncak akan selalu ada di antara C4
dan C6
inklusif. Catatan staf bawah akan selalu berada di antara C2
dan C4
inklusif.
Setiap catatan akan datang dengan durasi, yang akan menjadi salah satu dari: 1
, 2
, 4
, 8
. Ini mewakili seluruh not (semibreve), setengah not (minimal), not seperempat (not seperempat), dan not kedelapan (quaver) masing-masing.
Catatan durasi lainnya tidak akan pernah muncul di input.
Bagaimana catatan dan durasi dipisahkan, dan bagaimana setiap catatan dipisahkan dari catatan lain dalam input tergantung pada kebijaksanaan Anda. Berikut ini adalah contoh input untuk staf puncak:
E4/4 A4/8 C#5/8 E5/2
Di sini, not dipisahkan oleh spasi, dan durasinya dipisahkan dari note dengan garis miring ke depan. Pembatas ini tidak diperbaiki, dan Anda dapat memilih untuk mengubahnya atau menghilangkannya sama sekali.
Anda dapat mengasumsikan setidaknya ada satu catatan di setiap staf. Tidak ada sandaran dalam input.
Keluaran
Program Anda adalah untuk mencetak skor sebagai seni ASCII, sesuai dengan deskripsi berikut.
Clefs harus menjadi hal pertama di sebelah kiri output Anda (jarak antara dua paranada tidak boleh diubah):
^
| |
------|/----
/
-----/|-----
/ |
---/--__----
| / \
---\-\|-|---
\ | /
------|-----
|
\_/
----___-----
/ \ |
---\---|----
| |
-------/----
/
-----/------
------------
Batang catatan (garis vertikal di sebelah lingkaran) harus mengarah ke atas jika catatan berada di bawah garis tengah staf. Itu harus menunjuk ke bawah jika catatan itu di atas garis tengah staf. Jika nada ada di garis tengah, maka batang dapat menunjuk ke kedua arah. (Satu-satunya pengecualian untuk ini adalah untuk bonus, dan terjadi saat menghubungkan catatan kedelapan, dijelaskan nanti). Batang harus dimulai pada garis di atas / di bawah lingkaran, dan harus 6
garis tinggi.
Semua jenis catatan kecuali seluruh catatan memiliki batang. Bendera nada kedelapan diwakili oleh dua garis miring ke depan pada garis yang berbeda (lihat catatan di bawah).
Catatan yang diisi (untuk not seperempat dan kedelapan) diwakili oleh (@)
. Head note kosong (untuk setengah dan seluruh note) diwakili oleh ( )
.
Accidentals (benda tajam, flat, naturals) harus ditempatkan seperti yang ditunjukkan dalam contoh catatan, dengan tepat satu karakter antara sisi kanan dari kecelakaan dan sisi kiri kepala catatan.
Garis besar harus digunakan bila perlu, dan harus 7
panjang karakter, berpusat di sekitar kepala catatan.
Setiap nada harus 12
lebar karakter.
Catatan contoh:
|_
|_| ( )
| |------
|
------------ ---------|-- ------------ ------------ ------------
|
------------ ---------|-- ---|-------- ------------ ------------
(@) _|_|_ | |_
-----|------ _|_|_-( )--- ---|/-(@)--- ------------ ---------|\-
| | | | | \
-----|------ ------------ -----|------ ------------ ---------|--
| | |
-----|------ ------------ -----|------ ------------ ---------|--
| | / |
|/ --(@)--
quarter note half note eighth note whole note eighth note
sharped flatted natural
Setelah catatan 12 karakter, biarkan 2 * 12 - 12 = 12
karakter kosong (baik atau
-
tergantung pada baris) jika catatan tersebut adalah not seperempat. Jika catatan adalah setengah catatan, biarkan 4 * 12 - 12 = 36
karakter kosong. Jika catatan adalah seluruh catatan, biarkan 8 * 12 - 12 = 84
karakter kosong. Jangan menambahkan karakter tambahan untuk catatan kedelapan.
Di akhir setiap pengukuran (96 karakter setelah baris clef atau bar), outputkan baris bar. Ini dilakukan dengan menurunkan setiap karakter antara garis paling atas dan paling bawah (inklusif), dan mengganti dengan
|
dan -
dengan +
. (Lihat contoh output di bagian bawah pertanyaan).
Pada akhir karya, hasilkan musik berakhir dengan mengeluarkan 3 baris bar berturut-turut, tetapi dengan spasi antara yang pertama dan yang kedua. Itu adalah:
+-++
| ||
+-++
| ||
. ..
. ..
Perhatikan bahwa benda tajam, flat, dan alami bertahan hingga akhir pengukuran. Tanda alami seharusnya hanya digunakan untuk membatalkan tajam atau flat yang digunakan sebelumnya dalam ukuran yang sama.
Untuk keperluan tugas ini, benda tajam, flat, dan natural hanya memengaruhi nada dalam satu oktaf, dan dalam satu kunci (tajam pada A5 tidak menyebabkan A4 menjadi tajam, dan flat pada C4 di staf atas tidak menyebabkan C4 di staf bawah yang akan diratakan).
Informasi hanya untuk bonus
Bonusnya melibatkan menghubungkan dengan benar not ke delapan.
Ketika ada dua nada kedelapan berturut-turut, disejajarkan dengan beat not seperempat (dengan kata lain, jumlah karakter sebelum not kedelapan pertama adalah kelipatan dari 24), kedua not kedelapan harus dihubungkan.
Biarkan catatan A menjadi catatan terjauh dari tengah staf. Jika kedua catatan adalah jarak yang sama dari tengah, baik catatan mungkin catatan A . Biarkan lainnya catatan be catatan B .
Arah kedua batang harus menjadi arah batang catatan A .
Batang salah satu not harus 6
garis tinggi (seperti halnya batang pada umumnya), dan batang not lainnya harus diperluas ke ujung batang not lainnya.
Batang harus dihubungkan dengan _
.
Contoh catatan kedelapan terhubung:
___________
| |
| |
| |
| | --(@)--
| | | |
------------------------ ---|_----|-----------|-- -----|------------------
|/ (@) | | |_
------------------------ ---------------------|-- -----|--------|_|-(@)---
(@) _|_|_ | | ||
-----|------_|_|_-(@)--- ---------------------|-- -----|-----------|------
| | | | | | |
-----|-----------|------ ---------------------|-- -----|-----------|------
| | | | |
-----|-----------|------ ------------------(@)--- -----|___________|------
| |
|___________|
Contoh input dan output
Masukan :
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
Keluaran :
^
| | | | |
------|/-------------|-----------------------|--------------------------------------------------------------+---------|-----------------------|--------------------------------------------------------------+----------___________-------------___________------------|\----------|\----------|\----------|\-+---------|-----------------------|--------------------------------------------------------------+-++
/ | | | | | | | | | | | | | \ | \ | \ | \| | | | | ||
-----/|--------------|-----------------------|-----------------------|--------------------------------------+---------|-----------------------|-----------------------|--------------------------------------+---------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|--+---------|-----------------------|-----------------------|--------------------------------------+-++
/ | | | | | | | | | | | | | | | | | | | | | | ||
---/--__----_|_|_----|-----------------------|-----------------------|--------------------------------------+_|_|_----|-----------------------|-----------------------|--------------------------------------+---------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|--+_|_|_----|-----------------------|-----------------------|--------------------------------------+-++
| / \ _|_|_ (@) _|_|_ | | |_|_|_ (@) _|_|_ | | | | | | | _|_|_ | | | | |_|_|_ (@) _|_|_ | | | ||
---\-\|-|----|-|--------------------_|_|_-(@)---------------_|_|_----|--------------------------------------+-|-|--------------------_|_|_-(@)---------------_|_|_----|--------------------------------------+_|_|_----|-----------|-----------|-----------|--_|_|_-(@)---------(@)---------(@)---------(@)---+-|-|--------------------_|_|_-(@)---------------_|_|_----|--------------------------------------+-++
\ | / | | _|_|_ ( ) | | | _|_|_ ( ) |_|_|_ (@) (@) (@) (@) | | | | | _|_|_ ( ) | ||
------|------------------------------------------------------|-|--------------------------------------------+-------------------------------------------------|-|--------------------------------------------+-|-|--------------------------------------------------------------------------------------------+-------------------------------------------------|-|--------------------------------------------+-++
| | | | | ||
\_/ | | | | ||
| | | | ||
| | | | ||
| | | | ||
| | | | ||
_|_|_ |_|_|_ | | | ||
----___-----_|_|_-(@)---------------_|_|_-------------------------------------------------------------------+_|_|_-(@)---------------_|_|_-------------------------------------------------------------------+------------------------------------------------_|_|_-------------------------------------------+------------------------------------------------------------------------------------------------+-++
/ \ | | | | _|_|_ (@) _|_|_ | | | | _|_|_ (@) _|_|_ |_|_|_ _|_|_ ( ) |_|_|_ | ||
---\---|---------|-------------------|-|-|------------------_|_|_-( )---------------------------------------+-----|-------------------|-|-|------------------_|_|_-( )---------------------------------------+_|_|_-( )----------------------------------------|-|-|------------------------------------------+_|_|_ (@)---------------_|_|_-------------------------( )---------------------------------------+-++
| | | | | | | | | | | | | | | | | | | | | | _|_|_ (@) | | ||
-------/---------|-----------------------|-----------------------|------------------------------------------+-----|-----------------------|-----------------------|------------------------------------------+-----|-----------------------------------------------|------------------------------------------+-----|-------------------|-|-|-----------------------|------------------------------------------+-++
/ | | | | | | | | | | | | | | | ||
-----/-----------|-----------------------|-----------------------|------------------------------------------+-----|-----------------------|-----------------------|------------------------------------------+-----|-----------------------------------------------|------------------------------------------+-----|-----------------------|-----------------------|------------------------------------------+-++
| | | | | | | | | | | | | ||
-----------------------------------------------------------------|------------------------------------------+-----------------------------------------------------|------------------------------------------+-----|------------------------------------------------------------------------------------------+-----|-----------------------|-----------------------|------------------------------------------+-++
|
Demi demonstrasi, pada langkah ketiga, F#
nada ke delapan terhubung, sedangkan G#
nada ke delapan tidak. Program Anda harus menghubungkan catatan kedelapan kapan pun berlaku (untuk bonus), atau membiarkan semuanya terputus.
Informasi lainnya
- Berapapun spasi / garis spasi tambahan dapat diterima.
- Seharusnya tidak ada spasi putih tambahan sebelum clefs, atau spasi putih antara catatan. Sejumlah baris kosong dapat dipancarkan sebelum / setelah output.
- Bonus untuk menghubungkan catatan kedelapan adalah 0,75 * jumlah byte kode sumber .
- Ini kode-golf , jadi kode terpendek menang.
Jawaban:
Python - 8.85 ... KB (
93699066 B)Ha ha! Pistol tercepat di ... Barat?
Ini JAUH dari golf yang benar, tetapi setidaknya berfungsi. Pada saat memposting ini, ini adalah entri terpendek, jadi ... yay?
Mari saya mulai dengan mengatakan bahwa saya belum pernah bermain golf sebesar ini, dan saya bahkan tidak tahu harus mulai dari mana.
Entri ini belum mengandung poin bonus, tapi saya masih ingin menambahkannya sebelum bermain golf.
Saya pada dasarnya menulis semacam kelas rendering ASCII yang menyimpan karakter yang membentuk setiap "blok" dalam format 2D sehingga sejumlah "simbol" yang berbeda dapat digambar di atas kisi 2D. Untuk blok catatan, staf digambar terlebih dahulu, lalu staf mana pun yang memperpanjang jeruji seperlunya, lalu kepala not, diikuti oleh batang dan ekor (jika ada) dan terakhir kecelakaan.
Saat diberi dua input berikut untuk trebble dan bass clefs:
Hasil keluaran berikut:
Berikut adalah versi kode yang berfungsi dengan beberapa kode input palsu karena IDE web python khusus ini tidak mengizinkan input yang disimulasikan atau file yang terpisah.
grandstaff.py
Berisi staf trebble dan bass clef, dan menangani gambar garis batas di antara keduanya.
staff.py
Satu staf. Berisi larik objek "Blokir" yang mewakili catatan, barlines, clefs, dll. Kelas ini menangani spasi dari note dan penyisipan barlines di tempat yang tepat.
block.py
Kelas ini menangani "rendering" (atau mungkin komposisi) teks ASCII. Di dalamnya ada simbol hard-coded seperti trebble dan bass clefs, staf kosong, barlines, kecelakaan, dan potongan-potongan yang diperlukan untuk membuat catatan durasi yang berbeda. Ini "ditarik" ke kotak 2D karakter "piksel" secara berurutan untuk menghasilkan blok ASCII terakhir.
main.py
Kelas ini hanya "menjalankan" program dengan membuat turunan dari GrandStaff, memberikannya input string yang diberikan, dan mencetak nilai stringnya.
sumber