RosettaCodeData/Task/Move-to-front-algorithm/Pluto/move-to-front-algorithm.pluto
2026-04-30 12:34:36 -04:00

53 lines
1.5 KiB
Text

local fmt = require "fmt"
require "table2"
local function encode(s)
if s == "" then return {} end
local symbols = "abcdefghijklmnopqrstuvwxyz":split("")
local result = table.rep(#s, 0)
for i = 1, #s do
local c = s[i]
local index = symbols:findindex(|ch| -> ch == c)
if !index then error($"{s} contains a non-alphabetic character") end
result[i] = index
if index > 1 then
for k = index - 1, 1, -1 do symbols[k + 1] = symbols[k] end
symbols[1] = c
end
end
return result
end
local function decode(a)
if #a == 0 then return "" end
local symbols = "abcdefghijklmnopqrstuvwxyz":split("")
local result = table.rep(#a, "")
local i = 1
for a as n do
if n < 1 or n > 26 then error($"{fmt.format("%,s", a)} contains an invalid number") end
result[i] = symbols[n]
if n > 1 then
for j = n - 1, 1, -1 do symbols[j + 1] = symbols[j] end
symbols[1] = result[i]
end
i += 1
end
return result:concat("")
end
local strings = {"broood", "bananaaa", "hiphophiphop"}
local encoded = table.create(#strings)
for i, s in strings do
encoded[i] = encode(s)
fmt.print("%-12s -> %,s", s, encoded[i])
end
print()
local decoded = table.create(#encoded)
i = 1
for encoded as a do
decoded[i] = decode(a)
local correct = (decoded[i] == strings[i]) ? "correct" : "incorrect"
fmt.print("%,-38s -> %-12s -> %s", a, decoded[i], correct)
i += 1
end