Data commit

This commit is contained in:
Ingy döt Net 2023-07-01 11:58:00 -04:00
parent 7387c8f97b
commit cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions

68
Task/Set/Lua/set-1.lua Normal file
View 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
View 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 })