对于需要字符串压缩的kolmogorov-复杂性挑战,我总是没有给出答案,主要原因是我不知道如何有效地使用字符串压缩工具。
由于这个原因,我张贴了这个问题。与我的其他提示问题不同,这并不是特定于语言的问题,这意味着如果您可以用自己的语言想出任何技巧,那么您可以发布它(前提是指定语言)。一般提示也是值得赞赏的。
那么,如何使用字符串压缩工具来达到最大的效果呢?
发布于 2015-10-01 06:27:26
对不以空字节开头的ASCII字符串进行编码的一种简单方法是将基128转换为整数,然后转换为base 256:
128b256b:c e# Prints encoded string.
128b256b:c`"256b128b:c" e# Prints encoded string with decoder.
这使用7位来编码每个ASCII字符。
如果原始字符串仅由小写字母组成,并且不以a开头,我们可以从"a...z"
映射到[0 ... 25]
开始,然后按上面的方式进行:
'afm26b256b:c e# Prints encoded string.
'afm26b256b:c`"256b26b'af+" e# Prints encoded string with decoder.
最后,如果原始字符串只有几个唯一字符(在ASCII技术中很常见),那么通常最好显式地指定字母表。
例如:
" +-/\|"f#6b256b:c e# Prints encoded string.
" +-/\|"f#6b256b:c`"256b6b"" +-/\|"`"f=" e# Prints encoded string with decoder.
根据经验,您希望原始字符串的第一个字符是字母表的第二个字符,原始字符串的下一个不同字符是字母表的第一个字符,原始字符串的下一个不同字符是字母表的第三个字符,原始字符串的下一个不同字符是字母表的第四个字符,等等。
最后一个示例的编码器工作如下:
" +-/\|"f# e# Replace each character by its index in that string.
6b256b e# Convert from base 6 (length of the alphabet) to base 256.
:c e# Cast each digit to character.
最后一个示例的解码器工作如下:
256b6b e# Convert from base 256 to base 6.
" +-/\|"f= e# Replace each digit by the corresponding character of the alphabet.
发布于 2015-10-01 10:42:41
较大的Kolmogorov复杂问题有一定的结构,但没有简单的公式(如歌词),通常会受益于基于语法的方法。本质上,您可以提取重复的子字符串并以某种方式对它们进行编码。这就是Lempel-Ziv所做的,使用的语法类相当有限;如果您使用更通用的语法,那么您必须弄清楚如何对规则进行编码。例如,这里的一种方法是“偏移编码”,根据规则数(n
)对每个源字节进行偏移,将字节1
分配给规则n
,使用0
字节分隔规则,并反复用计算出的规则i
替换字节i
。最后,通过从每个字节中减去n
来撤消偏移量。
实际上,我有编写Java程序,它实现了各种方法:
大多数方法都遵循两个阶段的过程。在第一阶段,字符串被转换为生成字符串的语法;在第二阶段,语法被转换为GolfScript程序。第一阶段实现主要基于Charikar,Lehman,Liu,Panigrahy,Prabhakaran,Sahai,& Shelat (2005年) 最小语法问题,信息论,implementations,51(7),2554-2576。
它还包括Lempel-Ziv方法、基编码方法和游程编码方法,并识别出最短程序。
发布于 2019-05-16 17:37:40
https://codegolf.stackexchange.com/questions/59238
复制相似问题