aboutsummaryrefslogtreecommitdiff
path: root/03.lua
blob: 067723608a9872fed52eccb24c5edabe13f1937a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
local function parse_instruction (x, y, dont)
    if dont then return 'dont'
    elseif x then return {'mul', tonumber(x), tonumber(y)}
    else return 'do'
    end
end

local function input ()
    local line = ''
    local start, next_mul, next_do = 1, 0, 0
    return function ()
        while true do
            if next_mul and next_mul < start then
                next_mul = string.find(line, 'mul', start)
            end
            if next_do and next_do < start then
                next_do = string.find(line, 'do', start)
            end
            if next_mul and (not next_do or next_mul < next_do) then
                start = next_mul + 1
                local x, y = string.match(line, '^mul%((%d+),(%d+)%)', next_mul)
                if x then return 'mul', tonumber(x), tonumber(y) end
            elseif next_do and (not next_mul or next_do < next_mul) then
                start = next_do + 1
                if string.match(line, '^do%(%)', next_do) then
                    return 'do'
                elseif string.match(line, "^don't%(%)", next_do) then
                    return 'dont'
                end
            elseif not next_mul and not next_do then
                line = io.read '*l'
                if not line then return end
                start, next_mul, next_do = 1, 0, 0
            end
        end
    end
end

local funcs = {reader = input()}

function funcs:part1 ()
    local sum = 0
    for op, arg1, arg2 in self.reader do
        if op == 'mul' then sum = sum + arg1 * arg2 end
    end
    print(sum)
end

function funcs:part2()
    local sum = 0
    local enabled = true
    for op, arg1, arg2 in self.reader do
        print(op, arg1, arg2)
        if op == 'do' then
            enabled = true
        elseif op == 'dont' then
            enabled = false
        elseif op == 'mul' then
            if enabled then sum = sum + arg1 * arg2 end
        end
    end
    print(sum)
end

return funcs