9
1
Everyone knows what run-length encoding is. It has been the subject of many code-golf challenges already. We'll be looking at a certain variation.
Example
Normal: 11222222222222222222233333111111111112333322
Run-length: 112(19)3(5)1(11)2333322
The number in parentheses specifies the number of times the previous symbol occurred. In the example, only runs of 5 or more characters were encoded. This is because encoding runs of 4 or less doesn't improve the character count.
Challenge
Write a function/program that implements this variation of run-length encoding, but can also encode runs of two symbols. The runs of two symbols must also be enclosed in parentheses. A group will also be enclosed in parentheses. Your program must accept a string as input, and output the modified string with modifications that shorten the string.
Example
Normal: 111244411144411144411167676767222222277777222222277777123123123123
Double run-length: 1112((444111)(3))67676767((2(7)7(5))(2))123123123123
Notes
111was not encoded because encoding it (1(3)) is not shorter.- The string
444111occurs 3 times so it is encoded. 676767was not encoded because((67)(4))is longer than before.222222277777222222277777was not encoded as((222222277777)(2)). Why? Because222222277777itself can be reduced to2(7)7(5).123123123123isn't encoded because your program is supposed to handle runs of two symbols, not three.
This is code-golf so shortest code wins. Tie-breaker is early submission.
If I missed anything, or if you are unsure of anything please notify me in the comments.
But there are 4
67s. – Leaky Nun – 2016-05-06T18:58:00.303Will we have to handle
441444144414->((4414)(3))? – Leaky Nun – 2016-05-06T18:58:58.887I have fixed it. – ericw31415 – 2016-05-06T18:59:08.547
@KennyLau No, you will not.
4414is technically a series of 4. My wording is just bad. – ericw31415 – 2016-05-06T18:59:56.880Can
111111111be encoded as(1)(9)? – CalculatorFeline – 2016-05-06T21:44:53.190It should be encoded as
1(9), because it's shorter than(1)(9). – ericw31415 – 2016-05-06T22:14:28.573((4(9)1)(2)) or 4(9)14(9)1? – Leaky Nun – 2016-05-07T02:26:18.983
The second one. Remember, pick whichever is shorter. – ericw31415 – 2016-05-07T10:22:24.487
You might want to add more testcases (hint: they are in my solution) – Leaky Nun – 2016-05-07T10:30:44.880
Um,
(67(4))[7 characters] is definitely shorter than67676767[8 characters]. – Dúthomhas – 2016-05-07T10:48:01.313(67(4))implies67777. – ericw31415 – 2016-05-07T11:10:25.497Yoinks! (I need sleep, apparently.) – Dúthomhas – 2016-05-07T11:15:21.883
@ppperry I believe that should be
(4(1111)). – ericw31415 – 2017-08-22T21:26:14.473