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