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"
la source
S,aT bK@c
serait probablement stocké comme justeS,T K@
sans nommer explicitement les caractères de substitution qui peuvent être trivialement déduits de cela.Réponses:
JavaScript (ES6),
168167 octetsRenvoie un tableau de deux chaînes:
[dictionary, compressed_string]
.Cas de test
Afficher l'extrait de code
la source
Python 2 ,
269280268266 octetsRien de spécial ici. Bonne occasion d'utiliser des expressions régulières simples.
La première version a échoué pour les chaînes contenant des caractères spéciaux qui ont été interprétés dans l'expression régulière. La deuxième version (utilisant re.escape) fonctionne avec tous les cas de test. Cette correction a coûté 11 octets.
La deuxième version n'a pas attribué de caractères de substitution dans l'ordre, comme requis dans la spécification du problème, et comme l'a souligné @CarlosAlejo. Revenons donc à la planche à dessin.
Version corrigée, encore golfée
Essayez-le en ligne!
la source
O,a
.b=a=input()
etn,s,p=96,'',0
?\d+
serait une expression rationnelle plus courte à utiliser. Vous ne dépasserez jamais 26 de toute façon, il n'y a donc aucune raison de s'assurer que c'est spécifiquement 1-2 chiffres. En outre, l'utilisationre.escape
signifie qu'une chaîne de basereplace
se termine légèrement plus courte: 253 octetsLua, 215 octets
Juste un peu de correspondance de motifs.
Je pense que Lua est sous-estimée quand il s'agit de jouer au golf ... regardez toutes ces déclarations écrasées ensemble!
la source
Python 2 , 186 octets
J'espérais enfin trouver une utilisation pour
re.subn
: CCompressé à l'étape 2
Non compressé à l'étape 2
Python 2 , 246 octets
Toute la deuxième étape se fait en repl lambda de re. Juste pour le fun.
Essayez-le en ligne!
la source
Perl 5
-pl
, 81 octetsEssayez-le en ligne!
Imprime la chaîne encodée sur la première ligne, les triplets sur la deuxième ligne
la source
Rubis
-p
, 133 octetsEssayez-le en ligne!
la source