A-M baby
This commit is contained in:
parent
764da6cbbb
commit
db842d013d
19005 changed files with 197040 additions and 7 deletions
37
Task/LZW-compression/Mathematica/lzw-compression.mathematica
Normal file
37
Task/LZW-compression/Mathematica/lzw-compression.mathematica
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
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[%]
|
||||
Loading…
Add table
Add a link
Reference in a new issue