2024 Day 17 Complete!
This commit is contained in:
parent
1e4b9ba2d7
commit
5cfe4e1b65
141
2024/day16/input
Normal file
141
2024/day16/input
Normal file
@ -0,0 +1,141 @@
|
||||
#############################################################################################################################################
|
||||
#.................#.....#.....#.............#...#.......#.....#.......#.#.........#...........#...#...............#........................E#
|
||||
###########.#######.#.#.#.###.#.###########.#.#.#.###.###.#.#.#.#.#.#.#.#.#####.#.###.#######.#.#.###.#########.#.###.###########.#.#####.#.#
|
||||
#.........#.#.......#...#.#...#...#...#...#.#.#.....#.#...#.#.#...#.#...#.#.#...#...#.#...#.....#...#.......#.........#.....#...#.#...#.#...#
|
||||
#.#######.#.#.#########.#.#.#####.#.#.###.#.#.#######.#.###.###.#.#.###.#.#.#.#####.#.#.#.#########.#.#####.#.#.#########.#.###.#.###.#.###.#
|
||||
#.......#.#.#.......#.#.#.#.#...#...#.........................#.#...#.#.#...#.#...#...#.#.....#...#.#.....#.#...#.........#.....#.#...#.#...#
|
||||
#.#####.#.#.#######.#.#.#.#.#.#.#######.#.#######.#.#.#######.#.#.###.#.###.#.#.#.#####.#.###.#.###.#####.#.#.#.#.#####.#####.###.#.#.#.#.#.#
|
||||
#.#.....#.........#...#...#...#.#.......................#.............................#.#.#...#.....#.....#.......................#.....#.#.#
|
||||
#.#.#######.###.#####.#.#######.#.#############.###.#####.#.#.#.#.#.#.###.###.#.#####.#.#.#.###.#########.#.###.#########.###.#.#.#####.#.###
|
||||
#.#.#.......#.........#...#.....#...#...........#.#.#...#.#.....................#...#.....#.#.#.....#...#.#.....#.......#...#...#.#.#...#...#
|
||||
#.#.#########.#.#######.#.#.#######.#.#######.#.#.#.#.#.#.#####.#.#######.#.###.#.#######.#.#.#####.#.#.###.###.#.#####.###.#.###.#.#.#####.#
|
||||
#.#.......#...#...........#.....#...#.#...#...#...#...#.#.......#.........#.....#.#.....#...#.....#...#.........#.#...#.#...#.....#.....#...#
|
||||
#.#######.#.###.###.#.#.#.#####.#####.#.#.#.#.#########.###.#####.#############.#.#.###.#.###.#####.###########.#.#.#.#.#####.#.###.#####.#.#
|
||||
#...#.....#.#.............#...#...........#.#.........#...#.#.......#...#.....#...#.#.#...#.#.......#.......#...#...#.#.......#.#...#.....#.#
|
||||
#####.#####.#.#.#.###.#.#.###.#############.#########.###.#.#.###.#.#.#.#.###.#####.#.###.#.#.###.###.#####.#.#.#####.#######.#.#####.#####.#
|
||||
#...#.....#.#.#.#.#...#.#...#...#...#...#...#.....#...#...#.#.#.#...#.#.#...#...#...#.#.........#.....#...#.....#.....#.....#.#.......#...#.#
|
||||
#.#.#####.#.###.#.#.###.###.#.###.#.#.#.#.###.###.#.###.###.#.#.#.###.#####.###.#.###.#.#########.#####.#.#.###.#.#########.#.#####.###.#.#.#
|
||||
#.#.......#.....#...#...#.....#...#...#.....#...#.#...#.#...#.#...#...#.....#.#...#...#.#.#.....#...#...#.#...#.#.#.......#.#...#...#...#.#.#
|
||||
#.#######.#######.###.###.#####.#####.#####.#.#.#####.#.#.###.#.###.###.#####.#####.#.#.#.#.###.#.#.#.###.#.#.#.#.#.#####.#.###.#####.###.###
|
||||
#...#...#.#.........#.....#.#...#.....#...#...#.....#...#.....#.......#.#.......#...#.#...#...#.#.#...#...#.#.#.#...#.#.......#.#...#.#.#...#
|
||||
#.#.#.#.#.#.###.###.#.#####.#.#####.###.#.#########.###########.#####.#.#.#####.#.###.#.###.#.#.#.#####.###.#.#######.#.#######.#.#.#.#.###.#
|
||||
#.#.#.#...#...#.#.#.#...#...#.#...#...#.#.#.......#...........#...#...#.#.....#...#...#.#...#...#.......#...#.......#...#.....#...#.#.....#.#
|
||||
#.#.#.#######.#.#.#.###.#.###.#.#.#####.#.#.#####.#########.#####.#.#.#.###.#.#.#######.#.###.#.#######.#.#.###.#####.###.###.#####.#####.#.#
|
||||
#.#.#.....#...#.#...#.#.#...#...#...#...#...#...#.....#...#.....#...#.#...#.#.#.#.......#.....#.#...#...#.#...#.#.....#.#...#.........#...#.#
|
||||
#.#.#####.###.#.#.###.#.###.#######.#.#####.###.#####.#.#.#####.###.#####.#.#.###.#.#####.###.#.#.#.###.#.###.#.#.#####.###.#####.#####.###.#
|
||||
#.#...#.#...#.#.#.....#...#.....#...#.....#.....#.......#.....#.....#.....#.#.....#.......#...#...#...#.#.....#...#...#...#.....#.#.....#.#.#
|
||||
#####.#.###.###.#.#.#.###.###.#.#.#.#####.###.#.###.#########.#.###.#.#####.#.#####.#######.#.#######.#######.#####.#.#.#.#####.#.#.#####.#.#
|
||||
#.....#...#.#...#...#...#.....#.#.#...#.#...#.#...#.......#...#.....#...#...#.#...#.#.....#.#...............#.#.#...#...#.#...............#.#
|
||||
#.#######.#.#.#########.#######.#.###.#.###.#.###.###.###.#.#######.###.#.###.#.#.#.#.#.#.#.#.#.###.#####.#.#.#.#.#.#####.#.#.###.###.#.###.#
|
||||
#.....#...#.........#.....#...#.#.#.......#...#.#.....#.#.#.......#.#...#.#.#...#.#.#.#.#...#.#...#.....#.....#.#.#.#.......#.#.....#.#.#...#
|
||||
#.#.#.#.###.#.#.#####.#####.#.#.#.#######.#####.#######.#.###.#.###.#.###.#.#.###.#.###.#.###.###.#.#.#########.#.#.#######.#.#######.#.#.#.#
|
||||
#...#.#...#.#.#.#.....#.....#...#...#.........#...#.....#...#.#.....#.#.#.#...#...#...#.#.#...#.#...#.......#...#.#.....#.#.#.#.......#.#.#.#
|
||||
###.#.###.#.#.#.#.#####.###########.###.#####.#.#.#.###.###.#.#.#####.#.#.#.###.#.###.#.###.###.###.###.#.#.###.#.#####.#.#.#.#.#######.#.###
|
||||
#...#...#...#.#.#.#.#...#...#...#...#...#.......#.#...#...#.#.#.....#.#.........#.#.#.#.#.........#.....#.......#.#.#...#.#.#.#.#.......#...#
|
||||
#.#.###.#.###.#.#.#.#.###.#.#.#.#.###.#.#.#######.#####.###.#.#######.###########.#.#.#.#.#######.#.###.#.#.#####.#.#.###.#.#.#.#.###.#####.#
|
||||
#.#.#...#...........#.#...#.#.#...#...#.#.#.#...#.......#...#...#.....#...#...#.....#.#...#...#...#...#.#.#.#.......#.#.....#.#...#...#.....#
|
||||
#.#.#.#####.#.#####.#.#.###.#.#####.#####.#.#.#.#########.#####.#.#####.#.#.#.#######.###.#.#.#.#####.###.#.#.#######.#######.#####.###.#####
|
||||
#...#.#...#.#...#.#.#.#...#.#.#...#.......#.#.#...........#...#.#.......#...#.#.........#.#.#.#.#.....#...#.#.#.#.....#.......#.....#...#...#
|
||||
###.#.#.#.#.###.#.#.#.###.#.#.###.#.#######.#.#############.###.#.###########.#.###.###.#.#.#.#.#.###.#.#####.#.#.###.#.#######.#####.###.#.#
|
||||
#...#...#.#.....#...#.....#.#...#.#...#.....#.........#.....#...#.#...#.....#.#...#...#.#.#.#.#...#...#...#.....#.#.#.#...#.....#...#.....#.#
|
||||
#.#.###.#.###.#####.#.#########.#.###.#.#############.#.###.#.#.#.#.#.#####.#.###.#.#.#.###.#.#.#########.#.#####.#.#.###.#.#.###.#.#######.#
|
||||
#.#.......#...#.....#.#.....#...#...............#...#.#.#...#.#.#.#.#.....#.#.#...#.#.#.....#.#.#.......#...#.....#...#...#.#.....#.........#
|
||||
###.###.###.###.###.#.#.###.#.###.#######.###.###.#.#.#.#####.#.#.#.#####.#.#.#.###.###.#.###.###.#####.#####.#####.###.###.#####.#####.#.###
|
||||
#...#.....#.#.....#.#.#.#...#.#...#...#...#...#...#...#.#.....#...#...#...#.#...#.#.....#.........#...#.......#.......#.....#...#.....#.#...#
|
||||
#.#.###.###.#.#####.#.#.#.###.#.###.###.###.###.#######.#.#####.#####.#.###.#####.#######.#.#######.#.###.#######.#####.#####.#.#####.#####.#
|
||||
#.#...#.....#.#.....#.#.#.....#.#...#...#.#...#...#.....#...#.#.......#.#.........#.#.....#.......#.#.#...#.....#.#...#.#.....#.....#.....#.#
|
||||
#.#.#.#.###.#.#.#####.#.###.#.#.#.###.###.###.#.#.###.#.###.#.#########.###.#####.#.#.###########.#.###.###.###.###.#.#.#####.#####.#.###.#.#
|
||||
#...#.....#.#.#.......#.#...#.#...#...#...#.#...#.#...#.#...#.........#...#.....#.#.#.#...#.....#.#.....#...#...#...#.#.....#.#.....#.#...#.#
|
||||
#.#.###.#.###.#########.#.#.#.###.#.###.#.#.#.###.#.#.###.###.#######.###.#####.#.#.#.#.#.###.#.#.#.#####.###.###.###.#####.#.###.#.#.#.###.#
|
||||
#...#...............#...#.#...#...#...#.#...#...#...#.#...#.....#...#...#.......#...#...#...#.....#...#...#.#.#.....#...#.#.#...#.#...#.#...#
|
||||
###.###.#########.###.###.#.###.#####.#.###.###.#####.#.###.###.#.#.#.###.#####.###########.#.#########.###.#.#####.###.#.#.#.#.#.#.###.#.###
|
||||
#.#.....#.....#.....#.#.#.#.#.#.........#.#...#.#.....#.#.#...#...#...#...#...#.#.........#.#.#.......#.#...........#...#...#.....#.....#...#
|
||||
#.#####.#.###.#.###.#.#.#.#.#.#####.#####.###.#.#.#####.#.###.#######.#.###.#.###.#######.#.#.#####.#.#.#############.###.#####.#.#.###.###.#
|
||||
#.....#.#.#...#.#.#...#.#...#.....#.#.#.......#.#.#...#.#...#.#.....#...#...#...#.....#...#.#.......#...#.........#.............#.#...#.#...#
|
||||
#.###.#.#.#.###.#.#####.#####.#####.#.#.#######.#.#.#.#.#.#.#.###.#.#####.#.###.#.###.#.###.#.#########.#.###.#.###.#####.#####.#.#.#.###.#.#
|
||||
#...#.#.#.#.....#.....#...............#.#.......#...#.#.#.#.#.....#...#.........#.#...#.#...#.#.....#...#...#.#.........#.#.....#.....#...#.#
|
||||
###.#.#.#.#######.#####.###############.###.#.#######.#.###.#.###.#####.###.#####.#.###.###.#.#.###.###.###.#.#.#.###.#.###.###.#####.#.###.#
|
||||
#.#.#...#.#...........#.....#...#.#.....#...#.......#.#...#.......#...#...#.#.#...#...#.....#.#.#...#...#...#.........#.#...#.#...#...#...#.#
|
||||
#.#.###.#.#####.#####.#####.#.#.#.#.#####.#########.#.###.#########.#.###.#.#.#.#####.#########.#.###.#.#.###.#########.#.###.#.#.###.###.###
|
||||
#.#...#.#.#...#.....#...#.#...#...#...#.....#.....#...#.#...........#.......#.......#...#...#...#...#.#.....#.#.....#.....#.....#...#.#.#...#
|
||||
#.###.#.#.#.#.#######.#.#.#####.#####.#.###.#.#.#.#####.###################.#######.###.#.#.#.#.###.#.#######.#.###.#####.#.###.###.#.#.###.#
|
||||
#.......#...#.....#...#...#.....#...#.#...#...#.#.#.............#.........#...#...#.#.#...#.....#...#...#...#.....#.....#...#...#...#...#...#
|
||||
#.#####.#########.#.#######.#####.#.#.###.#####.#.#########.#.###.#.#####.###.###.#.#.###########.###.#.#.#.###########.#.###.#.#.###.###.#.#
|
||||
#.....#.#.......#.#.........#.....#.#...#.#.....#...........#.#...#.#...#...#...#.#...#.......#...#.....#.#.....#.......#...#...............#
|
||||
#.#.###.#.#.###.#.###########.#####.###.#.#.###################.###.#.#.###.###.#.###.###.###.#.#.#.#####.#.#.#.#.#########.#.#####.#.#.#####
|
||||
#.#.....#.......#.....#...........#.....#.#.....#.....#.......#.#...#.#...#...#.#.....#...#...#.#.#.#...#.#.#.#...#.........#.#.....#.......#
|
||||
#.#####.###.#.#######.#.###########.#.#########.#.###.#.#.#.#.#.#####.#.#.###.#.#.#####.#.###.#.###.#.#.#.#.#.#####.#.#######.#.#####.###.#.#
|
||||
#...#.......#.#.....#.........#.....#.#.....#.....#.#...#...#...#...#.#.#...#.#.#.......#.#.........#.#...#...#.....#...#.....#.#.......#.#.#
|
||||
###.#.#######.#.#########.#.###.###.#.###.#.#.#.#.#.#.#########.#.#.#.#.###.#.#.#####.#.###.#.###.###.#########.#######.#.#####.#.###.#.#.#.#
|
||||
#.#...#...#...#.......#...#...#...#.#.....#.....#.#...#.......#.#.#.#.#.....#...#.....#...#.#.#...#.#.#.................#.#.....#.#...#.#.#.#
|
||||
#.#####.#.#.#########.#.#####.#.#.#.###.#######.#.#####.#####.###.#.#.###.#######.###.#.#.#.###.###.#.#######.#####.###.#.#.#####.#.#.#.#.#.#
|
||||
#.......#.#.#.......#.#.#.....#.#.#.#...#.....#.#.....#.....#...#.#...#.#.#.....#.#.#...#...#.......#.......#.#...#.....#.#.....#.#...#...#.#
|
||||
#.#####.#.#.#.#####.#.#.#.###.#.#.#.#.###.###.#.#####.#.#.#.###.#.###.#.#.###.#.#.#.#.###.###.#.#.#.#######.###.#.#.#.###.#####.#.###.###.#.#
|
||||
#.#.......#...#.#...#...#.#...#.#.....#...#.#.#...#...#.#.#.#.....#...#.#...#...#.#.#.#...#...#...#.......#...#.#.#.#.......#...#...#...#.#.#
|
||||
#.#####.#######.#.###.#.#.#.#.#.#.###.#.###.#.#####.#.#.###.#.#########.###.#.###.#.#.#####.#####.#.#.#.#.###.#.#.#########.#.#####.#.#.#.#.#
|
||||
#...........#.#...#...#...#...#...#.....#...#...#...#.#...#.....#.......#.#.#.....#.#.......#.....#.#.#.....#.........#...#.#.....#...#...#.#
|
||||
#####.#.#.#.#.#.#######.#####.#.#.#.#######.###.#.#.#####.#######.#######.#.###.###.###########.###.#.#####.#########.#.#.#.#####.###.#.#.#.#
|
||||
#...#...#.#...#.....#...#...#.#.#.#.#.........#.....#...#.......#.....#...#...#.#...........#...#.#.#...#...........#...#.#.#.......#...#...#
|
||||
#.#.###.#.#########.#.###.#.#.#.#.#.###.#####.#.###.#.#.#######.#####.#.#####.#.#.###.#####.#.###.#.#####.#########.#####.#.#.#######.###.#.#
|
||||
#.#...#.#.........#.#...#.#.#.#...#...#.....#.......#.#.#.....#.....#.#.#.....#.#.#...#...#...#...........#.......#.#.....#...............#.#
|
||||
#.###.#.#########.#.###.#.###.#.#####.#####.#.#####.#.#.#.#.#####.#.#.#.#.#####.###.###.#.#.###############.#####.#.#.#########.###.###.#.###
|
||||
#...#.#.....#.....#.....#.#.........#.....#.#.#...#.#.#.#.#.......#...#...#.#...#...#...#.#.#.............#.....#...#.........#...#.....#...#
|
||||
#.#.#.#.###.#.###.#######.#.###.###.#####.#.#.#.#.###.#.#.#######.#####.###.#.###.#####.###.#.###########.#.#####.###########.#.#######.#.#.#
|
||||
#.#.#.#.....#.#.#.#.......#.#.....#...#...#...#.#.....#...#.....#.....#.#...#.........#...#.#.#.....#.#...#.#...#.......#...#...#.....#...#.#
|
||||
###.#.#.#####.#.#.###.#.#.#.#########.#.#######.###########.#.#######.#.###.#####.#.#.###.#.#.#.#.#.#.#.#####.#.#####.###.#.###.#.###.###.#.#
|
||||
#...#.......#.#.#.#...#.#.#.......#...#.........#.........#.#.......#.....#.......#.....#...#.#.#.#.#.#.#.....#...#...#...#...#.#.#.#.....#.#
|
||||
#.#########.#.#.#.#.#.#.#.#######.#.#############.#####.###.#####.###.###.#########.###.#####.###.#.#.#.###.#####.###.#.#####.###.#.#####.#.#
|
||||
#...#.....#.#.#...#.#...#.....#...#.#...........#.#.....#...#...#...#...#...#.......#.........#...#...#.#...#.......#.#.#...#.....#.....#.#.#
|
||||
#.#.#####.#.#.#.###.###.#####.#.###.#.#######.#.#.#.#####.###.#.###.###.###.#.#################.###.###.#.#.#######.#.#.#.###.#####.###.#.#.#
|
||||
#.#.....#...#.#...#...#.#...#.........#.......#.#.#.....#...#.....#...#...#.................#.....#.#...#.#.#.....#.#.#.#.....#...#...#.#.#.#
|
||||
#####.#.###.#.###.###.#.#.###.###.#####.#######.###.###.###.#.#######.#.#.#.#.#############.#####.#.#.###.###.###.#.###.###.###.#.###.#.#.#.#
|
||||
#...#.#...#...#.......#.#.#.....#...#...#.....#...#.#.#...#.#.#.....#.#.#.#.#...#.....#...#.#.....#.#.#.#.....#...#...#...#.#.#.#.#...#.#.#.#
|
||||
#.#.#####.###.#########.#.#.###.###.#.###.###.###.#.#.#.#.#.#.#.###.#.#.###.###.#.#.#.#.###.#.#####.#.#.#.#####.#####.###.#.#.#.#.#.#.#.#.#.#
|
||||
#.#.......#...#.........#.#.....#.#...#.....#.#...#...#...#.#.#.#.#...#...#...#.#...#...#...#.#...#.#.#...#...#.#...#...#.#...#.#...#.#.#.#.#
|
||||
#.#######.#####.#########.#.#.###.#####.###.###.#######.###.#.#.#.###.###.###.#.###.###.#.###.#.#.###.#####.#.#.#.#.###.#.#####.###.###.#.#.#
|
||||
#.#...#...#.....#.........#.#.....#...#...#.#...#.....#...#.#.#.......#.....#.#.........#.#.....#...#.......#.#.#.#.#...#.#.....#.#...#.....#
|
||||
#.#.#.#####.#####.#.#.#####.#####.#.###.###.#.###.###.#.#.#.#.#.#.#####.#.#.#.#####.#####.#########.#########.#.###.#.###.#.###.#.###.###.#.#
|
||||
#.#.#.#.....#...#...#.#.....#.....#.#...#...#.#...#.#.#.#.....#.#.#.....#.#.#.#.#...#...#.#.......#.........#.#.......#...#...#.....#...#...#
|
||||
#.#.#.#.#####.#.#.#.#.#.#####.#####.#.###.###.#.###.#.###.#####.#.#.###.#.###.#.#.###.#.#.#.#####.#######.#.#.#.#.###.#.#.###.#.#.#####.#.###
|
||||
#...#.#.......#.#.#.#.#.#.........#.....#...#.#...#.#...#...#.....#...#.#.....#.....#.#.#.....#...#.......#.#.#.#...#.#.#.......#.#.....#.#.#
|
||||
#.###.#.#######.#.#.###.#########.#.#######.#.###.#.###.#####.###.###.#.#######.#####.#.#.#####.###.#########.#####.#.#.###.###.#.#.#####.#.#
|
||||
#.#.#.............#...#...#.....#.#...#...#.#.....#...#.......#...#...#.#...#...#.....#.#.#.....#.............#.....#...#.....#...#...#.#.#.#
|
||||
#.#.#########.#.#.###.###.#.###.#.###.#.#.#.#########.#########.###.###.#.#.#.###.#####.###.#####.###########.#.###############.#.###.#.#.#.#
|
||||
#.....#...#...#.#...#...#...#.#.#...#.#.#.......#.......#.#.....#.#.#...#.#...#...#...#...#.......#...........#...#.............#...........#
|
||||
#####.#.#.#.###.#####.#######.#.###.###.#######.###.###.#.#.#####.#.#.###.###.#.#####.#.#.#.#####.#.#######.#.###.#.#########.#.#.#.#.#.#.#.#
|
||||
#.....#...#.#.......#.........#...#.....#.....#...#.#...#.#.....#...#.........#.....#...#.#.....#.#.#.......#...#.#.#.......#.......#.#...#.#
|
||||
#.#######.#.#.#####.###.###.#####.#######.#.#####.#.###.#.#####.#.#########.#####.#.###.#.###.#.###.#.#########.#.#.#.#####.#.#######.#.#.#.#
|
||||
#.#.....#.#...#...#...#.#...#.....#...#...#.#.....#...#...#.....#.#.......#.....#.#.#...#...#.#.....#.....#...#...#...#...#.................#
|
||||
#.#.###.#.#####.#.#.#.#.#.###.###.#.###.#.#.#.#####.#.#####.#####.###.#.###.###.###.#.###.#.#.#######.###.#.#.#.#######.#.#.###.#.#######.#.#
|
||||
#...#.....#...#.#...#...#.......#.....#.#.#.#.#.....#.#...#.#...#...#...#...#.#...#.#.....#.#.#.....#.#.#.#.#...#.......#.#.........#.......#
|
||||
#.#######.#.#.#.###.###.#####.#.#####.#.#.###.#######.#.#.#.#.#.###.###.#.###.###.#.#.###.#.###.###.#.#.#.#.#####.#.#########.#.#.#.#.#######
|
||||
#.#.....#.#.#.#.#.#...#.#...#.#.....#...#.....#.......#.....#.#.#...........#...#...#.#...#.....#.#.#...#.#.....#.#.........#.#.#.#.#.#.....#
|
||||
#.#.###.#.#.#.#.#.###.#.#.#.#######.#.#######.#.###.###.#####.#.#######.###.###.#####.#.#########.#.###.#.#######.#######.###.#.#.#.#.#.###.#
|
||||
#.#.#.......#...#...#.....#.......#.#...#...#...#...#...#.....#.....#...#...#.......#.#.........#...#...#.....#...#.....#.#...#.#.#.#.#.#...#
|
||||
###.#####.#########.#############.#.#####.#.#####.###.###.#.#######.#####.###.#####.#.#####.###.#.#####.#####.#.#######.#.#.###.#.#.#.###.#.#
|
||||
#...#.............#.....#.........#...#...#...#.....#...#.#.#.............#.....#...#.#.#...#...#.....#.....#.......#...#...#...#.#.......#.#
|
||||
#.###.###########.###.#.#.###########.#.###.#.#########.#.#.#.###.###.#####.###.#####.#.#.###.#######.#############.#.#.#####.#.#.#.#######.#
|
||||
#...#.#.....#...#...#.#...............#.#...#.........#.#.#...#...#.....#.#...#...#...#.#.#.........#...........#.#.#.#...#...#.#.#.#...#.#.#
|
||||
#.#.#.#.#.#.###.###.#.#####.#####.###.#.#.#.#########.#.#######.#.#.###.#.###.###.#.###.#.#####.#.#.#####.#####.#.#.#.###.#####.#.###.#.#.#.#
|
||||
#.....#.#.#...#.#...#...#.........#.....#.#.......#.#...........#.#.#.#.#.......#...#...#.....#.#.#.#.....#.....#.#...#.#.#...#.#.#...#.#.#.#
|
||||
#.#######.###.#.#.###.#.###.#####.#.###########.#.#.#####.###.#.###.#.#.#.#.###.#####.#.#####.#.#.#.###.#.#.#####.#####.#.#.#.#.#.#.###.#.#.#
|
||||
#.........#.#...#...#.......#.....#.#.........#.#.......#...#.........#.#.#...#...#...#...#...#.#.#.....#.#.....#...........#...#...#.#.#.#.#
|
||||
###########.#.#.###.#.#########.###.#.#.#####.#.#######.###.#.#########.#.###.###.###.#####.#.#.#.#######.#####.###############.#####.#.#.#.#
|
||||
#.....#.......#...#.#...#.......#...#.#.#...#...#.....#.....#.#.........#.......#.....#.....#.#.#.....#.#.....#...........#...#...#...#.#.#.#
|
||||
#.#.#.#.#.###.###.#.###.#.#####.#.#####.#.#######.###.#######.#.###############.#####.#.#######.#####.#.###.#############.###.#.#.#.###.#.#.#
|
||||
#.#.#.#.#.........#.#...#...#...#.#.....#.......#...#.#.....#.#.....#.....#.......#...#...#.....#.#...#.....#.........#...#.....#...#...#...#
|
||||
#.#.#.#.#####.#####.#####.###.#.#.#.#####.###.###.#.#.#####.#.#####.#.###.#.#.#####.#####.#.###.#.#.###.#####.#.#######.#.#.#######.#.#####.#
|
||||
#.#...#.#.#.....#...#.....#...#.#...#.......#.....#.#.......#.......#...#...#.#.....#...#...#.....#.#...#...#.#.........#.#.........#.#...#.#
|
||||
#.###.#.#.#.#.#.#.#.#.#####.#############.#########.#.#####.###########.#####.#.#######.#########.#.###.#.#.#.###########.#.#########.#.#.#.#
|
||||
#...#.#...#...#...#.#...#.#.............#.#.........#.#...#.#...#.......#.#...#.#.....#.........#.#...#.#.#...#.......#...#...#.....#.#.#.#.#
|
||||
###.#.#.#.###.#########.#.#######.#####.###.#########.#.#.#.#.#.#.#######.#.###.#.###.#.#######.#.###.#.#.#####.#####.#.#.###.#####.#.#.#.###
|
||||
#.#.#...#...#...........#...#.....#...#...#.#.#.....#.#.#.#.#.#.#...#.........#...#...#.......#.....#.#.#...#...#...#.......................#
|
||||
#.#.#.#.###.#.#.###########.#.###.#.#.###.#.#.#.###.#.#.#.#.#.#.###.#########.#####.#####.###.#####.#.#####.#.#####.#.#.#.#.#.#.###.#.#.###.#
|
||||
#.#.#.....#...#.....................#...#...#.....#...#.#.#...#.....#.....#.#...#.#.#...#...#.....#.#.....#...#.....#.#.#.#.#.#.#.#.#.#.#.#.#
|
||||
#.#.#.#####.#.#.#######.#####.#.###.###.###.#######.###.#.#######.###.###.#.###.#.#.#.#.###.#.###.#.#####.#####.#.###.#.#.#.#.#.#.#.#.#.#.#.#
|
||||
#.#.#.#...#...#.#...#...#.....#.#.#.#.#...#.#.....#.#...#.#...#...#...#...#.......#...#.#.......#.#...#...#...#.#.....#...#.....#...#.....#.#
|
||||
#.#.#.#.#.#.#.###.#.#.#.#.#####.#.#.#.###.###.###.###.###.#.#.#.###.###.#######.#######.#.###.###.#.###.###.#.#.#############.###########.#.#
|
||||
#.#.#...#...#.....#...#.#.#...#.............#.#.#...#.#.#.#.#.....#.#.#.......#.#.....#.#...............#...#.#.#.....#.....#.#.........#.#.#
|
||||
#.#.#.###.#.#.#########.#.#.#.#####.#.#.###.#.#.###.#.#.#.#########.#.#######.###.###.#.#####.#.#.#.#.###.###.#.#.###.#.###.###.#######.###.#
|
||||
#S............#.........#...#.........#...#.......#.....#.....................................#...#.#.......#.....#.....#.......#...........#
|
||||
#############################################################################################################################################
|
276
2024/day16/main.go
Normal file
276
2024/day16/main.go
Normal file
@ -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 '?'
|
||||
}
|
15
2024/day16/testinput
Normal file
15
2024/day16/testinput
Normal file
@ -0,0 +1,15 @@
|
||||
###############
|
||||
#.......#....E#
|
||||
#.#.###.#.###.#
|
||||
#.....#.#...#.#
|
||||
#.###.#####.#.#
|
||||
#.#.#.......#.#
|
||||
#.#.#####.###.#
|
||||
#...........#.#
|
||||
###.#.#####.#.#
|
||||
#...#.....#.#.#
|
||||
#.#.#.###.#.#.#
|
||||
#.....#...#.#.#
|
||||
#.###.#.#.#.#.#
|
||||
#S..#.....#...#
|
||||
###############
|
17
2024/day16/testinput2
Normal file
17
2024/day16/testinput2
Normal file
@ -0,0 +1,17 @@
|
||||
#################
|
||||
#...#...#...#..E#
|
||||
#.#.#.#.#.#.#.#.#
|
||||
#.#.#.#...#...#.#
|
||||
#.#.#.#.###.#.#.#
|
||||
#...#.#.#.....#.#
|
||||
#.#.#.#.#.#####.#
|
||||
#.#...#.#.#.....#
|
||||
#.#.#####.#.###.#
|
||||
#.#.#.......#...#
|
||||
#.#.###.#####.###
|
||||
#.#.#...#.....#.#
|
||||
#.#.#.#####.###.#
|
||||
#.#.#.........#.#
|
||||
#.#.#.#########.#
|
||||
#S#.............#
|
||||
#################
|
5
2024/day17/examples
Normal file
5
2024/day17/examples
Normal file
@ -0,0 +1,5 @@
|
||||
Register A: 0
|
||||
Register B: 2024
|
||||
Register C: 43690
|
||||
|
||||
Program: 4,0
|
5
2024/day17/input
Normal file
5
2024/day17/input
Normal file
@ -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
|
220
2024/day17/main.go
Normal file
220
2024/day17/main.go
Normal file
@ -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]
|
||||
}
|
78
2024/day17/main2.bk
Normal file
78
2024/day17/main2.bk
Normal file
@ -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
|
||||
}
|
5
2024/day17/testinput
Normal file
5
2024/day17/testinput
Normal file
@ -0,0 +1,5 @@
|
||||
Register A: 729
|
||||
Register B: 0
|
||||
Register C: 0
|
||||
|
||||
Program: 0,1,5,4,3,0
|
Loading…
Reference in New Issue
Block a user