RosettaCodeData/Task/Symmetric-difference/Lua/symmetric-difference-2.lua

57 lines
1.8 KiB
Lua
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

SetPrototype = {
__index = {
union = function(self, other)
local res = Set{}
for k in pairs(self) do res[k] = true end
for k in pairs(other) do res[k] = true end
return res
end,
intersection = function(self, other)
local res = Set{}
for k in pairs(self) do res[k] = other[k] end
return res
end,
difference = function(self, other)
local res = Set{}
for k in pairs(self) do
if not other[k] then res[k] = true end
end
return res
end,
symmetric_difference = function(self, other)
return self:difference(other):union(other:difference(self))
end
},
-- return string representation of set
__tostring = function(self)
-- list to collect all elements from the set
local l = {}
for k in pairs(self) do l[#l+1] = k end
return "{" .. table.concat(l, ", ") .. "}"
end,
-- allow concatenation with other types to yield string
__concat = function(a, b)
return (type(a) == 'string' and a or tostring(a)) ..
(type(b) == 'string' and b or tostring(b))
end
}
function Set(items)
local _set = {}
setmetatable(_set, SetPrototype)
for _, item in ipairs(items) do _set[item] = true end
return _set
end
A = Set{"John", "Serena", "Bob", "Mary", "Serena"}
B = Set{"Jim", "Mary", "John", "Jim", "Bob"}
print("Set A: " .. A)
print("Set B: " .. B)
print("\nSymm. difference (A\\B)(B\\A): " .. A:symmetric_difference(B))
print("Union AB : " .. A:union(B))
print("Intersection A∩B : " .. A:intersection(B))
print("Difference A\\B : " .. A:difference(B))
print("Difference B\\A : " .. B:difference(A))