23 lines
780 B
Plaintext
23 lines
780 B
Plaintext
ClearAll[BurrowWheeler, InverseBurrowWheeler]
|
|
BurrowWheeler[sin_String, {bdelim_, edelim_}] := Module[{s},
|
|
s = Characters[bdelim <> sin <> edelim];
|
|
s = RotateLeft[s, #] & /@ Range[Length[s]];
|
|
StringJoin[LexicographicSort[s][[All, -1]]]
|
|
]
|
|
InverseBurrowWheeler[sin_String, {bdelim_, edelim_}] := Module[{s, chars},
|
|
chars = Characters[sin];
|
|
s = ConstantArray[{}, Length[chars]];
|
|
Do[
|
|
s = LexicographicSort[MapThread[Prepend, {s, chars}]];
|
|
,
|
|
{Length[chars]}
|
|
];
|
|
StringTake[StringJoin[SelectFirst[s, Last /* EqualTo[edelim]]], {2, -2}]
|
|
]
|
|
BurrowWheeler["BANANA", {"^", "|"}]
|
|
InverseBurrowWheeler[%, {"^", "|"}]
|
|
BurrowWheeler["appellee", {"^", "|"}]
|
|
InverseBurrowWheeler[%, {"^", "|"}]
|
|
BurrowWheeler["dogwood", {"^", "|"}]
|
|
InverseBurrowWheeler[%, {"^", "|"}]
|