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.
la source
Réponses:
CJam,
5048 octetsMerci pour Dennis d'avoir économisé 2 octets.
Essayez-le en ligne.
Explication
la source
Pyth, 48
50octets2 octets grâce à @Maltysen.
Manifestation. Harnais de test.
Explication:
la source
"{}"
vous pouvez utiliser`H
, à égalité avec CJam :)OCaml, 252
t
est la fonction qui fait la transformation.Au début, je pensais que je devais vérifier la présence d'appareils orthopédiques, mais cela s'est avéré inutile. Le décodage n'a clairement aucun effet sur les chaînes qui sont déjà décodées, et la partie encodage s'est avérée tout aussi inoffensive pour celles qui étaient déjà encodées.
la source
the encoding part proved equally harmless
le fait-il?4{{8{{{G{{{{W{{{{{
Vous ne comprenez pas le codage4{{8{}G{{{W{{}
?JavaScript ( ES6 ), 162
Quelques explications
Numéro n à BB2 en utilisant 0 et 1:
(n+1).toString(2).slice(1)
Chaîne dans BB2 en nombre: to_number ("0b1" + chaîne) - c'est-à-dire, ajoutez un chiffre binaire à l'extrême gauche et convertissez en binaire (et diminuez de 1, pas nécessaire dans cette instance spécifique).
Expression régulière pour rechercher n'importe quel caractère suivi de
{
ou}
:/[^{}][{}]+/g
Expression régulière pour trouver des caractères répétés:
/(.)\1*/g
En utilisant cette expression rationnelle dans replace, le premier paramètre est le caractère "répété" (éventuellement répéter une seule fois), le deuxième paramètre est la chaîne totale répétée, dont la longueur est le nombre que j'ai besoin d'encoder en BB2 déjà incrémenté de 1
... puis mettez tout ensemble ...
la source