背景
应用BWT(在Burrows,Wheeler和Back中看到)和MTF(在Move到可打印的ASCII front中看到)之后,bzip2压缩器应用了一种相当独特的游程长度编码形式。
定义
出于这一挑战的目的,我们将转换BRLE定义如下:
给定仅包含ASCII字符且代码点在0x20和0x7A之间的输入字符串s,请执行以下操作:
用单次出现的字符替换每次运行的相等字符,并在第一个字符之后存储重复次数。
使用双射基数2以及符号和和对字符首次出现后的重复次数进行编码。
{
}
非负整数n被编码为字符串b k …b 0,使得n = 2 k i(b k)+ ... + 2 0 i(b 0),其中i(
{
)= 1和i(}
)= 2。请注意,此表示始终是唯一的。例如,数字0被编码为空字符串。
插入大括号字符串,该字符串编码相应字符单次出现后的重复次数。
分步示例
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{{{"
任务
实现一个渐进式程序或函数,该程序或函数从STDIN读取单个字符串,或者作为命令行或函数参数读取并打印或返回BRLE或其输入字符串的反数。
如果输入不包含大括号,请应用BRLE。如果输入中包含大括号,则应用其倒数。
例子
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
附加规则
您不能使用任何用于计算BRLE或其字符串反数的内置函数。
您可以使用以下内置函数:
只要重复次数未存储在双射基数2中,就计算字符串的RLE或RLD。
执行任何形式的基本转换。
如果您选择STDOUT输出,您的代码可能会打印尾随换行符。
您的代码必须适用于1000个或更少的ASCII字符输入,范围从0x20到0x7A,再加上大括号(0x7B和0x7D)。
如果输入中包含大括号,则可以假定将BRLE应用于字符串是有效的结果。
适用标准代码高尔夫规则。以字节为单位的最短提交获胜。