[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: [FUN] Compress number in 2 bytes
- From: Xmilia Hermit <xmilia.hermit@...>
- Date: Fri, 2 Jul 2021 23:44:13 +0200
How about:
-- compressor.lua
local num_bits = 64
local function Encode(what)
local tab = {}
for i = 1, num_bits do
if what & (1 << (i - 1)) ~= 0 then
tab[i + 0.5] = true
end
end
for k, v in pairs(tab) do
tab[k] = nil
end
return tab
end
return Encode(...)
-- decompressor.lua
local num_bits = 64
function Decode(tab)
local num = 0
for i = 1, num_bits do
if pcall(next, tab, i + 0.5) then
num = num | (1 << (i - 1))
end
end
return num
end
return Decode(...)
It is simpler, smaller, uses less memory.
And another one using callbacks via __gc metamethod:
-- compressor.lua
local function Encode(what)
local tab = {}
local function gc()
if not tab.pass then
setmetatable({}, {__gc = gc})
else
tab.res = what
end
end
gc()
return tab
end
return Encode(...)
-- decompressor.lua
local function ForceGC()
local gc = false
setmetatable({}, {__gc = function() gc = true end})
local mem = {}
while not gc do
mem = {mem}
end
end
local function Decode(tab)
tab.pass = true
ForceGC()
return tab.res
end
return Decode(...)
Regards,
Xmilia