Diberi skor musik ascii, Anda harus dapat menampilkan not dan panjang korespondensinya. Skor akan berisi antara 5 dan 15 catatan inklusif, dan ditranskripsikan pada stave. Paranada terdiri dari lima garis horizontal yang terdiri dari - (minus) karakter yang dipisahkan oleh garis spasi. Intinya di paranada setara dengan catatan 'E'. Garis spasi tepat di atas garis bawah menunjukkan 'F', dan dari nada yang lebih tinggi bahwa 'E' di bawahnya. Ini berlanjut seperti di bawah ini. Perhatikan bahwa catatan hanya naik ke 'G' sebelum mulai lagi di 'A'. Lihat di bawah:
F ----------
E
D ----------
C
B ----------
A
G ----------
F
E ----------
Perhatikan bahwa huruf-huruf tersebut tidak termasuk dalam input. Catatan dilapiskan di atas paranada menggunakan karakter ao (huruf kecil) untuk menunjukkan 'kepala catatan'. Head note ini menunjukkan frekuensi not, dan karenanya representasi alfabetis seperti di atas. Misalnya, catatan yang ditempatkan pada skor seperti di bawah ini menunjukkan 'A':
----
----
----
o
----
----
Sebuah nada, seperti 'A' di atas, disebut 'seluruh nada' dan akan dimainkan untuk satu ketukan utuh. Durasi lain dapat diindikasikan dengan memasukkan 'batang' naik dari nada, dan antara nol dan tiga 'bendera'. Batang terdiri dari tiga | (pipa, atau batang vertikal) karakter ditumpuk tepat di atas kepala catatan. Batang tanpa bendera dianggap sebagai 'not seperempat', dan bermain untuk seperempat ketukan. Bendera adalah \ (garis miring terbalik) karakter, dan tangan di sisi kanan batang. Setiap batang membagi dua waktu not dimainkan. Panjang setiap not akan menjadi salah satu dari yang berikut: seluruh not, not seperempat, not kedelapan, not keenam belas atau not ketiga puluh detik. Beginilah setiap jenis not akan mencari A:
--------------------
----|---|\--|\--|\--
| | |\ |\
----|---|---|---|\--
o o o o o
--------------------
--------------------
Menyatukan lebih dari satu not memberi Anda skor. Setiap catatan dapat dianggap sebagai lebar empat karakter, dengan catatan berada di kolom pertama dari setiap blok empat karakter. Sebagai contoh :
|\
----|\--|\----------
|\ | |\
----o---|---o---|\--
| o |
|---------------o---
|
o-------------------
--------------------
Contoh di atas berisi catatan berikut, secara berurutan: not seperempat 'G', not ketiga puluh detik 'D', not kedelapan 'C', seluruh not 'D' dan not keenam belas 'B'. Setiap catatan dalam output Anda harus dalam format huruf / panjang, di mana huruf adalah AG dan panjang adalah fraksi dari panjang catatan jika dibandingkan dengan seluruh catatan. Sebagai pengecualian, panjang dan / karakter tidak boleh dicetak jika catatan adalah keseluruhan catatan. Setiap catatan dalam output Anda harus dipisahkan oleh satu ruang. Karenanya, untuk skor di atas, kode Anda harus menampilkan yang berikut:
G/4 D/32 C/8 D B/16
- Catatan akan berada dalam kisaran berikut: EFGABCDE F. Perhatikan bahwa hanya huruf yang perlu dicetak, oktaf diabaikan.
- Perhatikan bahwa jumlah baris input bervariasi dari 9 hingga 12, karena catatan dengan waktu seperempat atau kurang pada saluran D atau lebih tinggi akan membutuhkan lebih banyak baris untuk ditampilkan sepenuhnya.
- Tidak ada setengah catatan dalam kasus ini.
Kode terpendek menang (spasi putih tidak masuk hitungan).
Sunting: Memperbaiki kesalahan spasi dalam satu input.
Beberapa input sampel:
|\
----|\--|-------------------
|\ | |
|---|---o---------------o---
| o |\
o---------------|\--|\------
|\ |\ |\
------------|\--|\--o-------
|\ o
------------o---------------
Output: B / 8 C / 8 D / 8 E / 32 F / 32 G / 32 D
----------------o-------------------
o
------------o-----------------------
o
--------o---------------------------
o
----o-------------------------------
o
o-----------------------------------
Output: EGBDFFACE
|\
|\
|\
------------o-------|-----------
| o | |\
|---|\--------------|---|\------
| | o |\
o---|---|\--------------o---|\--
o |\ |\
--------|\------------------|---
o o
--------------------------------
Output: B / 4 A / 8 F / 32 F / 32 EC / 4 B / 32 F / 16
Jawaban:
Javascript,
284.279.278.225.221, 220 Karakter (termasuk spasi yang diperlukan)One-liner ( biola uji ):
Dapat dibaca ( tes biola ):
sumber
;
dan melakukan beberapa trik, Anda bisa membuatnya lebih pendek.function a(c){b='',d=c.split('\n');for(e=0;d[0][e++];){for(i=f=0;g=d[i++];){h=g[e-1];if(h=='o')b+=(b?' ':'')+String.fromCharCode((d.length+4-i)%7+65);if(h=='|')f=f||4;f*=1+(g[e]=='\\');}if(f)b+='/'+f}return b}
(209 karakter)Perl, 103 karakter
(108 jika Anda menghitung karakter spasi putih yang diperlukan)
Dengan spasi putih untuk presentasi:
Perhatikan bahwa saya berasumsi bahwa semua baris memiliki panjang yang sama (sesuai versi revisi pertanyaan).
Versi ulang dengan penjelasan:
(solusi lama, lebih lama, disimpan karena mungkin menarik meskipun sedikit lebih lama)
Perl,
147126 karakter(
149131 jika Anda menghitung spasi yang diperlukan)Dengan spasi putih untuk presentasi:
Ulang sedikit agar tidak terlalu banyak menyalahgunakan bahasa:
Perhatikan bahwa saya berasumsi bahwa semua garis memiliki panjang yang sama. Jika Anda ingin memperbolehkan baris yang lebih pendek, perbaikan yang jelas adalah menambahkan
$_.=1x$c,
di awal program, dengan biaya 9 karakter.Saya memikirkan pendekatan lain untuk menghindari kata-kata panjang seperti
split
danmap
dan membiarkan ruang melakukan lebih banyak pekerjaan, tetapi pelat dan tanda baca mengambil balas dendam mereka, dan saya hanya bisa membawanya ke sebuah rejan 130 (144 dengan spasi yang diperlukan).Patch untuk mengatasi garis-garis yang belum selesai sedikit lebih aneh kali ini (apa, Anda pikir itu tidak akan aneh?). 139 karakter, 155 dengan spasi putih yang diperlukan.
sumber
Scala (2.9),
352313291294290277274273 karakterJika semua fungsi yang diperlukan:
Jika program lengkap diperlukan:
sumber
J - 108 karakter
Tidak Disatukan:
sumber
Golf Python, 207 karakter.
Saya sudah mulai kode golf dengan Python selama 2 hari dan saya menemukan bahwa hal-hal seperti
import sys
,sys.stdin.read
,sys.stdout.write
yang ekspansif.sumber