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
111
was not encoded because encoding it (1(3)
) is not shorter.- The string
444111
occurs 3 times so it is encoded. 676767
was not encoded because((67)(4))
is longer than before.222222277777222222277777
was not encoded as((222222277777)(2))
. Why? Because222222277777
itself can be reduced to2(7)7(5)
.123123123123
isn'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.
67
s. \$\endgroup\$441444144414
->((4414)(3))
? \$\endgroup\$4414
is technically a series of 4. My wording is just bad. \$\endgroup\$111111111
be encoded as(1)(9)
? \$\endgroup\$