Unvisualize kode Parsons

22

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:

  • Rjika notnya sama dengan yang sebelumnya (singkatan dari " R epeat" )
  • Ujika not lebih tinggi dari yang sebelumnya (singkatan dari " Up " )
  • Djika 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

Helge von Koch
sumber
Jadi harus dimulai dengan *yang tidak melakukan apa-apa?
nicael
Apa maksudmu? kapan inputnya adil *? Nggak. Seharusnya mencetak *saya kira. Saya akan menambahkan kasing sudut ini.
Helge von Koch
1
@nicael Ya, itu harus dimulai dengan *. Selalu.
Helge von Koch

Jawaban:

4

Pyth - 28 25 27 25 byte

2 bye disimpan berkat @Jakube.

s+\*@L"RDU"-VFtBxR\*%2C.z

Cobalah online di sini .

Maltysen
sumber
1
Ini tidak berfungsi *sebagai input. Outputnya *0sementara seharusnya adil *. Nol trailing liar jahat muncul.
Helge von Koch
@HelgevonKoch diperbaiki
Maltysen
@ Jakube terima kasih!
Maltysen
Anda telah bertukar Udan Domong-omong. Kalau tidak, dilakukan dengan baik.
Helge von Koch
@HelgevonKoch oops
Maltysen
24

CJam, 21 byte

qN/:.e>(o2%:i"DRXU"f=

Lipat garis ( :) dengan membuat vektor ( .) operasi maksimum karakter-bijaksana e>. 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 setiap 2%char lainnya ( ) yang tersisa untuk UDRmenggunakan pengindeksan modular.

Solusi lama (29 byte)

'*qN/z2%'*f#0+2ew);::-"RDU"f=

qN/mendapat jalur input. ztranspos 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 2ewuntuk 0+2ew);bekerja di sekitar CJam tidak menangani ew(irisan berturut-turut) pada daftar yang terlalu pendek. Ini membuat kode berfungsi untuk string input *.

Cobalah di sini , atau tontonlah beraksi:

              
Lynn
sumber
7
Ini sangat mengagumkan untuk ditonton.
Jeel Shah
2
Saya setuju! +1 untuk kode, berharap saya dapat +10 untuk GIF.
Produk ETH
BTW, saya suka smiley di kode panjang 17:-p
ETHproduksi
1
Saya setuju, ini luar biasa untuk ditonton. Itu tidak bekerja dengan *input meskipun. Saya mendapatkan yang bagus RuntimeExceptionsebagai gantinya.
Helge von Koch
Ugh, saya menganggap bahwa bug CJam: [X]2ewharus kembali []daripada tidak keluar. Saya akan menambahkan solusinya.
Lynn
4

Python 3, 129 108 98 86 byte

Mungkin 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 Udan R, jadi saya memperbaikinya.

lambda a:'*'+"".join(('UR'[j<'/']+'D')[j>'/']for l in zip(*a)for j in l if j in'-/\\')

Input harus berupa array string. Untuk contoh di atas, ini terlihat seperti:

["      *-*                    ","     /   \                   ","    *     *                  ","   /       \                 ","*-*         *         *-*    ","             \       /   \   ","              *     *     *-*","               \   /         ","                *-*          "]

Tidak Disatukan:

def f(a):
    s = ''
    for c in zip(*a):           # transpose
        for d in c:             # for each letter in column c
            if e in "-/\\":     # if that letter is either -,/,\
                if e < '/':     # if < '/' (same as if == '-')
                    s += "R"
                elif e > '/':   # if > '/' (same as if == '\')
                    s += "D"
                else:           # if == '/'
                    s += "U"
        return "*" + s          # in the code we ''.join() it all together
                                # in this ungolfing, we add to an empty string
Sherlock9
sumber
Saya tidak ingin membuat jawaban baru karena saya meminjam banyak dari Anda, tetapi 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 menerjemahkan
wnnmaw
Terima kasih @wnnmaw! Saya pikir saya bisa bermain golf turun lebih jauh!
Sherlock9
Bermain golf yang bagus di depan, itu sangat pintar!
wnnmaw
Ah sial. Terima kasih atas tipnya @wnnmaw
Sherlock9
3

Ruby, 87 byte

Membutuhkan spasi tambahan pada input sehingga semua garis memiliki panjang yang sama.

$><<?*+$<.readlines.map(&:chars).transpose.join.gsub(/./,{?-=>:R,?/=>:U,?\\=>:D}).strip
daniero
sumber
4
Tentunya ini adalah kode berbahaya, karena mengandung >:D.
Alex A.
3

Japt, 38 byte 40 41 45 46 48

Disimpan 2 byte berkat produk @ETH

'*+U·y £Yu ?"RUD"g1+(XrS c -47 g):P} q

Jika ada perintah trim ini hanya akan menjadi 38 byte; -; akan menambah penjelasan saat saya selesai bermain golf. Ini :Pbukan program yang mencoba untuk menjadi lucu, itu sebenarnya program mengabaikan karakter yang tidak penting.

Cobalah online

Downgoat
sumber
Ketika saya melihat bahwa ada tantangan yang secara praktis membutuhkan susunan transpose, dan bahwa Doᴡɴɢᴏᴀᴛ telah menjawabnya, saya tahu itu haruslah Japt.
Produk ETH
BTW, saya akan menambahkan fungsi langsing di xdan merefleksikan dan memutar fungsi di ydan z(dipisah di baris baru, gunakan fungsi array, bergabung dengan baris baru)
ETHproductions
Anda dapat menyimpan dua byte seperti ini:Yu ?"RUD"g1+(XrS c -47 g):P
ETHproduksi
@ ETHproduksi terima kasih, hingga di bawah 40 byte!
Downgoat
3

Haskell, 89 byte

import Data.List
m '/'="U"
m '-'="R"
m '\\'="D"
m _=""
('*':).(>>=(>>=m)).transpose.lines

Contoh penggunaan:

*Main> ('*':).(>>=(>>=m)).transpose.lines $ "      *-*                    \n     /   \\                   \n    *     *                  \n   /       \\                 \n*-*         *         *-*    \n             \\       /   \\   \n              *     *     *-*\n               \\   /         \n                *-*          "
"*RUURDDDDRUURDR"

*Main> ('*':).(>>=(>>=m)).transpose.lines $ "*"
"*"

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 *.

nimi
sumber
2

Mathematica, 103 byte

"*"<>(Differences@Position[Thread@Characters@StringSplit[#,"
"],"*"][[;;,2]]/.{-2->"U",0->"R",2->"D"})&

Cukup singkat, mengingat ini adalah tantangan pemrosesan string.

LegionMammal978
sumber
2

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 Runtuk / \ -di tempat yang tepat

c=>[...c].map(c=>c>'*'?t[i++]=c>'/'?'D':c<'/'?'R':'U':c<' '?i=0:++i,t=['*'],i=0)&&t.join``
edc65
sumber
2

Matlab, 62 byte

r=@(s)[85-(s<14)*3-(s>59)*17,''];@(p)r(sum(p(:,2:2:end)-32))

Ini membutuhkan input menjadi persegi panjang (jumlah karakter yang sama di setiap baris). Misalnya

    ['      *-*                    ';    '     /   \                   ';    '    *     *                  ';    '   /       \                 ';    '*-*         *         *-*    ';    '             \       /   \   ';    '              *     *     *-*';    '               \   /         ';    '                *-*          '];

Penjelasan

sum(p(:,2:2:end)-32)        % exctract every second column, substract 32 (spaces->zeros) 
                            % and sum column wise (results in a vector of 3 different values)
[85-(s<14)*3-(s>59)*17,'']  % map each of the values to the corresponding value of the letter and convert back to characters
cacat
sumber