38 lines
1.1 KiB
Plaintext
38 lines
1.1 KiB
Plaintext
compress[uncompressed_] :=
|
|
Module[{dictsize, dictionary, w, result, wc},
|
|
dictsize = 256;
|
|
dictionary = # -> # & /@ FromCharacterCode /@ Range@dictsize;
|
|
w = "";
|
|
result = {};
|
|
Do[wc = w <> c;
|
|
If[MemberQ[dictionary[[All, 1]], wc],
|
|
w = wc,
|
|
AppendTo[result, w /. dictionary];
|
|
AppendTo[dictionary, wc -> dictsize];
|
|
dictsize++;
|
|
w = c],
|
|
{c, Characters[uncompressed]}];
|
|
AppendTo[result, w /. dictionary];
|
|
result];
|
|
decompress::bc = "Bad compressed `1`";
|
|
decompress[compressed_] :=
|
|
Module[{dictsize, dictionary, w, result, entry},
|
|
dictsize = 256;
|
|
dictionary = # -> # & /@ FromCharacterCode /@ Range@dictsize;
|
|
w = result = compressed[[1]];
|
|
Do[Which[MemberQ[dictionary[[All, 1]], k],
|
|
entry = k /. dictionary,
|
|
k == dictsize,
|
|
entry = w <> StringTake[w, 1],
|
|
True,
|
|
Message[decompress::bc, k]];
|
|
result = result <> entry;
|
|
AppendTo[dictionary, dictsize -> w <> StringTake[entry, 1]];
|
|
dictsize++;
|
|
w = entry,
|
|
{k, compressed[[2 ;;]]}];
|
|
result];
|
|
(*How to use:*)
|
|
compress["TOBEORNOTTOBEORTOBEORNOT"]
|
|
decompress[%]
|