--[[
-- returns a value between 0 and 1
function iconDiff_arrays(i1, i2)
local w, h = #i1[1], #i1
if w ~= #i2[1] or h ~= #i2 then
error("iconDiff: Icon size mismatch")
end
local count, sum = w*h, 0
for y = 1, h do
local l1, l2 = i1[y], i2[y]
for x = 1, w do
local diff = math.abs(string.byte(l1, x)-string.byte(l2, x))
sum = sum+diff
end
end
return sum/count
end
]]
function iconDiff(i1, i2)
local l = #i1
if l ~= #i2 then
error("iconDiff: Icon size mismatch ("..#i1.."/"..#i2..")")
end
local count, sum = 0, 0
for i = 1, l do
local c1, c2 = string.byte(i1, i), string.byte(i2, i)
if (c1 == 46) ~= (c2 == 46) then
error("iconDiff: Icon size mismatch")
end
if c1 ~= 46 then
sum, count = sum+math.abs(c1-c2), count+1
end
end
return sum/25/count
end
-- limit = the maximum diff we are interested in
-- (nil is returned when diff is equal or greater than the limit)
-- w = width and height of the icons
function iconDiffWithLimit_verbose(i1, i2, limit, w, h, verbose)
assert(type(limit) == 'number')
assert(type(w) == 'number')
assert(type(h) == 'number')
if limit == 0 then return nil end
local l = #i1
if l ~= #i2 then
error("iconDiff: Icon size mismatch")
end
local count, sum = w*h, 0
limit = limit*count*25
for i = 1, l do
local c1, c2 = string.sub(i1, i, i), string.sub(i2, i, i)
if verbose then
print("c1", c1, "c2", c2, "sum", sum)
end
if (c1 == '.') ~= (c2 == '.') then
error("iconDiff: Icon size mismatch")
end
if c1 ~= '.' then
local diff = math.abs(string.byte(c1)-string.byte(c2))
sum = sum+diff
if sum >= limit then return nil end
end
end
return sum/25/count
end
-- limit = the maximum diff we are interested in
-- (nil is returned when diff is equal or greater than the limit)
-- w = width and height of the icons
function iconDiffWithLimit(i1, i2, limit, w, h)
assert(type(limit) == 'number')
assert(type(w) == 'number')
assert(type(h) == 'number')
if limit == 0 then return nil end
local l = #i1
if l ~= #i2 then
error("iconDiff: Icon size mismatch")
end
local count, sum = w*h, 0
limit = limit*count*25
for i = 1, l do
local c1, c2 = string.byte(i1, i), string.byte(i2, i)
if (c1 == 46) ~= (c2 == 46) then -- 46 is '.'
error("iconDiff: Icon size mismatch")
end
if c1 ~= 46 then
sum = sum+math.abs(c1-c2)
if sum >= limit then return nil end
end
end
return sum/25/count
endtest run test run with input download show line numbers
Travelled to 12 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment