有时,这里的问题要求画一些ASCII艺术。一种用于存储数据的简单方法是RLE(行程编码)。所以:
qqqwwwwweeerrrrrtttyyyy
变成:
3q5w3e5r3t4y
现在,要画出很大的ASCII艺术,您可能正在获取如下数据(忽略换行符):
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)
用于ASCII艺术的字符永远不会是小写或大写字母或数字,而只能是符号,标记和符号,而总是在可打印的ASCII字符集中。
您想在该字符串中节省一些空间,所以用大写字符集替换数字(“ A”等于1,“ B”等于2,直到“ Z”等于26),因为您永远不会重复一个角色超过26次。这样就得到:
S,T C(D)K@A$T K@S,O"D:T D)S,D:T K@
(Character count: 34)
最后,您注意到某些(letter + symbol)组正在重复,因此您将在字符串中出现3次或多次的组替换为小写字符集(按顺序或出现在字符串中,但将其存储在缓冲区中)进行替换(每次替换的格式为“ group + substitution char”),其余字符串保持原样。所以以下几组:
S, (3 times)
T (4 times)
K@ (3 times)
分别用“ a”,“ b”和“ c”代替,因为重复的组永远不会超过26个。所以最终您得到:
S,aT bK@c
abC(D)cA$bcaO"D:bD)aD:bc
(Character count: 9+24=33)
[最后一步只保存1个字节,因为被替换后实际保存字符的组是出现4次或更多的组。]
挑战
给定一个包含RLE数据的字符串以绘制ASCII文字(提出了限制),请编写最短的程序/函数/方法,以便按说明进行压缩。该算法必须打印/返回两个字符串:第一个字符串包含用于压缩的字典,第二个字符串是生成的压缩字符串。您可以按给定的顺序将字符串作为元组,数组,列表或其他形式返回。
请注意,如果在步骤2中无法压缩字符串,则算法必须返回一个空字符串作为第一个返回值,并将步骤1的结果作为第二个返回值。
您无需在输出值中包含步骤1的结果,仅出于说明目的将它们包含在示例中。
这是代码高尔夫球,所以每种语言的最短答案可能会获胜!
另一个测试案例
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
可能会被存储为只是S,T K@
没有明确命名可以从中得出的替换字符。