TimeManager = {}
do
function TimeManager:new(o)
local o = o or {}
setmetatable(o, self)
self.__index = self
return o
end
function TimeManager:setTime(t)
if type(t) == 'table' then
self._selftime = (t[1] or 0) + (t[2] or 0) * 60 + (t[3] or 0) * 60 * 24
elseif type(t) == 'number' then
self._selftime = t
else
error('Wrong parameter!')
end
return self
end
function TimeManager:asNumber()
return self._selftime
end
function TimeManager:asAcademicNumber()
return self._selftime / 0.75
end
function TimeManager:asTime()
local tbl = {}
tbl[1] = math.floor(self._selftime % 60)
tbl[2] = math.floor(self._selftime / 60) % 24
tbl[3] = math.floor(math.floor(self._selftime / 60) / 24)
return tbl
end
function TimeManager:toStringFull()
local tbl = self:asTime()
d = tostring(tbl[3])
h = tostring(tbl[2])
m = tostring(tbl[1])
return form(d) .. ':' .. form(h) .. ':' .. form(m)
end
function TimeManager:toString()
local tbl = self:asTime()
h = tostring(tbl[2])
m = tostring(tbl[1])
return form(h) .. ':' .. form(m)
end
function TimeManager:addTime(t)
local mins = 0
if type(t) == 'table' then
mins = ((TimeManager:new()):setTime(t)):asNumber()
elseif type(t) == 'number' then
mins = t
else
error('Wrong parameter!')
end
self._selftime = self._selftime + mins
end
function TimeManager.__lt(op1, op2)
if tostring(op1) == 'TimeManager' and tostring(op2) == 'TimeManager' then
return op1._selftime < op2._selftime
elseif tostring(op1) == 'TimeManager' and type(op2) == 'number' then
return op1._selftime < op2
end
return false
end
function TimeManager.__gt(op1, op2)
if tostring(op1) == 'TimeManager' and tostring(op2) == 'TimeManager' then
return op1._selftime > op2._selftime
elseif tostring(op1) == 'TimeManager' and type(op2) == 'number' then
return op1._selftime > op2
end
return false
end
function TimeManager.__add(op1, op2)
local res = TimeManager:new()
if tostring(op1) == 'TimeManager' and tostring(op2) == 'TimeManager' then
res:setTime(op1:asNumber() + op2:asNumber())
elseif tostring(op1) == 'TimeManager' and type(op2) == 'number' then
res:setTime(op1:asNumber() + op2)
else
error('Wrong operands')
end
return res
end
function TimeManager.__sub(op1, op2)
local res = TimeManager:new()
if tostring(op1) == 'TimeManager' and tostring(op2) == 'TimeManager' then
res:setTime(op1:asNumber() - op2:asNumber())
elseif tostring(op1) == 'TimeManager' and type(op2) == 'number' then
res:setTime(op1:asNumber() - op2)
else
error('Wrong operands')
end
return res
end
function TimeManager.__tostring()
return "TimeManager"
end
function form(str)
return ((#str == 0) and '00' or ((#str == 1) and '0' or '')) .. str
end
function createManager(t)
local mng = TimeManager:new()
mng:setTime(t)
return mng
end
function timeToMin(t)
local mng = TimeManager:new()
mng:setTime(t)
return mng:asNumber()
end
function minToTime(t)
local mng = TimeManager:new()
mng:setTime(t)
return mng:asTime()
end
function mtToString(t)
local mng = TimeManager:new()
mng:setTime(t)
return mng:toString()
end
end
course = {
{"Brief", 15},
{"Java Technology", 15},
{"NetBeans Development + Exercise", 30},
{"Java Specials", 5 },
{"Primitive types and literals", 15},
{"Variables", 15},
{"------------Exercise", 30},
{"Operations", 10},
{"java.lang", 10},
{"------------Exercise", 30},
{"Strings", 10},
{"Arrays", 15},
{"------------Exercise", 30},
{"Input/Output", 15},
{"Branching", 15},
{"Cycles", 15},
{"------------Exercise", 30},
{"Methods", 15},
{"Reference Types", 5 },
{"------------Exercise", 30},
{"Class", 15},
{"------------Exercise", 30},
{"Encapsulation", 10},
{"Static Members", 10},
{"Enumerations", 10},
{"------------Exercise", 60},
{"Packages", 15},
{"Inheritance", 15},
{"Polymorphism", 15},
{"------------Exercise", 60},
{"Interfaces", 15},
{"Abstract classes", 10},
{"------------Exercise", 60},
{"Nested classes", 10},
{"Exceptions", 10},
{"Collections", 10},
{"------------Exercise", 60}
}
manager = TimeManager:new()
hours = timeToMin({0, 4});
cof_each = timeToMin({0, 2});
cof_max = 1
cof_time = 15;
start_time = timeToMin({0, 10})
delta_time = 0
do
local last_break = start_time
local cof_count = 0
local time_count = 0
local day_count = 1
manager:setTime(start_time)
print('---------' .. '[Day' .. day_count .. ']' .. '---------')
for _, v in pairs(course) do
if ((manager + (v[2] + (v[3] or 0) - delta_time)) - start_time):asNumber() > hours then
time_count = time_count + manager:asNumber() - start_time
manager:setTime(start_time)
cof_count = 0
last_break = start_time
--add new day separator
day_count = day_count + 1
print('---------' .. '[Day' .. day_count .. ']' .. '---------')
--add new day brief
print(manager:toString() .. " - " .. (manager + 10):toString() .. " " .. "New day Brief")
manager:addTime(10)
end
if (manager:asNumber() + v[2]) > last_break + cof_each and cof_count < cof_max then
print(manager:toString() .. " - " .. (manager + cof_time):toString() .. " " .. "Coffe break")
manager:addTime(cof_time)
last_break = manager:asNumber()
cof_count = cof_count + 1
end
if #v == 2 then
print(manager:toString() .. " - " .. (manager + v[2]):toString() .. " " .. v[1])
manager:addTime(v[2])
elseif #v == 3 then --for a case when table have additional exercise time
print(manager:toString() .. " - " .. (manager + v[2]):toString() .. " " .. v[1])
manager:addTime(v[2])
print(manager:toString() .. " – " .. (manager + v[3]):toString() .. " Exercise " .. v[1])
manager:addTime(v[3])
end
end
time_count = time_count + manager:asNumber() - start_time
print("Total hours: " .. mtToString(time_count))
end
Comments