53 lines
1.5 KiB
Text
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
|