文字列圧縮を必要とするkolmogorov-complexityの課題に対する答えを出すことができませんでした。主な理由は、文字列圧縮ツールを必要以上に効果的に使用することを知らないためです。
このため、この質問を投稿しました。私の他のヒントの質問とは異なり、これは言語固有の意味ではありません。自分の言語でヒントを考えることができる場合は、投稿することができます(言語を指定する場合)。一般的なヒントも歓迎します。
それでは、文字列圧縮ツールを最大限に有効に使用するにはどうすればよいですか?
文字列圧縮を必要とするkolmogorov-complexityの課題に対する答えを出すことができませんでした。主な理由は、文字列圧縮ツールを必要以上に効果的に使用することを知らないためです。
このため、この質問を投稿しました。私の他のヒントの質問とは異なり、これは言語固有の意味ではありません。自分の言語でヒントを考えることができる場合は、投稿することができます(言語を指定する場合)。一般的なヒントも歓迎します。
それでは、文字列圧縮ツールを最大限に有効に使用するにはどうすればよいですか?
回答:
nullバイトで始まらないASCII文字列をエンコードする簡単な方法は、ベース128から整数に変換してから、ベース256に変換することです。
128b256b:c e# Prints encoded string.
128b256b:c`"256b128b:c" e# Prints encoded string with decoder.
これは、各ASCII文字をエンコードするために7ビットを使用します。
元の文字列が、たとえば小文字のみで構成され、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.
経験則として、元の文字列の最初の文字をアルファベットの2番目の文字、元の文字列の次の明確な文字をアルファベットの最初の文字、元の文字列の次の明確な文字をアルファベットの3番目の文字、元の文字列の次の別個の文字、アルファベットの4番目の文字など
最後の例のエンコーダは次のように機能します。
" +-/\|"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.
いくつかの構造を持つ単純な式(歌の歌詞など)のないコルモゴロフの複雑さの質問は、通常、文法ベースのアプローチの恩恵を受けます。本質的に、繰り返し部分文字列を抽出し、何らかの方法でエンコードします。これは、かなり制限されたクラスの文法を使用して、Lempel-Zivが行うことです。より一般的な文法を使用する場合は、ルールをエンコードする方法を理解する必要があります。たとえば、ここでの1つのアプローチは「オフセットエンコーディング」です。各ソースバイトをルールの数だけオフセットし(n
)、バイト1
をn
ルールに割り当て、0
バイトを使用してルールを分離i
し、評価済みのルールでバイトを繰り返し置き換えますi
。最後にn
、各バイトから減算してオフセットを元に戻します。
実際に、さまざまなアプローチを実装するJavaプログラムを作成しました。
ほとんどのアプローチは2段階のプロセスに従います。最初の段階で、文字列はそれを生成する文法に変換されます。2番目のフェーズでは、文法がGolfScriptプログラムに変換されます。最初のフェーズの実装は、主に、Charikar、Lehman、Liu、Panigrahy、Prabhakaran、Sahai、およびShelat(2005)最小文法問題、情報理論、IEEE Transactions on、51(7)、2554-2576に基づいています。
また、Lempel-Zivアプローチ、ベースエンコーディングアプローチ、およびランレングスエンコーディングアプローチも含まれており、最短のプログラムを提供するアプローチを特定します。
ではスタックスのコードゴルフの言語と呼ばれる有用な小さなツールがあります文字列リテラルコンプレッサーが。私はそれがどのように機能するか正確には知りませんが、私はそれがどのように機能するかを知っている別のものがあります。文字列を数値に変換し、次にBase 256に変換します。CP437で、コピー用に0x00と0xFFが変換されます。PackedStaxです。文字列リテラルコンプレッサーで文字列を変換してからパックすると、圧縮率が向上します。
このプロセスを使用すると、「この文字列は32バイトです」という文字列をv * "A]-| W4]} 3"%に変換できます(通常、圧縮文字列は、Staxの通常の文字列と)そして最後にüvìë![┴╩qJu←▓αを使用して、半分以上の18バイトの圧縮/縮小を行います。