Pengkodean run-length ganda

9

Semua orang tahu apa itu pengkodean run-length. Sudah menjadi subjek dari banyak tantangan kode-golf. Kami akan melihat variasi tertentu.

Contoh

Normal: 11222222222222222222233333111111111112333322
Run-length: 112(19)3(5)1(11)2333322

Angka dalam tanda kurung menentukan berapa kali simbol sebelumnya terjadi. Dalam contoh, hanya menjalankan 5 karakter atau lebih yang dikodekan. Ini karena proses pengkodean berjalan 4 atau kurang tidak meningkatkan jumlah karakter.

Tantangan

Tulis fungsi / program yang mengimplementasikan variasi pengkodean run-length ini, tetapi juga dapat menyandikan run dari dua simbol. Lari dua simbol juga harus tertutup dalam tanda kurung. Grup juga akan dilampirkan dalam tanda kurung. Program Anda harus menerima string sebagai input, dan mengeluarkan string yang dimodifikasi dengan modifikasi yang mempersingkat string.

Contoh

Normal: 111244411144411144411167676767222222277777222222277777123123123123
Double run-length: 1112((444111)(3))67676767((2(7)7(5))(2))123123123123

Catatan

  • 111tidak disandikan karena penyandiannya ( 1(3)) tidak lebih pendek.
  • String 444111muncul 3 kali sehingga dikodekan.
  • 676767tidak disandikan karena ((67)(4))lebih panjang dari sebelumnya.
  • 222222277777222222277777tidak dikodekan sebagai ((222222277777)(2)). Mengapa? Karena 222222277777itu sendiri dapat dikurangi menjadi 2(7)7(5).
  • 123123123123 tidak disandikan karena program Anda seharusnya menangani dua simbol, bukan tiga.

Ini adalah sehingga kode terpendek menang. Tie-breaker adalah pengiriman awal.


Jika saya melewatkan sesuatu, atau jika Anda tidak yakin akan apa pun, beri tahu saya di komentar.

ericw31415
sumber
Tapi ada 4 67s.
Leaky Nun
Apakah kita harus menangani 441444144414-> ((4414)(3))?
Leaky Nun
Saya sudah memperbaikinya.
ericw31415
@ KennyLau Tidak, Anda tidak akan. 4414secara teknis serangkaian 4. Kata-kata saya hanya buruk.
ericw31415
Dapat 111111111dikodekan sebagai (1)(9)?
CalculatorFeline

Jawaban:

2

Retina, 162 byte

+{`((\d)\2*(?!\2)(\d)\3*|\d)(?<1>\1)+
<<$1><$#1>>
<<([^<>]{1,7})><2>>
$1$1
<<([^<>]{1,3})><3>>
$1$1$1
<<([^<>]{1,2})><4>>
$1$1$1$1
}`<<(.)><(\d+)>>
$1($2)
T`<>`()

Cobalah online!

Biarawati Bocor
sumber
Jika Anda input 10101010100100100100100, outputnya adalah ((10)(5))0((100)(4)), namun ((10)(4))((100)(5))akan menjadi satu karakter lebih pendek.
Marv
Apakah Anda benar-benar harus menggunakan testis marginal seperti itu ....
Leaky Nun
Ya, itu semua menyenangkan! : ^)
Marv
Lucu bagaimana ini satu-satunya jawaban saat ini di sini.
ericw31415