Burrows–Wheeler transform: Difference between revisions

julia example
(julia example)
Line 447:
TEXYDST.E.IXIXIXXSSMPPS.B..E.^.UESFXDIIOIIIT|S
SIX.MIXED.PIXIES.SIFT.SIXTY.PIXIE.DUST.BOXES
</pre>
 
=={{header|Julia}}==
<lang julia>bwsort(vec) = sort(vec, lt = (a, b) -> string(a) < string(b))
 
function burrowswheeler_encode(s)
if match(r"\x02|\x03", s) != nothing
throw("String for Burrows-Wheeler input cannot contain STX or ETX")
end
s = "\x02" * s * "\x03"
String([t[end] for t in bwsort([circshift([c for c in s], n) for n in 0:length(s)-1])])
end
function burrowswheeler_decode(s)
len, v = length(s), [c for c in s]
m = fill(' ', len, len)
for col in len:-1:1
m[:, col] .= v
for (i, row) in enumerate(bwsort([collect(r) for r in eachrow(m)]))
m[i, :] .= row
end
end
String(m[findfirst(row -> m[row, end] == '\x03', 1:len), 2:end-1])
end
 
for s in ["BANANA", "dogwood", "SIX.MIXED.PIXIES.SIFT.SIXTY.PIXIE.DUST.BOXES",
"TO BE OR NOT TO BE OR WANT TO BE OR NOT?", "Oops\x02"]
println("Original: ", s, "\nTransformed: ", burrowswheeler_encode(s),
"\nInverse transformed: ", burrowswheeler_decode(burrowswheeler_encode(s)), "\n")
end
</lang>{{out}}
<pre>
Original: BANANA
Transformed: BNN�AA�A
Inverse transformed: BANANA
 
Original: dogwood
Transformed: �do�oodwg
Inverse transformed: dogwood
 
Original: SIX.MIXED.PIXIES.SIFT.SIXTY.PIXIE.DUST.BOXES
Transformed: TEXYDST.E.IXIXIXXSSMPPS.B..E.�.UESFXDIIOIIIT�S
Inverse transformed: SIX.MIXED.PIXIES.SIFT.SIXTY.PIXIE.DUST.BOXES
 
Original: TO BE OR NOT TO BE OR WANT TO BE OR NOT
Transformed: OOORREEETTRW BBB ATTT NNOOONO� O �T
Inverse transformed: TO BE OR NOT TO BE OR WANT TO BE OR NOT
 
ERROR: LoadError: "String for Burrows-Wheeler input cannot contain STX or ETX"
</pre>
 
4,107

edits