~mcf/adventofcode

ee53500c9baafe0dd79195a1dd0d9505a25c50d7 — Michael Forney 11 months ago 8e26895
Day 16
3 files changed, 177 insertions(+), 1 deletions(-)

A 2023/16.lua
A 2023/16.txt
M 2023/Makefile
A 2023/16.lua => 2023/16.lua +66 -0
@@ 0,0 1,66 @@
local L, R, U, D, P, N, H, V = 0, 1, 2, 3, string.byte('/\\-|', 1, -1)
local grid, size = {}
io.input(arg[1])
for line in io.lines() do
	table.insert(grid, line)
end
size = #grid

local edge = {}
local function run(x, y, d)
	if edge[x | y << 15] then return 0 end
	local stack, len, count, seen = {x | y << 15 | d << 30}, 1, 0, {}
	while len > 0 do
		local p
		p, len = stack[len], len - 1
		local x, y, d = p & 0x7fff, p >> 15 & 0x7fff, p >> 30
		if d == L then x = x - 1
		elseif d == R then x = x + 1
		elseif d == U then y = y - 1
		else y = y + 1
		end
		p = x | y << 15
		if x >= 1 and x <= size and y >= 1 and y <= size then
			local v, a = seen[p], 1 << d
			if not v then count, v = count + 1, 0 end
			if v & a == 0 then
				seen[p] = v | a
				local c = string.byte(grid[y], x)
				if c == P then
					if v & 6 == 0 or v & 9 == 0 then
						len = len + 1
						stack[len] = p | (d ~ 3) << 30
					end
				elseif c == N then
					if v & 10 == 0 or v & 5 == 0 then
						len = len + 1
						stack[len] = p | (d ~ 2) << 30
					end
				elseif c == V and d & 2 == 0 then
					if v == 0 then
						len = len + 2
						stack[len - 1], stack[len] = p | U << 30, p | D << 30
					end
				elseif c == H and d & 2 ~= 0 then
					if v == 0 then
						len = len + 2
						stack[len - 1], stack[len] = p | L << 30, p | R << 30
					end
				else
					if v & 5 | v >> 1 & 5 ~= 5 then
						len = len + 1
						stack[len] = p | d << 30
					end
				end
			end
		else
			edge[p] = true
		end
	end
	return count
end
local ans1, ans2 = run(0, 1, R), 0
for i = 1, size do
	ans2 = math.max(ans2, run(0, i, R), run(size + 1, i, L), run(i, 0, D), run(i, size + 1, U))
end
print(ans1, ans2)

A 2023/16.txt => 2023/16.txt +110 -0
@@ 0,0 1,110 @@
\....../..-......-.\.........\.......................-....../......../....................................|...
......\../../.....\-................../...........|................-../.............-./........|.|............
..-...-..../..............................-..............\.........-../...........................-.\.......\.
............./-..........|..............\/.................../........../............\.......|................
....|.....\.../...|..............\/..|-.................-..........\.\........................\...............
...........\...........-..|..../..\.-|........................-/.|/....../.........\.....|................/...
./....-|./.......|......-...-............-.......-......................................../....-............\.
....\...........|............-............-..\..|...|.........-..||.................\/...........|-|.|-.......
-............................-....................|........-...............\..................\...............
...............\......................-....../......|..||.|.-........................./......-............\...
.-...|........-.......|.........|....|.....-.........|..|............................./.../\...-........\.....
....................../...........-......-..--.|-...............-....................\......\.................
-....................-......-......./.......\|./......./........|...........|..................|..............
..-............../....................|.............-.......-.................-..................\......\.|...
....................\...............................................|.....\................../..-/............
...-.-/...\.//...|.............|........................\.............-|..|...........--..\........./...\.....
....................................................................\..........-......................-/......
..................................\......-.....-...........-.............-...........\...................|...-
......................\........|../..............-.........../......-...|......../.\......./..||..............
................................/......-................................./.........-......\./......|..........
........../....../....\.\|......-..............................\.....................--......|.............\..
..-.................-............../\............|.......................................\...|....\...........
./................\.|....\.........................../................|..............-....-..../..............
../...........\.\/./........\........-\...-/...........-............../........................|..............
......\.||.....................|..................\..............|........../......\/........../.....-........
..|/...........\.....|../.......\...........-.............|..............-........|...............-.....|.....
....................../.....-..|.......-...-...|.....................|./...\.........-........................
......................../........../\../.........-...\........./...............................|..\...........
.......................|\............./...|...............\/-...............|........................../..\...
..|....-.......\..................................\................................|......../.|..............-
........../...\.\........-......|.\.|.....................-............/..\..........|.../...-.............../
..\.-..............-............/..-..\..............\.........\....../...|........|........\....../..........
.....................|........................../..|....|.-.../........................-.\../-................
./..........-....|......|.|.................-....|........\......|............../.........................../.
....-..................................................................................-............|..-....//
......./...-.......................-..-.........-.............|........................../....................
.-...................-.......................................|.......-.................../..\...............\|
.........|.\......-.....\............./-....................../.........-..|....|......-......................
......./............./..........-......-......\...................................../............/..\.........
.....\......-................................/..........|.............\........\............/.................
......../..............\.........................|..........\......-............\.....|.....\....|...\|....-..
.....\.......\/................/...\.......|./......|............\./..........|/.....\\..\...\...|..-.........
..................|.....................-..........\....................../...../..............|......../..../
........./...........|....-..\.....................--..|......|...\|.......|...............|...-.||...........
..............-.....\...|...|./...|..........-......../......./..........-...../..|........../................
..|.../...................................|...................|......./..-.....-..............-...............
...-.........../..................-..........|.........................\..-................//\............/...
|...............\.........\.../.....................|.....-........................\...........-../.-......-..
........//..........-......................-....\...-.......-./.../......../........./...........|.|..........
...................\..../...../...|........--.....\../..........|...........................|.\...............
.\......................-........|\.....\....|.........\...............|.......\...-...|.................-....
.....................|......./..-........................../......-.........../........................../....
--.............\..........\-..../..-........\....-..........|./....|.\.................-..--.....\../.........
.......|........../|...................|.................\..-..........\../....|\.....|...-.......\..-........
........../|.|.....\....................|\..\...........-............./.......|.\.............................
...........|..........-..............|.....|-................/.........|..../.........................-.......
......-..........................|............-.......|/...-....--/................/..-.........|.............
......../.-.............|....\.../............................|.|.....|....../...............\............./..
........./.......\..........\...........\.....\..|....-...../........./........................./..|..........
...|...|........\.......-.......\..................\....................../............-...|.........\........
.........-...........|.........\....................../..........-.....\|.\...................\...............
.....|..........|................................../......................|............/.....|.........|..-|..
.../.......\....//....../....\....../..........\........................./....................\....-.../......
/.......\..\...........\................-|............/...-|.|...-..........\.................\.....|.../.....
.....-\.........|....../.......\.............-..........................\...........................\.........
.|.............|................\....\...........-................./............./............................
./...|\...........-\....................\..............-....|....|..........-.........|.../.....-.....\.\.....
....-...............|........-............./.....\....../..\.|.....|./.\......-...........\....../.\.......\..
..........\.....\................../......|.\..../.\..-......-.........-............/....\...................\
..\.........|.....\..........\............./...-....../....|.......-|\-............................../........
..|...\/........\..-\.|.\......./.....|.........-..|........|......................|..........................
............|..........................--.-....\..............-................................|...|..........
.-............../.....................|........../.................-....../.-...........................\-....
.-.........................-......|-./\.........................\.....|.................|......|..\.......\...
.....\...|....-......................................-...............\...........\..\...\..-|.....\...........
|...........|................|.........-............|....................|............-..-.............../....
.................../.|...........\.......\....|......-..|.....................\...................|..\.....\..
.|........-.../...|....../...|......|.|.|..-......\............../....|...........\|.......|.......\\.........
.......|.....-..-.-./....-/\.|./.............|.../......\...|/............/........./...-..........|\.\.......
..|.........-....\.........\.......\....-................|-..........................-.|............|.........
......-..\......|..\.../......\|..........|............../........../............/..\........................|
|/.|................../....|............../..........-........-............................|.\................
........|.....|/................../....\....../....../...................--..............\/..\................
.../-..........................|...-.........-.................\\.......-\.........\..|.....|.................
-./...-.....-....................../.../........./........-........../.........-...........\..................
.\../............|.\..........-.................................\.............../............../.........\./..
...-.....-......-......../.\...\................\...........|.................................................
...........-...//.....-/...-...........\|./......................\.........................|.-|...|...........
....../.....................-.......|........|-..................\............-.....................|.........
.....................\.\................../..|/......\........|.\..............|\..............\..-...........
....\................|\......................./.....-...............................-......../....-...........
...\....................-....|......|........-.\..|.......................\...\.|..............|............/.
...................-/.....................................-..\............-............-.............-....\...
.|....../.....\.....-.../......../..../..\.-...........\.../................|........\.................../....
.......|........./........................\.....-........-...............\....../....|../....\......./........
..........|.........../|......|......................-..............|./......................................\
....................../...../..............|.||............./......-......\...................................
\........|...-..................\./.................\.\.........-....\........../.../.-...\...................
....-..........|.......-......../................................./.../....-.............-..........\-........
..............................-.............\..\......................................-......../..............
......./.\|......../...-........|.........|................/.........................-....|...\.........|.....
......|..........-.......-............./........|..\...|.|..-.............................-.-...\.............
.||...........-.......\...../.....................-././..../.............-................|../.............--.
................\.-.....-\..........\.............\............/.........\.......-........\...................
......./...........\........\./.|..............|......-...........\................\...../.\...../..........|.
.-..-...|.....................-....../..............-.\|....\.......|..|....././.......|......................
./...-..................../................/....-/..\............/..................................\.........
....\.-..........\-......../............|...\.............|..................|.....\.................../......
...........-/..\..-................-....|............/...-.|.......-.|........./.....-/......./...............
..../...-.....\..............-..\.....\.|............./...|.\..................\...|.........\-./..|...../....

M 2023/Makefile => 2023/Makefile +1 -1
@@ 4,7 4,7 @@
LUA?=lua

.PHONY: all
all: 1 2 3 4 5 6 7 9 10 11 12 13 14 15 18
all: 1 2 3 4 5 6 7 9 10 11 12 13 14 15 16 18

.DEFAULT:
	@printf 'day %s\t' $< && $(LUA) $<.lua < $<.txt