Codificação de duração dupla

9

Todo mundo sabe o que é codificação em tamanho de execução. Já foi objeto de muitos desafios de código-golfe. Veremos uma certa variação.

Exemplo

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

O número entre parênteses especifica o número de vezes que o símbolo anterior ocorreu. No exemplo, apenas execuções de 5 ou mais caracteres foram codificadas. Isso ocorre porque a codificação de 4 ou menos não melhora a contagem de caracteres.

Desafio

Escreva uma função / programa que implemente essa variação da codificação de comprimento de execução, mas também possa codificar execuções de dois símbolos. As execuções de dois símbolos também devem estar entre parênteses. Um grupo também será colocado entre parênteses. Seu programa deve aceitar uma sequência como entrada e gerar a sequência modificada com modificações que encurtam a sequência.

Exemplo

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

Notas

  • 111não foi codificado porque codificá-lo ( 1(3)) não é mais curto.
  • A cadeia 444111ocorre 3 vezes e é codificada.
  • 676767não foi codificado porque ((67)(4))é mais longo do que antes.
  • 222222277777222222277777não foi codificado como ((222222277777)(2)). Por quê? Porque em 222222277777si pode ser reduzido a 2(7)7(5).
  • 123123123123 não é codificado porque seu programa deve lidar com execuções de dois símbolos, não três.

Isso é então o código mais curto vence. O desempate é finalização antecipada.


Se eu perdi alguma coisa, ou se você não tiver certeza, notifique-me nos comentários.

ericw31415
fonte
Mas existem 4 67s.
Leaky Nun
Teremos que lidar com 441444144414-> ((4414)(3))?
Leaky Nun
Eu consertei isso.
Ericw31415
@KennyLau Não, você não vai. 4414é tecnicamente uma série de 4. Minha redação é ruim.
Ericw31415
Pode 111111111ser codificado como (1)(9)?
CalculadoraFeline

Respostas:

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

Experimente online!

Freira Furada
fonte
Se você inserir 10101010100100100100100, a saída é ((10)(5))0((100)(4)), ainda assim, ((10)(4))((100)(5))seria um caractere menor.
Marv
Você realmente tem que usar tais testcases marginais ....
Leaky Nun
Sim, isso é toda a diversão! : ^)
Marv
É engraçado como esta é a única resposta atualmente aqui.
Ericw31415