aboutsummaryrefslogtreecommitdiff
path: root/16/1.lua
blob: ce96b28666cf9587adabbc380c146277441b2830 (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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
function read_matrix(filename)
    local fp = io.open(filename, 'r')
    local lines = {}
    while true do
        local line = fp:read()
        if (not line) or #line == 0 then break end
        table.insert(lines, line)
    end
    return lines
end

local layout = read_matrix('input')
local height = #layout
local width = #layout[1]

local trace_set = {}
local active_set = {}
local count = 0

function trace(layout, x, y, direction)
    if x < 1 or x > width then return nil end
    if y < 1 or y > width then return nil end

    trace_key = x..','..y..','..direction
    if trace_set[trace_key] == nil then
        trace_set[trace_key] = 1
    else 
        return nil
    end
    
    if active_set[x..','..y] == nil then
        active_set[x..','..y] = 1
        count = count + 1
    end
    -- trace next
    local cur = layout[y]:sub(x,x)
    if cur == '.' then
        if direction == 'E' then
            trace(layout, x+1, y, direction)
        elseif direction == 'W' then
            trace(layout, x-1, y, direction)
        elseif direction == 'N' then
            trace(layout, x, y-1, direction)
        elseif direction == 'S' then
            trace(layout, x, y+1, direction)
        end
    elseif cur == '-' then
        if direction == 'E' then
            trace(layout, x+1, y, direction)
        elseif direction == 'W' then
            trace(layout, x-1, y, direction)
        elseif direction == 'N' or direction == 'S' then
            trace(layout, x+1, y, 'E')
            trace(layout, x-1, y, 'W')
        end
    elseif cur == '|' then
        if direction == 'E' or direction == 'W' then
            trace(layout, x, y-1, 'N')
            trace(layout, x, y+1, 'S')
        elseif direction == 'N' then
            trace(layout, x, y-1, direction)
        elseif direction == 'S' then
            trace(layout, x, y+1, direction)
        end
    elseif cur == '/' then
        if direction == 'E' then
            trace(layout, x, y-1, 'N')
        elseif direction == 'W' then
            trace(layout, x, y+1, 'S')
        elseif direction == 'N' then
            trace(layout, x+1, y, 'E')
        elseif direction == 'S' then
            trace(layout, x-1, y, 'W')
        end
    elseif cur == '\\' then
        if direction == 'E' then
            trace(layout, x, y+1, 'S')
        elseif direction == 'W' then
            trace(layout, x, y-1, 'N')
        elseif direction == 'N' then
            trace(layout, x-1, y, 'W')
        elseif direction == 'S' then
            trace(layout, x+1, y, 'E')
        end
    end
end

trace(layout, 1, 1, 'E')
print(count)