Pushok icon

course

Pushok | PRO | 07/29/15 10:32:23 AM UTC | 0 ⭐ | 751 👁️ | Never ⏰ | []
Lua |

6.16 KB

|

None

|

0 👍

/

0 👎

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