Burrows–Wheeler transform: Difference between revisions

Content added Content deleted
(Added solution for Pascal (Lazarus))
Line 1,120: Line 1,120:
-->
-->
</pre>
</pre>

=={{header|Lua}}==
{{trans|Java}}
<lang lua>STX = string.char(tonumber(2,16))
ETX = string.char(tonumber(3,16))

function bwt(s)
if s:find(STX, 1, true) then
error("String cannot contain STX")
end
if s:find(ETX, 1, true) then
error("String cannot contain ETX")
end

local ss = STX .. s .. ETX
local tbl = {}
for i=1,#ss do
local before = ss:sub(i + 1)
local after = ss:sub(1, i)
table.insert(tbl, before .. after)
end

table.sort(tbl)

local sb = ""
for _,v in pairs(tbl) do
sb = sb .. string.sub(v, #v, #v)
end

return sb
end

function ibwt(r)
local le = #r
local tbl = {}

for i=1,le do
table.insert(tbl, "")
end
for j=1,le do
for i=1,le do
tbl[i] = r:sub(i,i) .. tbl[i]
end
table.sort(tbl)
end

for _,row in pairs(tbl) do
if row:sub(le,le) == ETX then
return row:sub(2, le - 1)
end
end

return ""
end

function makePrintable(s)
local a = s:gsub(STX, '^')
local b = a:gsub(ETX, '|')
return b
end

function main()
local tests = {
"banana",
"appellee",
"dogwood",
"TO BE OR NOT TO BE OR WANT TO BE OR NOT?",
"SIX.MIXED.PIXIES.SIFT.SIXTY.PIXIE.DUST.BOXES",
STX .. "ABC" .. ETX
}

for _,test in pairs(tests) do
print(makePrintable(test))
io.write(" --> ")
local t = ""
if xpcall(
function () t = bwt(test) end,
function (err) print("ERROR: " .. err) end
) then
print(makePrintable(t))
end
local r = ibwt(t)
print(" --> " .. r)
print()
end
end

main()</lang>
{{out}}
<pre>banana
--> |annb^aa
--> banana

appellee
--> |e^elplepa
--> appellee

dogwood
--> |do^oodwg
--> dogwood

TO BE OR NOT TO BE OR WANT TO BE OR NOT?
--> |?OOORREEETTRTW BBB ATTT NNOOONOO^
--> TO BE OR NOT TO BE OR WANT TO BE OR NOT?

SIX.MIXED.PIXIES.SIFT.SIXTY.PIXIE.DUST.BOXES
--> |STEXYDST.E.IXXIIXXSSMPPS.B..EE.^.USFXDIIOIIIT
--> SIX.MIXED.PIXIES.SIFT.SIXTY.PIXIE.DUST.BOXES

^ABC|
--> ERROR: bwt.lua:6: String cannot contain STX
--></pre>


=={{header|Pascal}}==
=={{header|Pascal}}==