Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
68
Task/Set/Lua/set-1.lua
Normal file
68
Task/Set/Lua/set-1.lua
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
function emptySet() return { } end
|
||||
function insert(set, item) set[item] = true end
|
||||
function remove(set, item) set[item] = nil end
|
||||
function member(set, item) return set[item] end
|
||||
function size(set)
|
||||
local result = 0
|
||||
for _ in pairs(set) do result = result + 1 end
|
||||
return result
|
||||
end
|
||||
function fromTable(tbl) -- ignore the keys of tbl
|
||||
local result = { }
|
||||
for _, val in pairs(tbl) do
|
||||
result[val] = true
|
||||
end
|
||||
return result
|
||||
end
|
||||
function toArray(set)
|
||||
local result = { }
|
||||
for key in pairs(set) do
|
||||
table.insert(result, key)
|
||||
end
|
||||
return result
|
||||
end
|
||||
function printSet(set)
|
||||
print(table.concat(toArray(set), ", "))
|
||||
end
|
||||
function union(setA, setB)
|
||||
local result = { }
|
||||
for key, _ in pairs(setA) do
|
||||
result[key] = true
|
||||
end
|
||||
for key, _ in pairs(setB) do
|
||||
result[key] = true
|
||||
end
|
||||
return result
|
||||
end
|
||||
function intersection(setA, setB)
|
||||
local result = { }
|
||||
for key, _ in pairs(setA) do
|
||||
if setB[key] then
|
||||
result[key] = true
|
||||
end
|
||||
end
|
||||
return result
|
||||
end
|
||||
function difference(setA, setB)
|
||||
local result = { }
|
||||
for key, _ in pairs(setA) do
|
||||
if not setB[key] then
|
||||
result[key] = true
|
||||
end
|
||||
end
|
||||
return result
|
||||
end
|
||||
function subset(setA, setB)
|
||||
for key, _ in pairs(setA) do
|
||||
if not setB[key] then
|
||||
return false
|
||||
end
|
||||
end
|
||||
return true
|
||||
end
|
||||
function properSubset(setA, setB)
|
||||
return subset(setA, setB) and (size(setA) ~= size(setB))
|
||||
end
|
||||
function equals(setA, setB)
|
||||
return subset(setA, setB) and (size(setA) == size(setB))
|
||||
end
|
||||
111
Task/Set/Lua/set-2.lua
Normal file
111
Task/Set/Lua/set-2.lua
Normal file
|
|
@ -0,0 +1,111 @@
|
|||
local function new(_, ...)
|
||||
local r = {}
|
||||
local s = setmetatable({}, {
|
||||
-- API operations
|
||||
__index = {
|
||||
|
||||
-- single value insertion
|
||||
insert = function(s, v)
|
||||
if not r[v] then
|
||||
table.insert(s, v)
|
||||
r[v] = #s
|
||||
end
|
||||
return s
|
||||
end,
|
||||
|
||||
-- single value removal
|
||||
remove = function(s, v)
|
||||
local i = r[v]
|
||||
if i then
|
||||
r[v] = nil
|
||||
local t = table.remove(s)
|
||||
if t ~= v then
|
||||
r[t] = i
|
||||
s[i] = t
|
||||
end
|
||||
end
|
||||
return s
|
||||
end,
|
||||
|
||||
-- multi-value insertion
|
||||
batch_insert = function(s, ...)
|
||||
for _,v in pairs {...} do
|
||||
s:insert(v)
|
||||
end
|
||||
return s
|
||||
end,
|
||||
|
||||
-- multi-value removal
|
||||
batch_remove = function(s, ...)
|
||||
for _,v in pairs {...} do
|
||||
s:remove(v)
|
||||
end
|
||||
return s
|
||||
end,
|
||||
|
||||
-- membership test
|
||||
has = function(s, e)
|
||||
return r[e] ~= nil
|
||||
end
|
||||
},
|
||||
|
||||
-- set manipulation operators
|
||||
|
||||
-- union
|
||||
__add = function(s1, s2)
|
||||
r = set()
|
||||
r:batch_insert(table.unpack(s1))
|
||||
r:batch_insert(table.unpack(s2))
|
||||
return r
|
||||
end,
|
||||
|
||||
-- subtraction
|
||||
__sub = function(s1, s2)
|
||||
r = set()
|
||||
r:batch_insert(table.unpack(s1))
|
||||
r:batch_remove(table.unpack(s2))
|
||||
return r
|
||||
end,
|
||||
|
||||
-- intersection
|
||||
__mul = function(s1, s2)
|
||||
r = set()
|
||||
for _,v in ipairs(s1) do
|
||||
if s2:has(v) then
|
||||
r:insert(v)
|
||||
end
|
||||
end
|
||||
return r
|
||||
end,
|
||||
|
||||
-- equality
|
||||
__eq = function(s1, s2)
|
||||
if #s1 ~= #s2 then return false end
|
||||
for _,v in ipairs(s1) do
|
||||
if not s2:has(v) then return false end
|
||||
end
|
||||
return true
|
||||
end,
|
||||
|
||||
-- proper subset
|
||||
__lt = function(s1, s2)
|
||||
if s1 == s2 then return false end
|
||||
for _,v in ipairs(s1) do
|
||||
if not s2:has(v) then return false end
|
||||
end
|
||||
return true
|
||||
end,
|
||||
|
||||
-- subset
|
||||
__lte = function(s1, s2)
|
||||
return (s1 == s2) or (s1 < s2)
|
||||
end,
|
||||
|
||||
-- metatable type tag
|
||||
__type__ = 'set'
|
||||
})
|
||||
s:batch_insert(...)
|
||||
return s
|
||||
end
|
||||
|
||||
return setmetatable({}, { __call = new })
|
||||
Loading…
Add table
Add a link
Reference in a new issue