Encodage à double longueur

9

Tout le monde sait ce qu'est le codage de longueur. Il a déjà fait l'objet de nombreux défis de code-golf. Nous allons examiner une certaine variation.

Exemple

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

Le nombre entre parenthèses indique le nombre de fois où le symbole précédent s'est produit. Dans l'exemple, seules des séries de 5 caractères ou plus ont été encodées. Cela est dû au fait que l'encodage de 4 séquences ou moins n'améliore pas le nombre de caractères.

Défi

Écrivez une fonction / un programme qui implémente cette variation de codage de longueur d'exécution, mais peut également coder des séries de deux symboles. Les séquences de deux symboles doivent également être placées entre parenthèses. Un groupe sera également mis entre parenthèses. Votre programme doit accepter une chaîne en entrée et produire la chaîne modifiée avec des modifications qui raccourcissent la chaîne.

Exemple

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

Remarques

  • 111n'a pas été encodé car l'encodage ( 1(3)) n'est pas plus court.
  • La chaîne 444111se produit 3 fois, elle est donc codée.
  • 676767n'a pas été encodé car il ((67)(4))est plus long qu'avant.
  • 222222277777222222277777n'était pas codé comme ((222222277777)(2)). Pourquoi? Parce que 222222277777lui-même peut être réduit à 2(7)7(5).
  • 123123123123 n'est pas codé car votre programme est censé gérer des séries de deux symboles, pas trois.

C'est le donc le code le plus court gagne. Le bris d'égalité est une soumission anticipée.


Si j'ai raté quelque chose ou si vous n'êtes sûr de rien, veuillez m'en informer dans les commentaires.

ericw31415
la source
Mais il y a 4 67s.
Leaky Nun
Devrons-nous gérer 441444144414-> ((4414)(3))?
Leaky Nun
Je l'ai corrigé.
ericw31415
@KennyLau Non, vous ne le ferez pas. 4414est techniquement une série de 4. Ma formulation est tout simplement mauvaise.
ericw31415
Peut 111111111être codé comme (1)(9)?
CalculatorFeline

Réponses:

2

Rétine, 162 octets

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

Essayez-le en ligne!

Leaky Nun
la source
Si vous saisissez 10101010100100100100100, la sortie est ((10)(5))0((100)(4)), mais ((10)(4))((100)(5))serait un caractère plus court.
Marv
Avez-vous vraiment besoin d'utiliser de tels tests marginaux ...
Leaky Nun
Oui, c'est tout le plaisir! : ^)
Marv
C'est drôle comment c'est la seule réponse actuellement ici.
ericw31415