Cette question est basée sur ce que j'ai trouvé pour répondre à une autre question .
Parfois, les questions ici demandent de dessiner de l'art ASCII. Un moyen simple de stocker les données pour l'art est RLE (encodage de longueur) . Donc:
qqqwwwwweeerrrrrtttyyyy
devient:
3q5w3e5r3t4y
Maintenant, pour dessiner un grand art ASCII, vous obtiendrez peut-être des données comme celle-ci (en ignorant les nouveaux caractères de ligne):
19,20 3(4)11@1$20 11@19,15"4:20 4)19,4:20 11@
^^^
Note that this is "20 whitespaces"
(Character count: 45)
Les caractères utilisés pour l'art ASCII ne seront jamais des lettres ou des chiffres minuscules ou majuscules, seulement des signes, des marques et des symboles mais toujours dans le jeu de caractères ASCII imprimable.
Vous voulez économiser de l'espace dans cette chaîne, donc vous remplacez les nombres par le jeu de caractères majuscules (étant 'A' est égal à 1, 'B' est égal à 2 jusqu'à ce que 'Z' soit égal à 26), parce que vous n'allez jamais obtenir plus de 26 répétitions d'un personnage. Vous obtenez donc:
S,T C(D)K@A$T K@S,O"D:T D)S,D:T K@
(Character count: 34)
Et enfin, vous remarquez que certains groupes de (lettre + symbole) se répètent, vous remplacez donc les groupes qui apparaissent 3 fois ou plus dans la chaîne par le jeu de caractères en minuscules, dans l'ordre ou l'apparence dans la chaîne, mais en stockant dans un tampon le substitutions effectuées (au format "groupe + caractère de substitution" pour chaque substitution) et en laissant le reste de la chaîne tel quel. Donc les groupes suivants:
S, (3 times)
T (4 times)
K@ (3 times)
est remplacé par «a», «b» et «c», respectivement, car il n'y aura jamais plus de 26 groupes se répétant. Donc, finalement, vous obtenez:
S,aT bK@c
abC(D)cA$bcaO"D:bD)aD:bc
(Character count: 9+24=33)
[La dernière étape enregistre seulement 1 octet car les groupes qui enregistrent réellement les caractères après avoir été substitués sont ceux qui apparaissent 4 fois ou plus.]
Le défi
Étant donné une chaîne contenant les données RLE pour dessiner un art ASCII (avec les restrictions proposées), écrivez le programme / fonction / méthode le plus court possible afin de le compresser comme décrit. L'algorithme doit imprimer / renvoyer deux chaînes: la première contenant le dictionnaire utilisé pour la compression et la seconde étant la chaîne compressée résultante. Vous pouvez renvoyer les chaînes sous la forme d'un tuple, d'un tableau, d'une liste ou autre, dans l'ordre donné.
Notez que si la chaîne ne peut pas être compressée à l'étape 2, l'algorithme doit renvoyer une chaîne vide comme première valeur de retour et le résultat de l'étape 1 comme deuxième valeur de retour.
Vous n'avez pas besoin d'inclure le résultat de l'étape 1 dans les valeurs de sortie, je les inclue simplement dans les exemples à des fins de clarification.
C'est du golf de code , alors la réponse la plus courte pour chaque langue peut gagner!
Un autre cas de test
Input: 15,15/10$15,15/10"10$10"10$10"10$10"15,15/
Output of step 1: O,O/J$O,O/J"J$J"J$J"J$J"O,O/
Final algorithm output: O,aO/bJ$cJ"d
abcabdcdcdcdab
---
Input: 15,15/10$15,15/10"
Output of step 1: O,O/J$O,O/J"
Final algorithm output: <empty string>
O,O/J$O,O/J"
S,aT bK@c
serait probablement stocké comme juste S,T K@
sans nommer explicitement les caractères de substitution qui peuvent être trivialement déduits de cela.