64 lines
1.8 KiB
Text
64 lines
1.8 KiB
Text
$ include "seed7_05.s7i";
|
|
|
|
const func string: burrowsWheelerTransform (in string: stri) is func
|
|
result
|
|
var string: encoded is "";
|
|
local
|
|
var integer: length is 0;
|
|
var integer: index is 0;
|
|
var array string: rotations is 0 times "";
|
|
begin
|
|
length := succ(length(stri));
|
|
rotations := length times "";
|
|
for index range 1 to length do
|
|
rotations[index] := stri[index ..] & "\256;" & stri[.. pred(index)];
|
|
end for;
|
|
rotations := sort(rotations);
|
|
for index range 1 to length do
|
|
encoded &:= rotations[index][length];
|
|
end for;
|
|
end func;
|
|
|
|
const func string: inverseBurrowsWheelerTransform (in string: stri) is func
|
|
result
|
|
var string: decoded is "";
|
|
local
|
|
var integer: length is 0;
|
|
var integer: count is 0;
|
|
var integer: index is 0;
|
|
var array string: rotations is 0 times "";
|
|
begin
|
|
length := length(stri);
|
|
rotations := length times "";
|
|
for count range 1 to length do
|
|
for index range 1 to length do
|
|
rotations[index] := str(stri[index]) & rotations[index];
|
|
end for;
|
|
rotations := sort(rotations);
|
|
end for;
|
|
decoded := rotations[1];
|
|
index := pos(decoded, "\256;");
|
|
decoded := decoded[succ(index) ..] & decoded[.. pred(index)];
|
|
end func;
|
|
|
|
const proc: test(in string: stri) is func
|
|
local
|
|
var string: encoded is "";
|
|
var string: decoded is "";
|
|
begin
|
|
writeln;
|
|
writeln(" " <& stri);
|
|
encoded := burrowsWheelerTransform(stri);
|
|
writeln("---> " <& literal(encoded));
|
|
decoded := inverseBurrowsWheelerTransform(encoded);
|
|
writeln("---> " <& decoded);
|
|
end func;
|
|
|
|
const proc: main is func
|
|
begin
|
|
test("banana");
|
|
test("appellee");
|
|
test("dogwood");
|
|
test("TO BE OR NOT TO BE OR WANT TO BE OR NOT?");
|
|
test("SIX.MIXED.PIXIES.SIFT.SIXTY.PIXIE.DUST.BOXES");
|
|
end func;
|