对于总是需要字符串压缩的kolmogorov-complexity挑战,我始终未能给出答案,主要原因是我不知道我应该如何有效地使用字符串压缩工具。
因此,我已经发布了这个问题。与我的其他提示问题不同,这不是特定于语言的意思,也就是说,如果您可以用自己的语言想到任何提示,则可以将其发布(前提是您指定了语言)。一般提示也将不胜感激。
那么,如何使用字符串压缩工具发挥最大作用?
对于总是需要字符串压缩的kolmogorov-complexity挑战,我始终未能给出答案,主要原因是我不知道我应该如何有效地使用字符串压缩工具。
因此,我已经发布了这个问题。与我的其他提示问题不同,这不是特定于语言的意思,也就是说,如果您可以用自己的语言想到任何提示,则可以将其发布(前提是您指定了语言)。一般提示也将不胜感激。
那么,如何使用字符串压缩工具发挥最大作用?
Answers:
编码不以空字节开头的ASCII字符串的一种简单方法是将基数128转换为整数,然后转换为基数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.
具有某种结构但没有简单公式(例如歌曲歌词)的较大的Kolmogorov复杂性问题通常会从基于语法的方法中受益。本质上,您提取重复的子字符串并以某种方式对其进行编码。这就是Lempel-Ziv所做的,它使用了相当有限的语法。如果您使用更一般的语法,则必须弄清楚如何对规则进行编码。这里例如,一个方法是“偏置编码”,在这里通过的规则(数偏移每个源字节n
),字节分配1
到n
的规则,使用0
字节到单独的规则,并多次替换字节i
与所评估的规则i
。最后,通过n
从每个字节中减去来抵消偏移量。
我实际上已经编写了一个Java程序,该程序实现了各种方法:
大多数方法遵循两个阶段的过程。在第一阶段,字符串被转换成生成它的语法。在第二阶段,将语法转换为GolfScript程序。第一阶段的实现主要基于Charikar,Lehman,Liu,Panighay,Prabhakaran,Sahai和Shelat(2005)最小语法问题,信息论,IEEE Transactions,第51(7)页,第2554-2576页。
它还包括Lempel-Ziv方法,基本编码方法和游程长度编码方法,并标识出给出最短程序的方法。