diff --git a/2024/day16/input b/2024/day16/input new file mode 100644 index 0000000..96fe298 --- /dev/null +++ b/2024/day16/input @@ -0,0 +1,141 @@ +############################################################################################################################################# +#.................#.....#.....#.............#...#.......#.....#.......#.#.........#...........#...#...............#........................E# +###########.#######.#.#.#.###.#.###########.#.#.#.###.###.#.#.#.#.#.#.#.#.#####.#.###.#######.#.#.###.#########.#.###.###########.#.#####.#.# +#.........#.#.......#...#.#...#...#...#...#.#.#.....#.#...#.#.#...#.#...#.#.#...#...#.#...#.....#...#.......#.........#.....#...#.#...#.#...# +#.#######.#.#.#########.#.#.#####.#.#.###.#.#.#######.#.###.###.#.#.###.#.#.#.#####.#.#.#.#########.#.#####.#.#.#########.#.###.#.###.#.###.# +#.......#.#.#.......#.#.#.#.#...#...#.........................#.#...#.#.#...#.#...#...#.#.....#...#.#.....#.#...#.........#.....#.#...#.#...# +#.#####.#.#.#######.#.#.#.#.#.#.#######.#.#######.#.#.#######.#.#.###.#.###.#.#.#.#####.#.###.#.###.#####.#.#.#.#.#####.#####.###.#.#.#.#.#.# +#.#.....#.........#...#...#...#.#.......................#.............................#.#.#...#.....#.....#.......................#.....#.#.# +#.#.#######.###.#####.#.#######.#.#############.###.#####.#.#.#.#.#.#.###.###.#.#####.#.#.#.###.#########.#.###.#########.###.#.#.#####.#.### +#.#.#.......#.........#...#.....#...#...........#.#.#...#.#.....................#...#.....#.#.#.....#...#.#.....#.......#...#...#.#.#...#...# +#.#.#########.#.#######.#.#.#######.#.#######.#.#.#.#.#.#.#####.#.#######.#.###.#.#######.#.#.#####.#.#.###.###.#.#####.###.#.###.#.#.#####.# +#.#.......#...#...........#.....#...#.#...#...#...#...#.#.......#.........#.....#.#.....#...#.....#...#.........#.#...#.#...#.....#.....#...# +#.#######.#.###.###.#.#.#.#####.#####.#.#.#.#.#########.###.#####.#############.#.#.###.#.###.#####.###########.#.#.#.#.#####.#.###.#####.#.# +#...#.....#.#.............#...#...........#.#.........#...#.#.......#...#.....#...#.#.#...#.#.......#.......#...#...#.#.......#.#...#.....#.# +#####.#####.#.#.#.###.#.#.###.#############.#########.###.#.#.###.#.#.#.#.###.#####.#.###.#.#.###.###.#####.#.#.#####.#######.#.#####.#####.# +#...#.....#.#.#.#.#...#.#...#...#...#...#...#.....#...#...#.#.#.#...#.#.#...#...#...#.#.........#.....#...#.....#.....#.....#.#.......#...#.# +#.#.#####.#.###.#.#.###.###.#.###.#.#.#.#.###.###.#.###.###.#.#.#.###.#####.###.#.###.#.#########.#####.#.#.###.#.#########.#.#####.###.#.#.# +#.#.......#.....#...#...#.....#...#...#.....#...#.#...#.#...#.#...#...#.....#.#...#...#.#.#.....#...#...#.#...#.#.#.......#.#...#...#...#.#.# +#.#######.#######.###.###.#####.#####.#####.#.#.#####.#.#.###.#.###.###.#####.#####.#.#.#.#.###.#.#.#.###.#.#.#.#.#.#####.#.###.#####.###.### +#...#...#.#.........#.....#.#...#.....#...#...#.....#...#.....#.......#.#.......#...#.#...#...#.#.#...#...#.#.#.#...#.#.......#.#...#.#.#...# +#.#.#.#.#.#.###.###.#.#####.#.#####.###.#.#########.###########.#####.#.#.#####.#.###.#.###.#.#.#.#####.###.#.#######.#.#######.#.#.#.#.###.# +#.#.#.#...#...#.#.#.#...#...#.#...#...#.#.#.......#...........#...#...#.#.....#...#...#.#...#...#.......#...#.......#...#.....#...#.#.....#.# +#.#.#.#######.#.#.#.###.#.###.#.#.#####.#.#.#####.#########.#####.#.#.#.###.#.#.#######.#.###.#.#######.#.#.###.#####.###.###.#####.#####.#.# +#.#.#.....#...#.#...#.#.#...#...#...#...#...#...#.....#...#.....#...#.#...#.#.#.#.......#.....#.#...#...#.#...#.#.....#.#...#.........#...#.# +#.#.#####.###.#.#.###.#.###.#######.#.#####.###.#####.#.#.#####.###.#####.#.#.###.#.#####.###.#.#.#.###.#.###.#.#.#####.###.#####.#####.###.# +#.#...#.#...#.#.#.....#...#.....#...#.....#.....#.......#.....#.....#.....#.#.....#.......#...#...#...#.#.....#...#...#...#.....#.#.....#.#.# +#####.#.###.###.#.#.#.###.###.#.#.#.#####.###.#.###.#########.#.###.#.#####.#.#####.#######.#.#######.#######.#####.#.#.#.#####.#.#.#####.#.# +#.....#...#.#...#...#...#.....#.#.#...#.#...#.#...#.......#...#.....#...#...#.#...#.#.....#.#...............#.#.#...#...#.#...............#.# +#.#######.#.#.#########.#######.#.###.#.###.#.###.###.###.#.#######.###.#.###.#.#.#.#.#.#.#.#.#.###.#####.#.#.#.#.#.#####.#.#.###.###.#.###.# +#.....#...#.........#.....#...#.#.#.......#...#.#.....#.#.#.......#.#...#.#.#...#.#.#.#.#...#.#...#.....#.....#.#.#.#.......#.#.....#.#.#...# +#.#.#.#.###.#.#.#####.#####.#.#.#.#######.#####.#######.#.###.#.###.#.###.#.#.###.#.###.#.###.###.#.#.#########.#.#.#######.#.#######.#.#.#.# +#...#.#...#.#.#.#.....#.....#...#...#.........#...#.....#...#.#.....#.#.#.#...#...#...#.#.#...#.#...#.......#...#.#.....#.#.#.#.......#.#.#.# +###.#.###.#.#.#.#.#####.###########.###.#####.#.#.#.###.###.#.#.#####.#.#.#.###.#.###.#.###.###.###.###.#.#.###.#.#####.#.#.#.#.#######.#.### +#...#...#...#.#.#.#.#...#...#...#...#...#.......#.#...#...#.#.#.....#.#.........#.#.#.#.#.........#.....#.......#.#.#...#.#.#.#.#.......#...# +#.#.###.#.###.#.#.#.#.###.#.#.#.#.###.#.#.#######.#####.###.#.#######.###########.#.#.#.#.#######.#.###.#.#.#####.#.#.###.#.#.#.#.###.#####.# +#.#.#...#...........#.#...#.#.#...#...#.#.#.#...#.......#...#...#.....#...#...#.....#.#...#...#...#...#.#.#.#.......#.#.....#.#...#...#.....# +#.#.#.#####.#.#####.#.#.###.#.#####.#####.#.#.#.#########.#####.#.#####.#.#.#.#######.###.#.#.#.#####.###.#.#.#######.#######.#####.###.##### +#...#.#...#.#...#.#.#.#...#.#.#...#.......#.#.#...........#...#.#.......#...#.#.........#.#.#.#.#.....#...#.#.#.#.....#.......#.....#...#...# +###.#.#.#.#.###.#.#.#.###.#.#.###.#.#######.#.#############.###.#.###########.#.###.###.#.#.#.#.#.###.#.#####.#.#.###.#.#######.#####.###.#.# +#...#...#.#.....#...#.....#.#...#.#...#.....#.........#.....#...#.#...#.....#.#...#...#.#.#.#.#...#...#...#.....#.#.#.#...#.....#...#.....#.# +#.#.###.#.###.#####.#.#########.#.###.#.#############.#.###.#.#.#.#.#.#####.#.###.#.#.#.###.#.#.#########.#.#####.#.#.###.#.#.###.#.#######.# +#.#.......#...#.....#.#.....#...#...............#...#.#.#...#.#.#.#.#.....#.#.#...#.#.#.....#.#.#.......#...#.....#...#...#.#.....#.........# +###.###.###.###.###.#.#.###.#.###.#######.###.###.#.#.#.#####.#.#.#.#####.#.#.#.###.###.#.###.###.#####.#####.#####.###.###.#####.#####.#.### +#...#.....#.#.....#.#.#.#...#.#...#...#...#...#...#...#.#.....#...#...#...#.#...#.#.....#.........#...#.......#.......#.....#...#.....#.#...# +#.#.###.###.#.#####.#.#.#.###.#.###.###.###.###.#######.#.#####.#####.#.###.#####.#######.#.#######.#.###.#######.#####.#####.#.#####.#####.# +#.#...#.....#.#.....#.#.#.....#.#...#...#.#...#...#.....#...#.#.......#.#.........#.#.....#.......#.#.#...#.....#.#...#.#.....#.....#.....#.# +#.#.#.#.###.#.#.#####.#.###.#.#.#.###.###.###.#.#.###.#.###.#.#########.###.#####.#.#.###########.#.###.###.###.###.#.#.#####.#####.#.###.#.# +#...#.....#.#.#.......#.#...#.#...#...#...#.#...#.#...#.#...#.........#...#.....#.#.#.#...#.....#.#.....#...#...#...#.#.....#.#.....#.#...#.# +#.#.###.#.###.#########.#.#.#.###.#.###.#.#.#.###.#.#.###.###.#######.###.#####.#.#.#.#.#.###.#.#.#.#####.###.###.###.#####.#.###.#.#.#.###.# +#...#...............#...#.#...#...#...#.#...#...#...#.#...#.....#...#...#.......#...#...#...#.....#...#...#.#.#.....#...#.#.#...#.#...#.#...# +###.###.#########.###.###.#.###.#####.#.###.###.#####.#.###.###.#.#.#.###.#####.###########.#.#########.###.#.#####.###.#.#.#.#.#.#.###.#.### +#.#.....#.....#.....#.#.#.#.#.#.........#.#...#.#.....#.#.#...#...#...#...#...#.#.........#.#.#.......#.#...........#...#...#.....#.....#...# +#.#####.#.###.#.###.#.#.#.#.#.#####.#####.###.#.#.#####.#.###.#######.#.###.#.###.#######.#.#.#####.#.#.#############.###.#####.#.#.###.###.# +#.....#.#.#...#.#.#...#.#...#.....#.#.#.......#.#.#...#.#...#.#.....#...#...#...#.....#...#.#.......#...#.........#.............#.#...#.#...# +#.###.#.#.#.###.#.#####.#####.#####.#.#.#######.#.#.#.#.#.#.#.###.#.#####.#.###.#.###.#.###.#.#########.#.###.#.###.#####.#####.#.#.#.###.#.# +#...#.#.#.#.....#.....#...............#.#.......#...#.#.#.#.#.....#...#.........#.#...#.#...#.#.....#...#...#.#.........#.#.....#.....#...#.# +###.#.#.#.#######.#####.###############.###.#.#######.#.###.#.###.#####.###.#####.#.###.###.#.#.###.###.###.#.#.#.###.#.###.###.#####.#.###.# +#.#.#...#.#...........#.....#...#.#.....#...#.......#.#...#.......#...#...#.#.#...#...#.....#.#.#...#...#...#.........#.#...#.#...#...#...#.# +#.#.###.#.#####.#####.#####.#.#.#.#.#####.#########.#.###.#########.#.###.#.#.#.#####.#########.#.###.#.#.###.#########.#.###.#.#.###.###.### +#.#...#.#.#...#.....#...#.#...#...#...#.....#.....#...#.#...........#.......#.......#...#...#...#...#.#.....#.#.....#.....#.....#...#.#.#...# +#.###.#.#.#.#.#######.#.#.#####.#####.#.###.#.#.#.#####.###################.#######.###.#.#.#.#.###.#.#######.#.###.#####.#.###.###.#.#.###.# +#.......#...#.....#...#...#.....#...#.#...#...#.#.#.............#.........#...#...#.#.#...#.....#...#...#...#.....#.....#...#...#...#...#...# +#.#####.#########.#.#######.#####.#.#.###.#####.#.#########.#.###.#.#####.###.###.#.#.###########.###.#.#.#.###########.#.###.#.#.###.###.#.# +#.....#.#.......#.#.........#.....#.#...#.#.....#...........#.#...#.#...#...#...#.#...#.......#...#.....#.#.....#.......#...#...............# +#.#.###.#.#.###.#.###########.#####.###.#.#.###################.###.#.#.###.###.#.###.###.###.#.#.#.#####.#.#.#.#.#########.#.#####.#.#.##### +#.#.....#.......#.....#...........#.....#.#.....#.....#.......#.#...#.#...#...#.#.....#...#...#.#.#.#...#.#.#.#...#.........#.#.....#.......# +#.#####.###.#.#######.#.###########.#.#########.#.###.#.#.#.#.#.#####.#.#.###.#.#.#####.#.###.#.###.#.#.#.#.#.#####.#.#######.#.#####.###.#.# +#...#.......#.#.....#.........#.....#.#.....#.....#.#...#...#...#...#.#.#...#.#.#.......#.#.........#.#...#...#.....#...#.....#.#.......#.#.# +###.#.#######.#.#########.#.###.###.#.###.#.#.#.#.#.#.#########.#.#.#.#.###.#.#.#####.#.###.#.###.###.#########.#######.#.#####.#.###.#.#.#.# +#.#...#...#...#.......#...#...#...#.#.....#.....#.#...#.......#.#.#.#.#.....#...#.....#...#.#.#...#.#.#.................#.#.....#.#...#.#.#.# +#.#####.#.#.#########.#.#####.#.#.#.###.#######.#.#####.#####.###.#.#.###.#######.###.#.#.#.###.###.#.#######.#####.###.#.#.#####.#.#.#.#.#.# +#.......#.#.#.......#.#.#.....#.#.#.#...#.....#.#.....#.....#...#.#...#.#.#.....#.#.#...#...#.......#.......#.#...#.....#.#.....#.#...#...#.# +#.#####.#.#.#.#####.#.#.#.###.#.#.#.#.###.###.#.#####.#.#.#.###.#.###.#.#.###.#.#.#.#.###.###.#.#.#.#######.###.#.#.#.###.#####.#.###.###.#.# +#.#.......#...#.#...#...#.#...#.#.....#...#.#.#...#...#.#.#.#.....#...#.#...#...#.#.#.#...#...#...#.......#...#.#.#.#.......#...#...#...#.#.# +#.#####.#######.#.###.#.#.#.#.#.#.###.#.###.#.#####.#.#.###.#.#########.###.#.###.#.#.#####.#####.#.#.#.#.###.#.#.#########.#.#####.#.#.#.#.# +#...........#.#...#...#...#...#...#.....#...#...#...#.#...#.....#.......#.#.#.....#.#.......#.....#.#.#.....#.........#...#.#.....#...#...#.# +#####.#.#.#.#.#.#######.#####.#.#.#.#######.###.#.#.#####.#######.#######.#.###.###.###########.###.#.#####.#########.#.#.#.#####.###.#.#.#.# +#...#...#.#...#.....#...#...#.#.#.#.#.........#.....#...#.......#.....#...#...#.#...........#...#.#.#...#...........#...#.#.#.......#...#...# +#.#.###.#.#########.#.###.#.#.#.#.#.###.#####.#.###.#.#.#######.#####.#.#####.#.#.###.#####.#.###.#.#####.#########.#####.#.#.#######.###.#.# +#.#...#.#.........#.#...#.#.#.#...#...#.....#.......#.#.#.....#.....#.#.#.....#.#.#...#...#...#...........#.......#.#.....#...............#.# +#.###.#.#########.#.###.#.###.#.#####.#####.#.#####.#.#.#.#.#####.#.#.#.#.#####.###.###.#.#.###############.#####.#.#.#########.###.###.#.### +#...#.#.....#.....#.....#.#.........#.....#.#.#...#.#.#.#.#.......#...#...#.#...#...#...#.#.#.............#.....#...#.........#...#.....#...# +#.#.#.#.###.#.###.#######.#.###.###.#####.#.#.#.#.###.#.#.#######.#####.###.#.###.#####.###.#.###########.#.#####.###########.#.#######.#.#.# +#.#.#.#.....#.#.#.#.......#.#.....#...#...#...#.#.....#...#.....#.....#.#...#.........#...#.#.#.....#.#...#.#...#.......#...#...#.....#...#.# +###.#.#.#####.#.#.###.#.#.#.#########.#.#######.###########.#.#######.#.###.#####.#.#.###.#.#.#.#.#.#.#.#####.#.#####.###.#.###.#.###.###.#.# +#...#.......#.#.#.#...#.#.#.......#...#.........#.........#.#.......#.....#.......#.....#...#.#.#.#.#.#.#.....#...#...#...#...#.#.#.#.....#.# +#.#########.#.#.#.#.#.#.#.#######.#.#############.#####.###.#####.###.###.#########.###.#####.###.#.#.#.###.#####.###.#.#####.###.#.#####.#.# +#...#.....#.#.#...#.#...#.....#...#.#...........#.#.....#...#...#...#...#...#.......#.........#...#...#.#...#.......#.#.#...#.....#.....#.#.# +#.#.#####.#.#.#.###.###.#####.#.###.#.#######.#.#.#.#####.###.#.###.###.###.#.#################.###.###.#.#.#######.#.#.#.###.#####.###.#.#.# +#.#.....#...#.#...#...#.#...#.........#.......#.#.#.....#...#.....#...#...#.................#.....#.#...#.#.#.....#.#.#.#.....#...#...#.#.#.# +#####.#.###.#.###.###.#.#.###.###.#####.#######.###.###.###.#.#######.#.#.#.#.#############.#####.#.#.###.###.###.#.###.###.###.#.###.#.#.#.# +#...#.#...#...#.......#.#.#.....#...#...#.....#...#.#.#...#.#.#.....#.#.#.#.#...#.....#...#.#.....#.#.#.#.....#...#...#...#.#.#.#.#...#.#.#.# +#.#.#####.###.#########.#.#.###.###.#.###.###.###.#.#.#.#.#.#.#.###.#.#.###.###.#.#.#.#.###.#.#####.#.#.#.#####.#####.###.#.#.#.#.#.#.#.#.#.# +#.#.......#...#.........#.#.....#.#...#.....#.#...#...#...#.#.#.#.#...#...#...#.#...#...#...#.#...#.#.#...#...#.#...#...#.#...#.#...#.#.#.#.# +#.#######.#####.#########.#.#.###.#####.###.###.#######.###.#.#.#.###.###.###.#.###.###.#.###.#.#.###.#####.#.#.#.#.###.#.#####.###.###.#.#.# +#.#...#...#.....#.........#.#.....#...#...#.#...#.....#...#.#.#.......#.....#.#.........#.#.....#...#.......#.#.#.#.#...#.#.....#.#...#.....# +#.#.#.#####.#####.#.#.#####.#####.#.###.###.#.###.###.#.#.#.#.#.#.#####.#.#.#.#####.#####.#########.#########.#.###.#.###.#.###.#.###.###.#.# +#.#.#.#.....#...#...#.#.....#.....#.#...#...#.#...#.#.#.#.....#.#.#.....#.#.#.#.#...#...#.#.......#.........#.#.......#...#...#.....#...#...# +#.#.#.#.#####.#.#.#.#.#.#####.#####.#.###.###.#.###.#.###.#####.#.#.###.#.###.#.#.###.#.#.#.#####.#######.#.#.#.#.###.#.#.###.#.#.#####.#.### +#...#.#.......#.#.#.#.#.#.........#.....#...#.#...#.#...#...#.....#...#.#.....#.....#.#.#.....#...#.......#.#.#.#...#.#.#.......#.#.....#.#.# +#.###.#.#######.#.#.###.#########.#.#######.#.###.#.###.#####.###.###.#.#######.#####.#.#.#####.###.#########.#####.#.#.###.###.#.#.#####.#.# +#.#.#.............#...#...#.....#.#...#...#.#.....#...#.......#...#...#.#...#...#.....#.#.#.....#.............#.....#...#.....#...#...#.#.#.# +#.#.#########.#.#.###.###.#.###.#.###.#.#.#.#########.#########.###.###.#.#.#.###.#####.###.#####.###########.#.###############.#.###.#.#.#.# +#.....#...#...#.#...#...#...#.#.#...#.#.#.......#.......#.#.....#.#.#...#.#...#...#...#...#.......#...........#...#.............#...........# +#####.#.#.#.###.#####.#######.#.###.###.#######.###.###.#.#.#####.#.#.###.###.#.#####.#.#.#.#####.#.#######.#.###.#.#########.#.#.#.#.#.#.#.# +#.....#...#.#.......#.........#...#.....#.....#...#.#...#.#.....#...#.........#.....#...#.#.....#.#.#.......#...#.#.#.......#.......#.#...#.# +#.#######.#.#.#####.###.###.#####.#######.#.#####.#.###.#.#####.#.#########.#####.#.###.#.###.#.###.#.#########.#.#.#.#####.#.#######.#.#.#.# +#.#.....#.#...#...#...#.#...#.....#...#...#.#.....#...#...#.....#.#.......#.....#.#.#...#...#.#.....#.....#...#...#...#...#.................# +#.#.###.#.#####.#.#.#.#.#.###.###.#.###.#.#.#.#####.#.#####.#####.###.#.###.###.###.#.###.#.#.#######.###.#.#.#.#######.#.#.###.#.#######.#.# +#...#.....#...#.#...#...#.......#.....#.#.#.#.#.....#.#...#.#...#...#...#...#.#...#.#.....#.#.#.....#.#.#.#.#...#.......#.#.........#.......# +#.#######.#.#.#.###.###.#####.#.#####.#.#.###.#######.#.#.#.#.#.###.###.#.###.###.#.#.###.#.###.###.#.#.#.#.#####.#.#########.#.#.#.#.####### +#.#.....#.#.#.#.#.#...#.#...#.#.....#...#.....#.......#.....#.#.#...........#...#...#.#...#.....#.#.#...#.#.....#.#.........#.#.#.#.#.#.....# +#.#.###.#.#.#.#.#.###.#.#.#.#######.#.#######.#.###.###.#####.#.#######.###.###.#####.#.#########.#.###.#.#######.#######.###.#.#.#.#.#.###.# +#.#.#.......#...#...#.....#.......#.#...#...#...#...#...#.....#.....#...#...#.......#.#.........#...#...#.....#...#.....#.#...#.#.#.#.#.#...# +###.#####.#########.#############.#.#####.#.#####.###.###.#.#######.#####.###.#####.#.#####.###.#.#####.#####.#.#######.#.#.###.#.#.#.###.#.# +#...#.............#.....#.........#...#...#...#.....#...#.#.#.............#.....#...#.#.#...#...#.....#.....#.......#...#...#...#.#.......#.# +#.###.###########.###.#.#.###########.#.###.#.#########.#.#.#.###.###.#####.###.#####.#.#.###.#######.#############.#.#.#####.#.#.#.#######.# +#...#.#.....#...#...#.#...............#.#...#.........#.#.#...#...#.....#.#...#...#...#.#.#.........#...........#.#.#.#...#...#.#.#.#...#.#.# +#.#.#.#.#.#.###.###.#.#####.#####.###.#.#.#.#########.#.#######.#.#.###.#.###.###.#.###.#.#####.#.#.#####.#####.#.#.#.###.#####.#.###.#.#.#.# +#.....#.#.#...#.#...#...#.........#.....#.#.......#.#...........#.#.#.#.#.......#...#...#.....#.#.#.#.....#.....#.#...#.#.#...#.#.#...#.#.#.# +#.#######.###.#.#.###.#.###.#####.#.###########.#.#.#####.###.#.###.#.#.#.#.###.#####.#.#####.#.#.#.###.#.#.#####.#####.#.#.#.#.#.#.###.#.#.# +#.........#.#...#...#.......#.....#.#.........#.#.......#...#.........#.#.#...#...#...#...#...#.#.#.....#.#.....#...........#...#...#.#.#.#.# +###########.#.#.###.#.#########.###.#.#.#####.#.#######.###.#.#########.#.###.###.###.#####.#.#.#.#######.#####.###############.#####.#.#.#.# +#.....#.......#...#.#...#.......#...#.#.#...#...#.....#.....#.#.........#.......#.....#.....#.#.#.....#.#.....#...........#...#...#...#.#.#.# +#.#.#.#.#.###.###.#.###.#.#####.#.#####.#.#######.###.#######.#.###############.#####.#.#######.#####.#.###.#############.###.#.#.#.###.#.#.# +#.#.#.#.#.........#.#...#...#...#.#.....#.......#...#.#.....#.#.....#.....#.......#...#...#.....#.#...#.....#.........#...#.....#...#...#...# +#.#.#.#.#####.#####.#####.###.#.#.#.#####.###.###.#.#.#####.#.#####.#.###.#.#.#####.#####.#.###.#.#.###.#####.#.#######.#.#.#######.#.#####.# +#.#...#.#.#.....#...#.....#...#.#...#.......#.....#.#.......#.......#...#...#.#.....#...#...#.....#.#...#...#.#.........#.#.........#.#...#.# +#.###.#.#.#.#.#.#.#.#.#####.#############.#########.#.#####.###########.#####.#.#######.#########.#.###.#.#.#.###########.#.#########.#.#.#.# +#...#.#...#...#...#.#...#.#.............#.#.........#.#...#.#...#.......#.#...#.#.....#.........#.#...#.#.#...#.......#...#...#.....#.#.#.#.# +###.#.#.#.###.#########.#.#######.#####.###.#########.#.#.#.#.#.#.#######.#.###.#.###.#.#######.#.###.#.#.#####.#####.#.#.###.#####.#.#.#.### +#.#.#...#...#...........#...#.....#...#...#.#.#.....#.#.#.#.#.#.#...#.........#...#...#.......#.....#.#.#...#...#...#.......................# +#.#.#.#.###.#.#.###########.#.###.#.#.###.#.#.#.###.#.#.#.#.#.#.###.#########.#####.#####.###.#####.#.#####.#.#####.#.#.#.#.#.#.###.#.#.###.# +#.#.#.....#...#.....................#...#...#.....#...#.#.#...#.....#.....#.#...#.#.#...#...#.....#.#.....#...#.....#.#.#.#.#.#.#.#.#.#.#.#.# +#.#.#.#####.#.#.#######.#####.#.###.###.###.#######.###.#.#######.###.###.#.###.#.#.#.#.###.#.###.#.#####.#####.#.###.#.#.#.#.#.#.#.#.#.#.#.# +#.#.#.#...#...#.#...#...#.....#.#.#.#.#...#.#.....#.#...#.#...#...#...#...#.......#...#.#.......#.#...#...#...#.#.....#...#.....#...#.....#.# +#.#.#.#.#.#.#.###.#.#.#.#.#####.#.#.#.###.###.###.###.###.#.#.#.###.###.#######.#######.#.###.###.#.###.###.#.#.#############.###########.#.# +#.#.#...#...#.....#...#.#.#...#.............#.#.#...#.#.#.#.#.....#.#.#.......#.#.....#.#...............#...#.#.#.....#.....#.#.........#.#.# +#.#.#.###.#.#.#########.#.#.#.#####.#.#.###.#.#.###.#.#.#.#########.#.#######.###.###.#.#####.#.#.#.#.###.###.#.#.###.#.###.###.#######.###.# +#S............#.........#...#.........#...#.......#.....#.....................................#...#.#.......#.....#.....#.......#...........# +############################################################################################################################################# diff --git a/2024/day16/main.go b/2024/day16/main.go new file mode 100644 index 0000000..e990d69 --- /dev/null +++ b/2024/day16/main.go @@ -0,0 +1,276 @@ +package main + +import ( + "errors" + "fmt" + + h "git.bullercodeworks.com/brian/adventofcode/helpers" +) + +func main() { + inp := h.StdinToStringSlice() + part1(inp) + // fmt.Println() + // part2(inp) +} + +var ( + N = h.Coordinate{X: 0, Y: -1} + E = h.Coordinate{X: 1, Y: 0} + S = h.Coordinate{X: 0, Y: 1} + W = h.Coordinate{X: -1, Y: 0} +) + +var ( + scoreTrack map[h.Coordinate]int + bestCostToEnd map[h.Coordinate]int +) + +func part1(inpS []string) { + inp := h.StringSliceToCoordByteMap(inpS) + scoreTrack = make(map[h.Coordinate]int) + bestCostToEnd = make(map[h.Coordinate]int) + + start, _ := inp.FindFirst('S') + end, _ := inp.FindFirst('E') + inp.Put(start, '.') + bestCostToEnd[end] = 0 + + cd := CD{c: start, d: E} + solve(inp, cd, end, 0, []h.Coordinate{cd.c}) + best, ok := scoreTrack[end] + if !ok { + panic(errors.New("no path to end found")) + } + fmt.Println("Best Score:", best) + + bestSeats := make(map[h.Coordinate]byte) + for i := range bestPaths { + for j := range bestPaths[i] { + bestSeats[bestPaths[i][j]] = byte('0' + i) + } + } + printBestSeats(inp, bestSeats) + fmt.Println("Seats:", len(bestSeats)) +} + +var bestPaths [][]h.Coordinate + +func solve(inp h.CoordByteMap, start CD, end h.Coordinate, score int, currPath []h.Coordinate) int { + // tryMove takes the cd that we're moving to and the cost to move there + // and returns the cost to get from that cd to the end + tryMove := func(c CD, cost int) int { + if inp.ContainsCoord(c.c) && inp.Get(c.c) != '#' { + // printPathMap(inp, c, end, currPath) + // poi := h.Coordinate{X: 3, Y: 10} + // time.Sleep(time.Second / 20) + nextScore := score + cost + v, ok := bestCostToEnd[c.c] + //if c.c.Equals(poi) { + // fmt.Println("Current Scoretrack[poi] =", v) + // fmt.Println("Next Score =", nextScore) + // time.Sleep(time.Second * 5) + //} + if !ok || v >= nextScore { + nxtPath := make([]h.Coordinate, len(currPath)) + copy(nxtPath, currPath) + nxtPath = append(nxtPath, c.c) + + // Check end conditions + if c.c.Equals(end) { + if !ok || v > nextScore { // New Best + fmt.Println("New Best Path") + scoreTrack[end] = nextScore + bestPaths = [][]h.Coordinate{nxtPath} + } else if v == nextScore { // Another Best Path + fmt.Println("Adding path to best paths") + bestPaths = append(bestPaths, nxtPath) + } + return cost + } + // Not the end, but keep going + scoreTrack[c.c] = nextScore + solve(inp, c, end, nextScore, nxtPath) + } + } + return h.MAX_INT + } + // Test forward + cost := tryMove(start.move(), 1) + // Test CW + if wrk := tryMove(start.turnCW().move(), 1001); wrk < cost { + cost = wrk + } + // Test CCW + if wrk := tryMove(start.turnCCW().move(), 1001); wrk < cost { + cost = wrk + } + bestCostToEnd[start.c] = cost + return cost +} + +func printPathMap(inp h.CoordByteMap, loc CD, end h.Coordinate, path []h.Coordinate) { + fmt.Print(h.CLEAR_SCREEN) + wrk := inp.Copy() + wrk.ReplaceAll('.', ' ') + for i := range path { + wrk.Put(path[i], 'o') + } + wrk.Put(loc.c, loc.Byte()) + fmt.Println(wrk) + if v, ok := scoreTrack[end]; ok { + fmt.Printf("Best Score: %v (Paths: %d)\n", v, len(bestPaths)) + } else { + fmt.Println("Waiting on best score...") + } +} + +func printBestSeats(inp h.CoordByteMap, seats map[h.Coordinate]byte) { + fmt.Print(h.CLEAR_SCREEN) + wrk := inp.Copy() + wrk.ReplaceAll('.', ' ') + for k, v := range seats { + wrk.Put(k, byte(0+v)) + } + fmt.Println(wrk) +} + +/* +func part2(inpS []string) { + inp := h.StringSliceToCoordByteMap(inpS) + scoreTrack = make(map[h.Coordinate]int) + start, _ := inp.FindFirst('S') + end, _ := inp.FindFirst('E') + inp.Put(start, '.') + cd := CD{c: start, d: E} + lookForSeats(inp, cd, end, 0, []h.Coordinate{cd.c}) + _, ok := scoreTrack[end] + if !ok { + panic(errors.New("no path to end found")) + } + bestSeats := make(map[h.Coordinate]int) + for i := range bestPaths { + for j := range bestPaths[i] { + bestSeats[bestPaths[i][j]] = i + } + } + fmt.Println("Number of Seats:", len(bestSeats)) +} + + + +func coordInPath(c h.Coordinate, path []h.Coordinate) bool { + for i := range path { + if path[i].Equals(c) { + return true + } + } + return false +} + +func lookForSeats(inp h.CoordByteMap, start CD, end h.Coordinate, score int, path []h.Coordinate) int { + // Check for finished: + if start.c.Equals(end) { + v, ok := scoreTrack[end] + if !ok || v > score { + // We have a new best path + bestPaths = [][]h.Coordinate{path} + scoreTrack[end] = score + } else if scoreTrack[end] == score { + bestPaths = append(bestPaths, path) + } + return score + } + + // Helper func + canMoveTo := func(p h.Coordinate) bool { + return inp.ContainsCoord(p) && inp.Get(p) != '#' + } + // Keep moving: + tryMove := func(c CD, cost int) { + if canMoveTo(c.c) { + // Check if this path has alread gone through this spot + nxtPath := make([]h.Coordinate, len(path)) + copy(nxtPath, path) + if coordInPath(c.c, nxtPath) { + return + } + // Ok, now what's the best score we end up if we make this move? + nextScore := score + cost + n, ok := scoreTrack[c.c] + if !ok || n > nextScore { + lookForSeats(inp, c, end, nextScore, append(nxtPath, c.c)) + } + } + } + // Test forward + tryMove(start.move(), 1) + // Test CW + tryMove(start.turnCW().move(), 1001) + // Test CCW + tryMove(start.turnCCW().move(), 1001) + return scoreTrack[start.c] +} +*/ + +type CD struct { + c h.Coordinate + d h.Coordinate +} + +func (cd CD) move() CD { + return CD{ + c: cd.c.Add(cd.d), + d: cd.d, + } +} + +func (cd CD) turnCW() CD { + var newD h.Coordinate + switch cd.d { + case N: + newD = E + case E: + newD = S + case S: + newD = W + case W: + newD = N + } + return CD{ + c: cd.c, + d: newD, + } +} + +func (cd CD) turnCCW() CD { + var newD h.Coordinate + switch cd.d { + case N: + newD = W + case E: + newD = N + case S: + newD = E + case W: + newD = S + } + return CD{ + c: cd.c, + d: newD, + } +} + +func (cd CD) Byte() byte { + switch cd.d { + case N: + return '^' + case E: + return '>' + case S: + return 'v' + case W: + return '<' + } + return '?' +} diff --git a/2024/day16/testinput b/2024/day16/testinput new file mode 100644 index 0000000..2c21676 --- /dev/null +++ b/2024/day16/testinput @@ -0,0 +1,15 @@ +############### +#.......#....E# +#.#.###.#.###.# +#.....#.#...#.# +#.###.#####.#.# +#.#.#.......#.# +#.#.#####.###.# +#...........#.# +###.#.#####.#.# +#...#.....#.#.# +#.#.#.###.#.#.# +#.....#...#.#.# +#.###.#.#.#.#.# +#S..#.....#...# +############### diff --git a/2024/day16/testinput2 b/2024/day16/testinput2 new file mode 100644 index 0000000..bc61c57 --- /dev/null +++ b/2024/day16/testinput2 @@ -0,0 +1,17 @@ +################# +#...#...#...#..E# +#.#.#.#.#.#.#.#.# +#.#.#.#...#...#.# +#.#.#.#.###.#.#.# +#...#.#.#.....#.# +#.#.#.#.#.#####.# +#.#...#.#.#.....# +#.#.#####.#.###.# +#.#.#.......#...# +#.#.###.#####.### +#.#.#...#.....#.# +#.#.#.#####.###.# +#.#.#.........#.# +#.#.#.#########.# +#S#.............# +################# diff --git a/2024/day17/examples b/2024/day17/examples new file mode 100644 index 0000000..9b1d816 --- /dev/null +++ b/2024/day17/examples @@ -0,0 +1,5 @@ +Register A: 0 +Register B: 2024 +Register C: 43690 + +Program: 4,0 diff --git a/2024/day17/input b/2024/day17/input new file mode 100644 index 0000000..6980dc5 --- /dev/null +++ b/2024/day17/input @@ -0,0 +1,5 @@ +Register A: 33940147 +Register B: 0 +Register C: 0 + +Program: 2,4,1,5,7,5,1,6,4,2,5,5,0,3,3,0 diff --git a/2024/day17/main.go b/2024/day17/main.go new file mode 100644 index 0000000..c9ba0d3 --- /dev/null +++ b/2024/day17/main.go @@ -0,0 +1,220 @@ +package main + +import ( + "errors" + "fmt" + "math" + "slices" + "strconv" + "strings" + "time" + + h "git.bullercodeworks.com/brian/adventofcode/helpers" +) + +func main() { + inp := h.StdinToStringSlice() + part1(inp) + fmt.Println() + part2(inp) +} + +func part1(inp []string) { + vm := InitVM(inp) + fmt.Println("# Part 1") + fmt.Println(run(vm.RegA, vm.RegB, vm.RegC, vm.Prog)) +} + +func part2(inp []string) { + fmt.Println("# Part 2") + + vm := InitVM(inp) + a, b, c, prog := 0, vm.RegB, vm.RegC, vm.Prog + for pos := len(prog) - 1; pos >= 0; pos-- { + a <<= 3 + for !slices.Equal(run(a, b, c, prog), prog[pos:]) { + a++ + } + } + + fmt.Println("Corrected A:", a) +} + +func run(a, b, c int, program []int) []int { + out := make([]int, 0) + for ptr := 0; ptr < len(program); ptr += 2 { + oc, oa := program[ptr], program[ptr+1] + value := oa + switch oa { + case 4: + value = a + case 5: + value = b + case 6: + value = c + } + switch oc { + case 0: + a >>= value + case 1: + b ^= oa + case 2: + b = value % 8 + case 3: + if a != 0 { + ptr = oa - 2 + } + case 4: + b ^= c + case 5: + out = append(out, value%8) + case 6: + b = a >> value + case 7: + c = a >> value + } + } + return out +} + +type VM struct { + RegA, RegB, RegC int + Prog []int + ProgStr string + ptr int + Running bool + + StdOut []int + StdOutStr string + Debug bool + + ProcHistory map[string]bool + Err error +} + +func InitVM(inp []string) *VM { + vm := &VM{ + ProcHistory: make(map[string]bool), + } + fmt.Sscanf(inp[0], "Register A: %d", &vm.RegA) + fmt.Sscanf(inp[1], "Register B: %d", &vm.RegB) + fmt.Sscanf(inp[2], "Register C: %d", &vm.RegC) + vm.ProgStr = inp[4][9:] + prog := strings.Split(vm.ProgStr, ",") + for i := range prog { + p, _ := strconv.Atoi(prog[i]) + vm.Prog = append(vm.Prog, p) + } + return vm +} + +func (vm *VM) DetectLoop() { + if _, ok := vm.ProcHistory[vm.String()]; ok { + vm.Err = errors.New("loop detected") + vm.Running = false + } +} + +func (vm *VM) Run() { + do := func(op, operand int) { + vm.PrintDebug(op, operand) + switch op { + case 0: // adv (divide A by 2^combo -> int -> A) + vm.RegA = int(float64(vm.RegA) / math.Pow(2, float64(vm.GetVal(operand)))) + case 1: // bxl (bitwise XOR of B and literal operand -> B) + vm.RegB = int(vm.RegB ^ operand) + case 2: // bst (combo % 8 -> B) + vm.RegB = int(vm.GetVal(operand) % 8) + case 3: // jnz (if A is = 0 do nothing, else jump ptr to literal operand) + if vm.RegA != 0 { + vm.ptr = operand + } + case 4: // bxc (bitwise XOR of B and C -> B) (reads operand but ignore it) + vm.RegB = vm.RegB ^ vm.RegC + case 5: // out (calc value of combo operand % 8, output that value) + v := vm.GetVal(operand) % 8 + vm.StdOut = append(vm.StdOut, v) + if vm.StdOutStr == "" { + vm.StdOutStr = fmt.Sprintf("%d", v) + } else { + vm.StdOutStr = fmt.Sprintf("%s,%d", vm.StdOut, v) + } + case 6: // bdv (exactly like 0, but store into B) + vm.RegB = int(float64(vm.RegA) / math.Pow(2, float64(vm.GetVal(operand)))) + case 7: // cdv (exactly like 0, but store into C) + vm.RegC = int(float64(vm.RegA) / math.Pow(2, float64(vm.GetVal(operand)))) + } + } + vm.Running = true + for vm.Running { + if vm.ptr >= int(len(vm.Prog)) { + break + } + if vm.Debug { + fmt.Printf("Do: %d %d\n", vm.Prog[vm.ptr], vm.GetVal(vm.Prog[vm.ptr+1])) + } + vm.DetectLoop() + pPtr := vm.ptr + do(vm.Prog[vm.ptr], vm.Prog[vm.ptr+1]) + if vm.ptr == pPtr { + vm.ptr = vm.ptr + 2 + } + if vm.Debug { + fmt.Println() + fmt.Println(vm) + time.Sleep(time.Second) + } + } +} + +func (vm *VM) GetVal(cmb int) int { + switch cmb { + case 4: + return vm.RegA + case 5: + return vm.RegB + case 6: + return vm.RegC + } + return cmb +} + +func (vm *VM) PrintDebug(op, b int) { + if !vm.Debug { + return + } + switch op { + case 0: + fmt.Printf("adv (0): %d / int(math.Pow(2, %d)) (A)\n", vm.RegA, vm.GetVal(b)) + case 1: + fmt.Printf("bxl (1): %d ^ %d = %d (B)\n", vm.RegB, vm.GetVal(b), (vm.RegB ^ b)) + case 2: + fmt.Printf("bst (2): %d %% 8 = %d (B)\n", vm.GetVal(b), vm.GetVal(b)%8) + case 3: + fmt.Printf("jnz (3) if %d != 0; ptr = %d\n", vm.RegA, b) + case 4: + fmt.Printf("bxc (4): %d ^ %d = %d (B)\n", vm.RegB, vm.RegC, (vm.RegB ^ vm.RegC)) + case 5: + fmt.Printf("out (5): Output %d\n", (vm.GetVal(b) % 8)) + case 6: + fmt.Printf("bdv (6): %d / int(math.Pow(2, %d)) (B)\n", vm.RegA, vm.GetVal(b)) + case 7: + fmt.Printf("cdv (7): %d / int(math.Pow(2, %d)) (C)\n", vm.RegA, vm.GetVal(b)) + } +} + +func (vm VM) String() string { + var ret string + ret = fmt.Sprintf("Register A: %d", vm.RegA) + ret = fmt.Sprintf("%s\nRegister B: %d", ret, vm.RegB) + ret = fmt.Sprintf("%s\nRegister C: %d", ret, vm.RegC) + ret = fmt.Sprintf("%s\n\nProgram: ", ret) + for i := range vm.Prog { + if vm.ptr == int(i) { + ret = fmt.Sprintf("%s[%d],", ret, vm.Prog[i]) + } else { + ret = fmt.Sprintf("%s%d,", ret, vm.Prog[i]) + } + } + return ret[:len(ret)-1] +} diff --git a/2024/day17/main2.bk b/2024/day17/main2.bk new file mode 100644 index 0000000..57bbc86 --- /dev/null +++ b/2024/day17/main2.bk @@ -0,0 +1,78 @@ +package main + +import ( + "fmt" + "slices" + "strconv" +) + +func main() { + fmt.Println(day17(1)) + fmt.Println(day17(2)) +} + +func day17(part int) string { + a, b, c, program := parseRegisters() + + if part == 1 { + // part 1: run program and return comma-separated output + return fmt.Sprintln(runProgram(a, b, c, program)) + } + + // part 2: find lowest value of register A that makes the program output itself + a = 0 // the initial value of register A doesnt matter here, so we can reset it + for pos := len(program) - 1; pos >= 0; pos-- { + a <<= 3 // shift left by 3 bits + for !slices.Equal(runProgram(a, b, c, program), program[pos:]) { + a++ + } + } + + return strconv.Itoa(a) // return a string since part 1 needs a string +} + +func parseRegisters() (int, int, int, []int) { + return 33940147, 0, 0, []int{2, 4, 1, 5, 7, 5, 1, 6, 4, 2, 5, 5, 0, 3, 3, 0} +} + +func runProgram(a, b, c int, program []int) []int { + out := make([]int, 0) + // for each isntruction pointer + for ip := 0; ip < len(program); ip += 2 { + opcode, operand := program[ip], program[ip+1] + // Process combo operand + value := operand + switch operand { + case 4: + value = a + case 5: + value = b + case 6: + value = c + } + + // Execute instruction + switch opcode { + case 0: // adv - divide A by 2^value + a >>= value + case 1: // bxl - XOR B with literal + b ^= operand + case 2: // bst - set B to value mod 8 + b = value % 8 + case 3: // jnz - jump if A is not zero + if a != 0 { + ip = operand - 2 + } + case 4: // bxc - XOR B with C + b ^= c + case 5: // out - output value mod 8 + out = append(out, value%8) + case 6: // bdv - divide A by 2^value, store in B + b = a >> value + case 7: // cdv - divide A by 2^value, store in C + c = a >> value + } + } + + return out +} diff --git a/2024/day17/testinput b/2024/day17/testinput new file mode 100644 index 0000000..f09839b --- /dev/null +++ b/2024/day17/testinput @@ -0,0 +1,5 @@ +Register A: 729 +Register B: 0 +Register C: 0 + +Program: 0,1,5,4,3,0