Codificación de doble longitud de ejecución

9

Todos saben qué es la codificación de longitud de ejecución. Ya ha sido objeto de muchos desafíos de código de golf. Vamos a ver una cierta variación.

Ejemplo

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

El número entre paréntesis especifica la cantidad de veces que ocurrió el símbolo anterior. En el ejemplo, solo se codificaron series de 5 o más caracteres. Esto se debe a que las codificaciones de 4 o menos no mejoran el recuento de caracteres.

Desafío

Escriba una función / programa que implemente esta variación de codificación de longitud de ejecución, pero que también pueda codificar ejecuciones de dos símbolos. Las corridas de dos símbolos también deben estar entre paréntesis. Un grupo también estará encerrado entre paréntesis. Su programa debe aceptar una cadena como entrada y generar la cadena modificada con modificaciones que acorten la cadena.

Ejemplo

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

Notas

  • 111no se codificó porque codificarlo ( 1(3)) no es más corto.
  • La cadena se 444111produce 3 veces, por lo que está codificada.
  • 676767no se codificó porque ((67)(4))es más largo que antes.
  • 222222277777222222277777no fue codificado como ((222222277777)(2)). ¿Por qué? Porque 222222277777se puede reducir a sí mismo 2(7)7(5).
  • 123123123123 no está codificado porque se supone que su programa maneja corridas de dos símbolos, no tres.

Este es el por lo que gana el código más corto. El desempate es la presentación temprana.


Si me perdí algo, o si no está seguro de algo, notifíqueme en los comentarios.

ericw31415
fuente
Pero hay 4 67s.
Leaky Nun
¿Tendremos que manejar 441444144414-> ((4414)(3))?
Leaky Nun
Lo he arreglado
ericw31415
@KennyLau No, no lo harás. 4414es técnicamente una serie de 4. Mi redacción es simplemente mala.
ericw31415
Se 111111111puede codificar como (1)(9)?
CalculatorFeline

Respuestas:

2

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`<>`()

Pruébalo en línea!

Monja permeable
fuente
Si ingresa 10101010100100100100100, la salida es ((10)(5))0((100)(4)), sin embargo, ((10)(4))((100)(5))sería un carácter más corto.
Marv
¿De verdad tienes que usar tales casos de prueba marginales ...
Leaky Nun
Sí, eso es toda la diversión! : ^)
Marv
Es curioso cómo esta es la única respuesta actualmente aquí.
ericw31415