Contexte
Après avoir appliqué le BWT (comme on le voit dans Burrows, Wheeler et Back ) et le MTF (comme on le voit dans Move to the imprimable ASCII front ), le compresseur bzip2 applique une forme plutôt unique d'encodage de longueur.
Définition
Aux fins de ce défi, nous définissons la transformation BRLE comme suit:
Étant donné une chaîne d'entrée s composée uniquement de caractères ASCII avec des points de code compris entre 0x20 et 0x7A, procédez comme suit:
Remplacez chaque série de caractères égaux par une seule occurrence du caractère et stockez le nombre de répétitions après la première.
Encode le nombre de répétitions après la première occurrence du caractère , en utilisant la numération bijective base-2 et les symboles
{
et}
.Un entier non négatif n est codé comme la chaîne b k … b 0 telle que n = 2 k i (b k ) +… + 2 0 i (b 0 ) , où i (
{
) = 1 et i (}
) = 2 .Notez que cette représentation est toujours unique. Par exemple, le nombre 0 est codé comme une chaîne vide.
Insérez la chaîne entre accolades qui code le nombre de répétitions après l'occurrence unique du caractère correspondant.
Exemple pas à pas
Input: "abbcccddddeeeeeffffffggggggghhhhhhhh"
Step 1: "abcdefgh" with repetitions 0, 1, 2, 3, 4, 5, 6, 7
Step 2: "" "{" "}" "{{" "{}" "}{" "}}" "{{{"
Step 3: "ab{c}d{{e{}f}{g}}h{{{"
Tâche
Implémentez un programme ou une fonction involutive qui lit une chaîne unique à partir de STDIN ou comme argument de ligne de commande ou de fonction et imprime ou renvoie soit le BRLE soit son inverse de la chaîne d'entrée.
Si l'entrée ne contient pas de crochets, appliquez le BRLE. Si l'entrée contient des accolades, appliquez son inverse.
Exemples
INPUT: CODEGOLF
OUTPUT: CODEGOLF
INPUT: PROGRAMMING
OUTPUT: PROGRAM{ING
INPUT: PUZ{LES
OUTPUT: PUZZLES
INPUT: 444488888888GGGGGGGGGGGGGGGGWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
OUTPUT: 4{{8{{{G{{{{W{{{{{
INPUT: y}}}{{
OUTPUT: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
Règles supplémentaires
Vous ne pouvez pas utiliser de fonctions intégrées qui calculent le BRLE ou son inverse d'une chaîne.
Vous pouvez utiliser des fonctions intégrées qui:
Calculez le RLE ou le RLD d'une chaîne, tant que le nombre de répétitions n'est pas stocké dans la base bijective-2.
Effectuez une conversion de base de tout type.
Votre code peut imprimer une nouvelle ligne de fin si vous choisissez STDOUT pour la sortie.
Votre code doit fonctionner pour toute entrée de 1000 caractères ASCII ou moins dans la plage de 0x20 à 0x7A, plus les accolades (0x7B et 0x7D).
Si l'entrée contient des accolades, vous pouvez supposer que c'est un résultat valide de l'application du BRLE à une chaîne.
Les règles de golf à code standard s'appliquent. La soumission la plus courte en octets l'emporte.