aboutsummaryrefslogtreecommitdiff
path: root/16
diff options
context:
space:
mode:
Diffstat (limited to '16')
-rw-r--r--16/1.lua89
1 files changed, 89 insertions, 0 deletions
diff --git a/16/1.lua b/16/1.lua
new file mode 100644
index 0000000..f136da8
--- /dev/null
+++ b/16/1.lua
@@ -0,0 +1,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) \ No newline at end of file