高尔夫球弦


22

对于总是需要字符串压缩的挑战,我始终未能给出答案,主要原因是我不知道我应该如何有效地使用字符串压缩工具。

因此,我已经发布了这个问题。与我的其他提示问题不同,这不是特定于语言的意思,也就是说,如果您可以用自己的语言想到任何提示,则可以将其发布(前提是您指定了语言)。一般提示也将不胜感激。

那么,如何使用字符串压缩工具发挥最大作用?

Answers:


9

基本转换(CJam)

编码不以空字节开头的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.

2
我会更具体:根据经验,您希望原始字符串的第一个字符是字母的第二个字符,原始字符串的下一个不同字符是字母的第一个字符,...
彼得·泰勒

@PeterTaylor添加了。谢谢!
丹尼斯,2015年

9

具有某种结构但没有简单公式(例如歌曲歌词)的较大的Kolmogorov复杂性问题通常会从基于语法的方法中受益。本质上,您提取重复的子字符串并以某种方式对其进行编码。这就是Lempel-Ziv所做的,它使用了相当有限的语法。如果您使用更一般的语法,则必须弄清楚如何对规则进行编码。这里例如,一个方法是“偏置编码”,在这里通过的规则(数偏移每个源字节n),字节分配1n的规则,使用0字节到单独的规则,并多次替换字节i与所评估的规则i。最后,通过n从每个字节中减去来抵消偏移量。

我实际上已经编写了一个Java程序,该程序实现了各种方法:

大多数方法遵循两个阶段的过程。在第一阶段,字符串被转换成生成它的语法。在第二阶段,将语法转换为GolfScript程序。第一阶段的实现主要基于Charikar,Lehman,Liu,Panighay,Prabhakaran,Sahai和Shelat(2005)最小语法问题,信息论,IEEE Transactions,第51(7)页,第2554-2576页。

它还包括Lempel-Ziv方法,基本编码方法和游程长度编码方法,并标识出给出最短程序的方法。


0

萨克斯

Stax代码高尔夫语言中,有一个有用的小工具,叫做字符串文字压缩器。我不知道它是如何工作的,但是我确实知道它是如何工作的。它将字符串转换为数字,然后转换为Base256。它是CP437,其中0x00和0xFF被转换以进行复制。它是PackedStax。您可以使用字符串文字压缩程序转换字符串,然后打包以进行一些良好的压缩。

使用此过程,可以将字符串“此字符串为32个字节”转换为v *“ A]-| W4]} 3”%(压缩字符串通常用反引号括起来,以区分Stax中正常字符串与普通字符串之间的区别),最后传送到üvìë!! [┴影院qJu←▓α]进行压缩/减少18个字节,超过一半。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.