pengantar
The kode Parsons adalah cara sederhana untuk menggambarkan variasi lapangan dalam sepotong musik, apakah catatan lebih tinggi atau lebih rendah dari yang sebelumnya.
Bahkan jika Anda payah dalam mengingat lagu, Anda masih dapat mengingat jika nada naik atau turun, sehingga kode Parsons dapat membantu Anda mengidentifikasi musik menggunakan mesin pencari.
Deskripsi
Setiap variasi diwakili oleh satu karakter, yang merupakan salah satu dari yang berikut:
R
jika notnya sama dengan yang sebelumnya (singkatan dari " R epeat" )U
jika not lebih tinggi dari yang sebelumnya (singkatan dari " Up " )D
jika catatan lebih rendah dari yang sebelumnya (kepanjangan dari " D sendiri" )
Catatan awal ditulis sebagai *
.
Contoh
Berikut adalah contoh kode Parsons (awal dari "Ode to Joy" ):
*RUURDDDDRUURDR
Anda sebenarnya dapat memvisualisasikannya , seperti ini:
*-*
/ \
* *
/ \
*-* * *-*
\ / \
* * *-*
\ /
*-*
Kami akan menyebutnya kontur mulai sekarang.
Aturan untuk menggambar kontur semacam itu dianggap dijelaskan sendiri oleh contoh di atas.
Tantangan
Sekarang datang tantangan nyata.
Tulis program yang, diberi kontur sebagai input, mengeluarkan kode Parsons yang sesuai.
Anda tidak diminta untuk menggambar kontur, tetapi sebaliknya justru.
Dari kontur, cari kode Parsons asli.
Aturan
- Aturan yang biasa untuk kode golf berlaku
- Program terpendek dalam jumlah byte menang
- Input adalah kontur, dan output akan menjadi kode Parsons yang valid
- Detail tentang spasi kosong tambahan untuk input tidak relevan, lakukan apa pun yang terbaik untuk Anda
- Anda tidak diperbolehkan melakukan hardcode, dengan satu atau lain cara, bagian dari output dan / atau program menggunakan spasi kosong karena aturan sebelumnya
Catatan
- Ini mungkin berguna untuk pengujian
- Kode Parsons yang sesuai
*
adalah*
- String kosong bukan kontur yang valid
- Kode Parsons selalu dimulai dengan
*
*
yang tidak melakukan apa-apa?*
? Nggak. Seharusnya mencetak*
saya kira. Saya akan menambahkan kasing sudut ini.*
. Selalu.Jawaban:
Pyth -
28252725 byte2 bye disimpan berkat @Jakube.
Cobalah online di sini .
sumber
*
sebagai input. Outputnya*0
sementara seharusnya adil*
. Nol trailing liar jahat muncul.U
danD
omong-omong. Kalau tidak, dilakukan dengan baik.CJam, 21 byte
Lipat garis (
:
) dengan membuat vektor (.
) operasi maksimum karakter-bijaksanae>
. Karena hanya ada satu karakter non-spasi di setiap kolom, ini akan menjadi hasilnya, karena space memiliki kode ASCII yang lebih kecil daripada semua karakter non-spasi yang dapat dicetak.Cabut dan cetak tanda bintang pertama
(o
, lalu petakan setiap2%
char lainnya ( ) yang tersisa untukUDR
menggunakan pengindeksan modular.Solusi lama (29 byte)
qN/
mendapat jalur input.z
transpos matriks karakter ini.2%
menjatuhkan setiap baris aneh.'*f#
menemukan indeks tanda bintang di setiap baris.0+2ew);
mendapat semua pasangan indeks berurutan.::-
menghitung perbedaan mereka, dan"RDU"f=
peta mereka untuk huruf (melalui pengindeksan modular:0 → R
,2 → U
,-2 ≡ 1 → D
). Pimpinan'*
mengawali tanda bintang.EDIT : Saya berubah
2ew
untuk0+2ew);
bekerja di sekitar CJam tidak menanganiew
(irisan berturut-turut) pada daftar yang terlalu pendek. Ini membuat kode berfungsi untuk string input*
.Cobalah di sini , atau tontonlah beraksi:
sumber
:-p
*
input meskipun. Saya mendapatkan yang bagusRuntimeException
sebagai gantinya.[X]2ew
harus kembali[]
daripada tidak keluar. Saya akan menambahkan solusinya.Python 3,
1291089886 byteMungkin ada beberapa cara untuk bermain golf ini, tetapi saya lebih suka bahwa saya mendapatkan semuanya menjadi satu baris.
Edit: Sekarang menggunakan
''.translate()
Sunting: Dengan banyak terima kasih kepada wnnmaw .
Sunting: Saya mengubah format input ke array string alih-alih string yang dipisahkan baris baru untuk menghemat byte. Juga, dalam edit terakhir, saya campur aduk
U
danR
, jadi saya memperbaikinya.Input harus berupa array string. Untuk contoh di atas, ini terlihat seperti:
Tidak Disatukan:
sumber
lambda s:'*'+"".join((('D','R')[j=='-'],'U')[j=='/']for l in zip(*s.split('\n'))for j in l if j in'\\/-')
jam pada 105 byte. Perbedaan utama adalah menggunakan tuple conditional alih-alih menerjemahkanRuby, 87 byte
Membutuhkan spasi tambahan pada input sehingga semua garis memiliki panjang yang sama.
sumber
>:D
.Japt, 38 byte
40 41 45 46 48Disimpan 2 byte berkat produk @ETH
Jika ada perintah trim ini hanya akan menjadi 38 byte; -; akan menambah penjelasan saat saya selesai bermain golf. Ini
:P
bukan program yang mencoba untuk menjadi lucu, itu sebenarnya program mengabaikan karakter yang tidak penting.Cobalah online
sumber
x
dan merefleksikan dan memutar fungsi diy
danz
(dipisah di baris baru, gunakan fungsi array, bergabung dengan baris baru)Yu ?"RUD"g1+(XrS c -47 g):P
Haskell, 89 byte
Contoh penggunaan:
Transpos input dan mengganti karakter
/
/-
/\
dengan tunggal string"U"
/"R"
/"D"
. Semua karakter lainnya digantikan oleh string kosong""
, yang kemudian menghilang dengan menggabungkan semuanya. Akhirnya, tambahkan tanda bintang*
.sumber
Mathematica, 103 byte
Cukup singkat, mengingat ini adalah tantangan pemrosesan string.
sumber
JavaScript (ES6) 90
Fungsi anonim. Ini memindai char string input oleh char, dengan mempertimbangkan posisi di baris saat ini. Melakukan hal ini, ia membangun sebuah output array subsituting
U D R
untuk/ \ -
di tempat yang tepatsumber
Matlab, 62 byte
Ini membutuhkan input menjadi persegi panjang (jumlah karakter yang sama di setiap baris). Misalnya
Penjelasan
sumber