# Double run-length encoding

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? Because 222222277777 itself can be reduced to 2(7)7(5).
• 123123123123 isn't encoded because your program is supposed to handle runs of two symbols, not three.

This is 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 May 6 '16 at 18:58
• Will we have to handle 441444144414 -> ((4414)(3))? – Leaky Nun May 6 '16 at 18:58
• I have fixed it. – ericw31415 May 6 '16 at 18:59
• @KennyLau No, you will not. 4414 is technically a series of 4. My wording is just bad. – ericw31415 May 6 '16 at 18:59
• Can 111111111 be encoded as (1)(9)? – CalculatorFeline May 6 '16 at 21:44

# Retina, 162 bytes

+{((\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<>()


Try it online!

• If you input 10101010100100100100100, the output is ((10)(5))0((100)(4)), yet ((10)(4))((100)(5)) would be one character shorter. – Marv May 8 '16 at 1:38
• Do you really have to use such marginal testcases.... – Leaky Nun May 8 '16 at 1:41
• Yes, thats all the fun! :^) – Marv May 8 '16 at 1:46
• It's funny how this is the only answer currently here. – ericw31415 May 23 '16 at 23:50