Compare commits

...

10 Commits

Author SHA1 Message Date
5f7666ee13 Day 25, no part 2 lmao 2024-12-25 15:55:31 +01:00
46859764ad Fucking day 24 2024-12-24 23:57:15 +01:00
c6ca510a5c Day 23 2024-12-23 23:33:31 +01:00
865aaa1117 Day 22 2024-12-22 15:19:14 +01:00
1ea4c003ac Day 21 2024-12-22 00:25:38 +01:00
be16486655 Day 20 2024-12-20 15:33:32 +01:00
fac8626030 Day 19 2024-12-20 15:33:16 +01:00
4572482be6 Day 18 2024-12-20 15:33:16 +01:00
431ee3626a Day 17 2024-12-20 15:33:16 +01:00
68f5cce6fb Day 16 2024-12-20 15:33:16 +01:00
41 changed files with 15339 additions and 1 deletions

View File

@ -55,7 +55,7 @@ func (queue *CandidateQueue) Len() int {
}
func (queue *CandidateQueue) Less(i, j int) bool {
return queue.elements[i].Cnd.EstimateCost < queue.elements[i].Cnd.EstimateCost
return queue.elements[i].Cnd.EstimateCost < queue.elements[j].Cnd.EstimateCost
}
func (queue *CandidateQueue) Swap(i, j int) {

141
day16/data.txt Normal file
View File

@ -0,0 +1,141 @@
#############################################################################################################################################
#.....#.........#.............#.............................#...........#.............#.......#.....#...#...........#.........#.......#....E#
#.#.#.#.#.#######.#####.#####.#.#############.###.###.#.###.#.#####.###.#######.#.###.#.###.###.###.#.#.#.#######.#.#.#######.#.###.#.#.###.#
#.#.#...#...#.....#...#.....#.......#.....#.....#.#...#...#.#.#.....#.#.......#.#...#...#.#...........................#...#...#.#.#.#.#...#.#
#.###.###.#.#.#####.#.#####.###.###.#.###.#.#.#.#.#.###.#.#.#.#.#####.#.#####.#.#.#.#####.#######.###.#######.#######.#.#.#.#.#.#.#.#.###.#.#
#...#.#...#.#.....#.#.#...#.....#.....#.#...#...#.#.....#.#.....#...#.........#...#.#.......#...#.#...#...#...#...#...#.#.#...#...#.#...#.#.#
#.#.#.#.#.#.###.#.#.#.#.#.#####.#######.#####.###.#######.###.#####.#.###########.#.#.#####.#.#.#.#.###.###.###.#.#.###.#.###.###.#.#.#.###.#
#.#.#...#.#.....#.#.#...#.....#...#.......#...#.....#...#.........#.#.......#.....#.#.#.....#.#.#.#.#...#...#...#...#.#.#.......#.#...#.....#
#.#.#.###.###.#.#.#.#######.###.#.#####.###.#.#.#####.#.#.#.#.###.#.#######.###.#.#.###.###.#.#.#.#.###.#.###.#######.#.#.###.#.#.###.#####.#
#.#.#...#...#.#.#.#.....#...#.....#.....#...#...#.....#.#.#.....#...#.....#...#.#.#...#...#.#.#...#.....#.#...#...........#...#.#.#...#...#.#
#.#.#.#.#.#.#.#.#.#.#####.#.#.#####.#####.#.#.###.#####.#.#.#.#.#####.###.###.#.#####.#.#.###.#.#######.#.#.###.###.#.###.#.#.#.#.#.#.###.#.#
#.#...#.#...#...#.#.#...#.#.#.#...#.#...#...#...#...#...#.#.#.........................#.#.#...#.#.....#.#...#.....#.#.#...#.....#.#.#...#...#
#.###.#.#.#####.#.###.#.#.###.#.#.#.#.#.###.#.#####.#.###.###.###.#.###.#####.#.###.#.#.#.#.#####.#.#.#.###########.#.#.#.#.#####.#.#.#.###.#
#.....#...#...#.#...#.........#.#...#.#...#.#.#.....#.#.....#.#.....................#.#.#.#.#.....#.#.#.......#.....#.#.#...#.....#...#...#.#
#.#.#.###.#.#.#.###.#.###.#.###.#####.###.#.#.#.#####.#.###.#.#.###.#.###.#.#######.#.###.#.#.#####.#.#######.#.###.#.#.#.#.#.#.#####.###.#.#
#.#.....#.#.#.#...#...#.#.#...#.....#.#.#...#.#.#.#...#...#.#.....#.....#...#.....#.......#...#.....#...#...#...#...#.#...#...#.#...#...#.#.#
#.###.#.#.#.#.###.#####.#.###.#.###.#.#.#.#.###.#.#.###.#.#.#####.#.###.#######.#.#####.#####.#.#######.#.#.#####.#.#.###.#####.#.###.#.#.#.#
#.#...#...#.#.#...#.....#.#...#...#.....#...#...#.......#...#...#...#.#.#.......#...#...#...#.#.........#.#.......#.#...........#...#.#...#.#
#.#.#.#.#.#.#.#.#.#.#.###.#.#####.#########.#.###.###########.#.#####.#.#.###.#####.#####.#.#.#.#.#######.#####.###.###.#.#.#####.#.#.#.#####
#...#.#.#...#...#...#.#...#.#.#.....#.....#...#...#.......#...#...#.....#.#...#...........#.#.#.#...#...........#.#...#.#...#.....#.#.#.#...#
#####.#.#.#######.###.#.###.#.#.#####.###.#.#######.#####.#.#####.#.#.#.#.#.#.#############.#.#.#####.#.###.#####.###.#.#########.#.#.###.#.#
#.....#.#.....#...#.#.....#.#...#.....#.#.#.#.......#...#...#.....#.#.#.#.#.......#.....#...#.#...#...#.....#.......#.#.........#.#.........#
#.#.###.#####.#.###.#######.#.###.#####.#.###.#####.#.#.#####.#####.#.#.#####.###.#.#.###.#######.#.###.#.#########.#.#######.#.###.#.###.#.#
#.#.....#...#.#.#...#.....#.#.#...#.....#...#.....#...#.....#...#...#.......#.#...#.#.#...#.......#.#...#.#.................#...#...#...#.#.#
#.#######.###.#.#.#.#.###.#.#.#.#####.#####.#####.#.###.#####.#.###########.#.#.#####.#.#####.###.#.#.#.#.#.#####.#.###.#####.###.###.#.###.#
#.......#.#...#.#.#.#...#...#.#.....#.#...#.#.....#.#...#...#.#.#.....#...#.#.#...#...#.....#...#.#...#.#...#...#.#...#.....#...#...#.#...#.#
#######.#.#.#.#.#.#.###.###########.#.#.#.#.#.#####.#.###.#.#.#.#.###.###.#.#.###.#.#######.#.#.#######.#######.#.#####.###.###.###.#.###.#.#
#.....#...#.#.#.#.#...#.....#.....#.#.#.#...#...#...#.#...#.#.#...#...#...#.#.#...#.......#.#.#.......#...#.....#.#...#.#.#.....#...#...#...#
#.#####.###.#.#.###.#######.#.###.#.#.#.#.#.###.#.#.###.###.#######.###.#.#.###.###.###.#.#.#.#######.###.###.#.#.#.#.#.#.#.#####.#.###.###.#
#.......#...#.#...#.....#.#.#.....#.#.#.#.#...#.#...#...#...........#.#.....#...#.#.#.#.#.#.#.......#...#.....#.#...#...#.........#...#...#.#
#.#######.###.###.#.#.#.#.#.###.#.#.#.#.###.#.#.###.#.###.###.#.#.###.#.#####.###.#.#.#.#.#.#####.###.#########.#.#############.#####.###.###
#.........#...#...#.#.#.#.#...#.#.#...#...#.#.......#.#.#.#...#...#...........#.......#.#.#.........#.....#...#.#...#.........#.#.....#.#...#
#.#######.#.###.###.#.#.#.#.#.#.#.###.###.#.#######.#.#.#.#.#.###.###################.#.#######.###.###.#.###.#.#.#.#.#.#####.#.#.#####.###.#
#.#.......#.#.#.#...#.#...#.#.#.#.#.....#...#.....#...#...#.#...#.#...#...............#...........#.#...#.....#.#.#.#.#.....#.#.#.#.......#.#
#.#.#######.#.#.###.#.###.#.#.#.#.#.#####.###.###.#.###.###.###.###.#.#.#############.#.###.#######.#.#######.#.#.#.#######.#.#.#.#.#####.#.#
#.#.#...#.....#...#.#.#...#.#...#.#.#.........#...#...#...#.#.#.........#.......#...#.#...#...#.......#.#.....#...#.........#...#.#...#.#.#.#
#.#.#.#.#########.#.#.###.#.#.###.#.#.#########.#####.###.#.#.###########.#####.###.#.#######.#.#####.#.#.#############.#####.###.###.#.#.#.#
#.................#.#...#.#...#.#.#.#.......#.#.#.....#...#.#.......#.......#.......#...#...#.#.#...#...#.#...#.........#...#...#...#.#...#.#
#.#####.#.#########.###.#######.#.#.#######.#.#.#.#####.###.#.#####.#######.#.#########.#.#.#.#.#.#.#.#.#.#.#.#.#####.#.#.#.#.#.###.#.#.###.#
#.#...#...#.....#...#.#.#.......#.#...#...#.#.........#.#.....#.........#...#.#...#...#.#.#.#...#.#.#.#.#.#.#.#.#...#.#.#.#...#.....#.#.#.#.#
#.#.#####.#####.#.###.#.#.#.#####.###.#.#.#.#######.#.###.###.#########.#.#.###.#.#.#.#.#.#.#####.#.###.#.#.#.#.#.#.#.###.###########.#.#.#.#
#...#...#.....#...#...#.#.#.....#.....#.#...#.....#.#...#...#...#...#.#...#.#...#...#.#...#.......#...#.#.#.#.#.#.#.#...#.#.#.........#...#.#
#.###.#.#####.#.###.#.#.#.#####.#######.###.#.###.#.###.###.#.#.#.#.#.#.#.#.#.#######.#####.#########.#.#.###.#.#.#.###.#.#.#.#######.#####.#
#...............#...#.#.....#.....#.....#.#.#.#.#.#...#...#.#.#...#.#.#.#.#.#...#.........#...#.#.....#.....#.#...#.#...#.#...#...#...#.....#
#.#.###.#.#.#.#.#####.#######.#####.#####.#.#.#.#.###.#.#.#.#.#####.#.#.#.###.###.#.#.###.#.#.#.#.#########.#.#####.#.###.#.###.#.#.#.#.###.#
#.#...#.#.#...#...........#...#.....#...#...#...#.#...#.....#.#...#.#...#.........#.#.#.#...#.#.#.......#...........#...#.#.................#
###.###.#.#####.#.#########.#.#.#####.#.#####.###.#.#####.#.#.#.###.#.#.#.#####.###.#.#.#####.#.#######.#.#####.#.#.###.#.#.#.#######.#.#.#.#
#...#...#.#.....#.#...#...#.#.#.......#...#...#...#.#.#...#.#...#...#.#.#...#.#.#.#...#.....#.....#...#.#.#...#...#...#...#.#.#.....#.#.#...#
#.###.###.###.#.###.#.#.#.#.#.###########.#.###.###.#.#.###.#####.###.#.###.#.#.#.#########.###.###.#.#.###.#.#######.#.#.#.#.#.###.#.#.#.###
#.#.#.#.......#.....#.#.#...#.....#.....#...#.#.......#...........#.#.#.......#.#.............#.#...#.#...#.#.......#.#...#.#.#.#...#.#.#.#.#
#.#.#.###############.#.#########.#.#.#.#####.#####################.#.###.#####.#.###.#####.###.#.###.#.#.#.#.#.#.#.#.#######.#.###.###.#.#.#
#...#...............#.#.#.........#...#.......#.#.........#...#.................#...#.....#.#...#.#.#.#.#.#.#...#.#.#.#.....#.#...#.....#.#.#
###.###############.#.#.#.#####.#.###.###.###.#.#.#######.#.#.###.#################.#####.###.###.#.#.#.#.#.#####.###.#.###.#.###.#######.#.#
#.#.#.........#...#.#.#.#.#...#.#...#...#.#.......#.....#...#...#...#.......#.....#.#...#.......#.....#.#.#...#.#.....#...#...#...#.#.....#.#
#.#.#.#######.#.#.#.#.#.#.#.#.#.###.#.###.#.#####.#.###.#######.###.#.#####.#.#.#.###.#.#.#######.#.###.#.###.#.#########.#.###.###.#.#.###.#
#.#.#...#...#...#.#.#...#...#.#.#...#.#...#...#...#.......#.....#...#.....#.#.#.......#.#.#.......#...#.#...#...#.........#.#.............#.#
#.#.#.#.#.#######.#.#.#######.###.#####.###.###.###.###.###.###.###.#.###.#.#.#########.###.#########.#.###.###.#.#########.#.#####.#.#.#.#.#
#.#.#.#.#.....#...#.........#...#.#.....#...#...#.#...#...#.......#...#...#.#.........#.#...#.......#.#.#.#...#...#.........#.....#.....#...#
#.#.###.#.#.###.###########.#.#.#.#.#.###.###.###.###.###.#######.###.#.###.###.#####.#.#.###.#.###.#.#.#.#.#######.#########.###.#####.###.#
#.#.....#.......#.....#...#.#.#.#.#.#.#.....#.#.....#.#.#.......#.....#...#...#.#...#.#.#...........#.#...#.......#.#.....#.......#.......#.#
#.#######.#####.#.#.#.#.#.#.#.#.#.###.#.#####.###.#.#.#.#.#####.###.#.#.#.###.#.#.#.#.#.###.###.#####.#####.#####.#.#.#####.#.#####.###.#.###
#.....#.#.....#...#.#...#.#.#.#.#.....#.#.....#...#.#...#.#.#...#...#.#...#...#...#.#.#.#.......#...#.............#...#.....#.#.........#...#
#.###.#.#####.#####.###.#.#.#.#.#.#######.#####.#####.###.#.#.#.#.#####.###.#######.#.#.#.#######.#########.#.#######.#.#######.#######.###.#
#...#.#.............#.....#.#.#...#.......#.....#.....#...#.#.#.#.....#.#...#.......#.#.#.....#...#.........#.#.......#.....#.......#.......#
#.#.#.###.#.#########.#####.#######.#########.###.#####.###.#.#.#####.#.#.###########.#.#####.#.###.###.###.#.#.###########.#.#.#####.#.###.#
#.#.#...#.#...#.............#.......#.......#.#...#...#.#...#.#.....#.#.#...#.....#...#.......#.....#.......#.#.....#.....#...#.....#.#...#.#
#.#.#.#.###.#.#.#####.#####.#.#######.#####.#.#.###.###.###.#.###.#.#.#.###.#.###.#.###########.#####.###.###.#####.#.###.#####.###.#.#.###.#
#...........#.#.#...#.#.....#.#.......#.....#.#.....#...#...#.....#.#.#...#.#.#...#.#...........#...#.#...#.......#...#.....#...#.#.#.#.....#
#.#.#.#########.#.#.#.#.###.#.#######.#.#####.#.#####.###.#.#######.#.###.#.#.#.###.#######.#.###.#.#.#.###.#.#.#######.#####.#.#.#.#.#.#####
#.#.#.#.........#.#...#...#.#...#.....#...#...#.#.....#.....#.....#.#.....#.#.#.#.#...#...#...#...#.#.#...#.#.#.........#.#...#...#.#.#.#...#
#.#.#.#.#########.###.###.#####.#.#######.#.###.#.#####.###.###.###.#####.#.#.#.#.#.#.#.#.#.###.#####.#.#.#.#.#.#########.#.###.#.#.#.#.###.#
#.#.....#.....#...#...#.#.....#...#.....#.#.....#.#.....#.#.....#...#.#.#.#...#.#...#.#.#.#.....#.....#...#.#...#.........#...#...#...#.....#
#.###.###.#.#.#.###.###.#####.#####.###.#.#######.#.#####.#.#.#.#.###.#.#.#####.#.###.#.#.#######.###.#.#####.###.#######.#.#.#.###########.#
#.......#.#.#...#.#.....#...#.#...#.#...#...#.....#...#.....#...#.#...#.#.#.....#...#...#.......#.#...#.....#...#...#.....#...#.....#...#...#
#####.#.###.#####.#####.#.#.#.#.#.#.#.#####.#.#######.#.#.###.###.#.#.#.###.#######.###########.#.#########.###.#####.#####.###.#.#.###.#.###
#.....#.....#...#.....#...#.#...#...#.....#.#...#.....#.#.....#.#...#.#...#.#...#...#.......#...#.#...#...#.#...#.....#.....#...#.#.#...#...#
#.###.#######.#.#####.###.#.###########.###.#.#.#.#####.#######.#####.###.#.#.###.#######.#.#.###.#.#.#.#.#.#.###.###.#.#.###.#.#.#.#.#.###.#
#...#.#.......#.......#.....#...#.......#...#.#.#.#...#.#.........#.#...#...#...#.......#.#.#.#.#...#...#.........#...#.#.....#...#...#.#...#
#.#.#.#.###########.###.#######.#.#.#####.#####.#.#.#.#.#.#######.#.###.#####.#.#.#####.#.#.#.#.#.#############.#######.#.###.#####.#####.###
#.#.#.#.#.....#...#.....#.....#.#.......#.....#.#.#.#.#.#.....#.......#.....#.#...#...#...#.#.#.#...#...#.......#.........#...#...#.#.......#
###.#.#.#.###.#.###.#.#.###.#.#.#.#####.#####.#.#.#.#.#.#####.#.###########.#######.#.#####.#.#.###.#.#.#.#######.#######.#####.#.###.#####.#
#...#...#.#...#.....#.#...#.....#.....#.....#.#.#.#.#.#.......#...#.......#.......#.#...#...#.#...#...#.#...#...#...#.....#.....#...#.#...#.#
#.###.###.#.###.#.#.#.#.#.#.###.#.###.#####.#.#.#.#.###########.###.#####.#######.#.#.#.#.#.#.#.#.#####.###.#.#.###.#####.#.#######.#.#.#.###
#.#.......#.#...#...#...#...#...#.#.#.....#...#.#.#.........#...#...#...#...#.....#.#...#...#.#.#.#.........#.#...#...............#...#.#...#
#.#.#######.#.###############.###.#.#####.#####.#.#.#######.#.###.#####.###.#.#.###.#.#######.#.###.#######.#.###.#####.#.#############.###.#
#...#.............#.........#.#...#.....#.......#.#.#.....#.#...#.........#.#.......#.........#...#.......#.#.#.#.....#.#...#...........#.#.#
#.###.#.#####.#.#.#######.#.#.#.#.#.###.#########.#.#####.#.###.#########.#.###################.#.#######.###.#.#####.#.#####.###########.#.#
#...#.#...#...#.#...#.....#.#...#...#.....#.......#...#...#...#.#.#.....#.#...........#.........#.......#...#.#.......#.....#.....#.......#.#
###.#.###.###.#.###.#.#####.#####.###.###.#####.#####.#.###.###.#.#.###.#.###.#######.#.#####.#.###.###.###.#.#.###.#.#.#.#.#####.#.#####.#.#
#.#.#...........#...#.#...#.#.......#.#...#...#.#...#.#...#...#...#.#...#.#.#.....#.....#...#.#.#.#.#.....#...#.#...#.#...#.....#.#...#.....#
#.#.#.#####.#######.#.#.#.#.#########.#.###.#.#.#.#.#.###.###.###.#.#.###.#.#####.#####.#.#.#.#.#.#.###########.#####.#.###.#####.###.#.#.#.#
#.#.#.....#...#...#.#.#.#...#.........#.#...#.#.#.#.#.......#.....#.#...#.#.#...#.....#...#...#...#.#.......#...#.....#...#.....#...#.#...#.#
#.#.#.#.#####.#.#.#.#.#.#####.#########.#.###.#.#.#.#.#############.###.#.#.#.#.#####.#####.#.###.#.#.###.#.###.#.###########.#.###.#.###.#.#
#...#.#.#.....#.#.#...#.#.....#...#.......#...#.#.#.#.#...............#...#...#.....#.....#...#...#.#...#.#.....#.#.#.......#.#.....#...#.#.#
#.#####.#.#####.#.#####.#.#####.#.#.#########.#.#.#.#.#.#################.#.#######.#####.#####.###.###.#.#####.#.#.#.#.###.#.#######.#.#.#.#
#.......#.......#.#...#.#.....#.#.#.#.......#.....#.#.#.............#...#.#...#.....#.........#.#.#.....#.....#.#.#.#.#.#...#.........#.#.#.#
###.#########.#.#.#.#.#.#####.#.#.#.#.#####.#####.#.#########.#####.#.#.#.###.#.###.#.#.#####.#.#.###########.###.#.#.#.#.#############.#.#.#
#...#.........#.#...#.#.....#.#.#.#.#.....#.......#.....#...#...#...#.#.#...#.#.#.#.#.#.....#.#.......#.....#.....#.#.#.#...........#.#.#.#.#
#.###.#######.#.#####.#####.#.###.#.#####.#############.#.#.###.#.###.#.###.###.#.#.#######.#.#######.#.###########.#.#.###########.#.#.#.#.#
#...............#...#.#.......#...#...#...........#...#...#.......#...#...#...#.#...#.....#.#...#.#...#.#...#.....#...#...#...#.....#...#.#.#
#.#.#.#.#.###.###.#.#.#########.#.#.###.#########.#.#.###.#########.#####.###.#.###.#.###.#.#.#.#.#.###.#.#.#.###.#.#####.#.###.#####.###.#.#
#.....#...........#.#.....#.....#.#.#...#.....#...#.#...#...#...#...#.....#...#...#...#.#...#.#.....#.....#.#...#.#.#...#.#.........#.#...#.#
###.#.#######.#####.#####.#.#.#.###.#.###.###.#.###.###.#.###.#.#.###.#####.#####.#####.###.#.#####.#####.#.###.#.#.#.#.#.#.#######.###.###.#
#...#.#...#...#...........#...#.....#...#.#.#.#...#...#.......#...#.........#.....#...#.....#.#...#.....#.#.....#...#.....#...#...#...#.#...#
#.###.#.#.#.#.#########.#.#####.#######.#.#.#.###.###.#############.###.#.#####.###.#.###.###.#.#.#####.#.###########.#########.#.###.#.###.#
#...#...#...#.#.......#.#.....#.#.....#.#.#...........#.#.........#...#.#.....#...#.#.......#...#.#.....#.#.........#...........#.#.........#
###.#########.#.#####.#.#####.#.#.###.#.#.#############.#.#######.###.#.###.#.###.#.###.###.#####.#.#####.#.###.#####.###########.#.#####.#.#
#.#.#.......#.#.....#.#.......#.#...#.#.#.....#.........#.#.....#.#...#.....#.#...#.#.#.#.......#.#.#.#...#.#...#...#.#.....#.....#.......#.#
#.#.#.#######.###.###.#########.###.#.#.#####.#.#######.#.#####.#.#.#########.#.#.#.#.#.#####.###.#.#.#.#####.#.#.#.#.#.###.#.#############.#
#...#...#.....#...#...#.......#...#.#.#.....#.#.....#...#.....#.#...#.......#.#.#.#.#.....#...#...#.........#.#.#...#.#.#.#.#.#.#.........#.#
#.###.#.#.###.#.###.###.#######.###.#.#####.#.#####.#.#.#.#.#.#.#######.###.#.#.#.#.#####.#####.#.#.###.#.#.#.#.#.#.###.#.#.#.#.#.###.#####.#
#.#...#.#...#.#.#.#.#...........#...#.#.....#.#.......#.#.#.#.#...#...#.#...#...#.#...#.....#...#.#...#...#...#.#.#.#...#.................#.#
#.#####.###.#.#.#.#.#.###########.###.#.#####.###.#.#.###.#.#.#.#.#.#.#.#.###.#####.#.#.###.#.###.###.###########.#.#.###.###.#####.###.#.#.#
#.......#...#.#...#.#.......#.....#.#...#...#...#...#...#...#...#.#.#...#...#.#...#.#...#.#.....#.#.#.#...........#.#...#.#...#.....#...#...#
#########.###.###.#.#.#######.#####.#####.###.#.###.###.#.#.#####.#.#######.###.#.#.###.#.#####.#.#.#.#.###########.#.#.#.###.#.###.#.#######
#.........#...#...#.#.#.......#...........#.....#.#.#.#...#.#...#...#.....#.....#.#.#...#.......#...#.#.#.........#.#...#...#...............#
#.#######.###.#.###.#.#.#######.#######.###.#####.#.#.#####.#.#.###.#.#.#########.#.#.###.###.#####.#.#.#.#######.#.#.#####.#.#.#.#####.#.###
#...#...#.#.....#...#.#.#.....#.#.....#.#...#.......#.......#.#...#...#.........#.#.#.#.....#.......#.#.#...#.....#.#.....#...#.#.#.....#...#
###.#.#.#.#.#.###.#####.#.###.#.#####.#.#.###.#########.#####.###.#.#####.#####.#.#.#.#####.#########.#.###.#.###.#.#.###.#######.#.#####.#.#
#...#.....#.....#.#.....#.#.#...#.....#.#...#...........#...#...#.....#...#.....#.#.#.....#.........#.#.#...#.#.#.#.#.#...#.....#.#...#...#.#
#.###.#.#####.#.#.#.#####.#.#####.#####.###.###.#########.#.###########.#.#######.#######.#####.###.#.#.#.###.#.#.#.###.###.###.#.###.#####.#
#.#.....#.....#.#.#.....#.#.....#.#...#...#...#...........#...........#.#.#.......#.......#.#.......#...#.#...#...#...#.....#...#...#.#.....#
#.###.#.#.#.#.#.#.#####.#.#.#.#.#.#.#.###.###.#####.#.#####.#########.#.#.#.#######.#######.#.#########.###.###.#####.#.#####.#####.#.#.#.#.#
#.........#.....#.....#.#.#.#.#...#.#.......#.....#.#.........#.......#.#.......#...#.......#.#.............#.#.....#.#...#...#.....#...#.#.#
#.###.#.###.#.#####.#.#.#.###.###.#.#########.###.#.#.#######.#.#######.#######.#.###.#.#####.#.#########.###.#.#####.#.###.###.#.#.#####.#.#
#...#.....#.....#.....#.#...#...#.#.#.......#.#...#.#.#...#...#.#.............#...#...#.#.....#.#...#...#.#.....#.....#.#...#...#.#...#.....#
###.#.#.#.###.###.#.###.#.#.###.#.#.#.#####.###.###.#.#.#.#.###.###.#######.#.#####.###.#.#####.#.#.#.###.#.#.###.###.#.#.###.###.###.#.#####
#.#.#...#...#.....#.#...#.#.#...#...#.#...#...#...#.......#...#...#.#.......#.#.......#.#.#...#...#...#...#.#.....#...#.#.#.....#.#...#.....#
#.#.#.#.###.#.#######.#####.#.#.#.###.#.#.###.#.#.#.#########.###.###.#.#####.#.#####.#.#.#.#.#######.#.#####.#######.#.#.#####.#.#.#######.#
#.....#...#.#.......#...#...#...#.#...#.#.........#.#...#...#...#.#...#.......#.....#.#.#.#.#.#...#.#.#.......#.....#...#...#...#.#.#.....#.#
#.###.#.#.#.#.#####.###.#.###.#.#.#.###.#.###########.#.#.#.###.#.#.#.#.#####.#####.#.#.#.#.#.#.#.#.#.#.#####.#.###.#.#####.#####.#.#.#.###.#
#.#.......#.#.#.......#...#.............#.#...#.......#.....................#.......#.......#...#...#.....#.....#...#.....#.....#.#.#.#.....#
###.###.###.#.#.#####.#####.#.#########.#.###.#.###.#######.#.#########.#.#.#######.###.###############.#.###.###.###.#########.#.#.#.#######
#...#...#.......#...#...#...#.#.......#.#.#...#.#.........#.#.#...#.....#.#.......#.....#...............#...#...#.#...#.........#.#.#.#.#...#
#.###.#.#####.###.#.###.#.#.#.#.#####.#.#.#.#.#.###.#.#####.#.#.#.#.###.#.#######.#####.#.#########.#.#.###.#.#.#.#####.#########.###.#.#.#.#
#.#...#...#.......#.........#...#...#.#.#...#.#.....#.#...#.#...#...#.....#.....#...#...#.....#.#...#.#...#.....#.....#...#.........#.#...#.#
#.#.#####.###.#############.#####.###.#.#############.#.#.#.#.#######.#.###.#######.#.#.#####.#.#.#####.#.###########.#.#.###.#####.#.#####.#
#...#...#...#.#.....#.........................#...#...#.#...#.......#.#.........#...#.......#...#.#...#.#.........................#.#.......#
#.###.#.###.###.###.#.###.###.###.#.###.#####.#.#.#.###.#############.#.#######.#.###.#.#######.#.#.#.#.#####.#.###########.#.###.#.#######.#
#S....#...#.......#.....#.......#...........#...#.....#.........................#.....#.........#...#.......#...............#.....#.........#
#############################################################################################################################################

15
day16/example.txt Normal file
View File

@ -0,0 +1,15 @@
###############
#.......#....E#
#.#.###.# ###.#
#.....#.#...#.#
#.###.#####.#.#
#.#.#.......#.#
#.#.#####.###.#
#...........#.#
###.#.#####.#.#
#...#.....#.#.#
#.#.#.###.#.#.#
#.....#...#.#.#
#.###.#.#.#.#.#
#S..#.....#...#
###############

17
day16/example2.txt Normal file
View File

@ -0,0 +1,17 @@
#################
#...#...#...#..E#
#.#.#.#.#.#.#.#.#
#.#.#.#...#...#.#
#.#.#.#.###.#.#.#
#...#.#.#.....#.#
#.#.#.#.#.#####.#
#.#...#.#.#.....#
#.#.#####.#.###.#
#.#.#.......#...#
#.#.###.#####.###
#.#.#...#.....#.#
#.#.#.#####.###.#
#.#.#.........#.#
#.#.#.#########.#
#S#.............#
#################

3
day16/go.mod Normal file
View File

@ -0,0 +1,3 @@
module stevenlr.com/aoc2024/day16
go 1.23.3

138
day16/main.go Normal file
View File

@ -0,0 +1,138 @@
package main
import (
"bufio"
"container/heap"
"fmt"
"math"
"os"
"strings"
)
func main() {
fmt.Println(7036, 45)
fmt.Println(part1And2(readData("example.txt")))
fmt.Println(11048, 64)
fmt.Println(part1And2(readData("example2.txt")))
fmt.Println(89460, 504)
fmt.Println(part1And2(readData("data.txt")))
}
type Position struct {
x, y int
}
type PositionDir struct {
x, y int
dir int
}
type Candidate struct {
x, y int
dir int
cost int
visited []PositionDir
}
type CandidateQueue struct {
elements []Candidate
}
func (queue *CandidateQueue) Len() int {
return len(queue.elements)
}
func (queue *CandidateQueue) Less(i, j int) bool {
return queue.elements[i].cost < queue.elements[j].cost
}
func (queue *CandidateQueue) Swap(i, j int) {
queue.elements[i], queue.elements[j] = queue.elements[j], queue.elements[i]
}
func (queue *CandidateQueue) Push(x any) {
queue.elements = append(queue.elements, x.(Candidate))
}
func (queue *CandidateQueue) AddElement(candidate Candidate) {
heap.Push(queue, candidate)
}
func (queue *CandidateQueue) Pop() any {
if len(queue.elements) == 0 {
return nil
} else {
elmt := queue.elements[len(queue.elements)-1]
queue.elements = queue.elements[:len(queue.elements)-1]
return elmt
}
}
func cloneVisited(v []PositionDir) []PositionDir {
clone := make([]PositionDir, len(v))
for i, p := range v {
clone[i] = p
}
return clone
}
var directions = [4][2]int{{1, 0}, {0, 1}, {-1, 0}, {0, -1}}
// Originally I had implemented A* for part1. But because of part2 I modified it to be
// dumber. I wish we had full requirements from the start so I wouldn't waste time...
func part1And2(maze [][]byte) (scorePart1, scorePart2 int) {
endX, endY := len(maze[0])-2, 1
startX, startY := 1, len(maze)-2
queue := new(CandidateQueue)
heap.Push(queue, Candidate{startX, startY, 0, 0, []PositionDir{{startX, startY, 0}}})
minCost := math.MaxInt
visitedCost := make(map[PositionDir]int)
onOptimalPath := make(map[Position]bool)
for queue.Len() > 0 {
candidate := heap.Pop(queue).(Candidate)
posDir := PositionDir{candidate.x, candidate.y, candidate.dir}
alreadyVisitedCost, alreadyVisited := visitedCost[posDir]
if alreadyVisited && alreadyVisitedCost < candidate.cost {
continue
}
visitedCost[posDir] = candidate.cost
tryDirection := func(dir int, cost int) {
fwdX := candidate.x + directions[dir][0]
fwdY := candidate.y + directions[dir][1]
realCostFwd := candidate.cost + cost
if maze[fwdY][fwdX] != '#' && realCostFwd <= minCost {
if fwdX == endX && fwdY == endY && realCostFwd <= minCost {
for _, p := range candidate.visited {
onOptimalPath[Position{p.x, p.y}] = true
}
minCost = realCostFwd
} else {
visited := append(cloneVisited(candidate.visited), PositionDir{fwdX, fwdY, dir})
c := Candidate{fwdX, fwdY, dir, realCostFwd, visited}
heap.Push(queue, c)
}
}
}
tryDirection(candidate.dir, 1)
tryDirection((candidate.dir+1)%4, 1001)
tryDirection((candidate.dir+3)%4, 1001)
}
return minCost, len(onOptimalPath) + 1
}
func readData(fileName string) (maze [][]byte) {
fp, _ := os.Open(fileName)
scanner := bufio.NewScanner(fp)
for scanner.Scan() {
maze = append(maze, []byte(strings.TrimSpace(scanner.Text())))
}
return
}

9
day16/simple.txt Normal file
View File

@ -0,0 +1,9 @@
#####
# E#
# # #
# # #
# # #
# # #
# # #
#S #
#####

3
day17/go.mod Normal file
View File

@ -0,0 +1,3 @@
module stevenlr.com/aoc2024/day17
go 1.23.3

115
day17/main.go Normal file
View File

@ -0,0 +1,115 @@
package main
import (
"fmt"
)
func main() {
fmt.Println("4,6,3,5,6,3,5,2,1,0,")
execute(729, 0, 0, []byte{0, 1, 5, 4, 3, 0})
fmt.Println("7,1,3,4,1,2,6,7,1,")
execute(46187030, 0, 0, []byte{2, 4, 1, 5, 7, 5, 0, 3, 4, 0, 1, 6, 5, 5, 3, 0})
// Example
// while (a != 0) {
// a = a >> 3
// print(a%8)
// }
// Data
// while (a != 0) {
// b = a % 8
// b = b ^ 5
// c = a >> b
// a = a >> 3
// b = b ^ c
// b = b ^ 6
// print(b % 8)
// }
part2([]byte{2, 4, 1, 5, 7, 5, 0, 3, 4, 0, 1, 6, 5, 5, 3, 0})
}
func solve(ops []byte, forOp int, startingA int64) bool {
if forOp < 0 {
fmt.Println(startingA)
return true
}
// For the last iteration, only the last 3 can be non 0.
// So we only have 8 values to test.
// For the other operands to invert, the higher bits are fixed
// so we only check the last 3 bits.
for n := range 8 {
a := (startingA << 3) | int64(n)
b := a % 8
b = b ^ 5
c := a >> b
b = b ^ c
b = b ^ 6
if byte(b%8) == ops[forOp] && solve(ops, forOp-1, a) {
return true
}
}
return false
}
func part2(ops []byte) (a int64) {
solve(ops, len(ops)-1, 0)
return
}
func execute(a, b, c int64, ops []byte) {
pc := 0
readOp := func() (op byte) {
op = ops[pc]
pc++
return
}
getCombo := func(op byte) int64 {
if op <= 3 {
return int64(op)
}
switch op {
case 4:
return a
case 5:
return b
case 6:
return c
}
panic("")
}
for pc < len(ops)-1 {
switch readOp() {
case 0:
a = a >> getCombo(readOp())
case 1:
b = b ^ int64(readOp())
case 2:
b = getCombo(readOp()) % 8
case 3:
if a != 0 {
pc = int(readOp())
}
case 4:
b = b ^ c
pc++
case 5:
fmt.Print(getCombo(readOp()) % 8)
fmt.Print(",")
case 6:
b = a >> getCombo(readOp())
case 7:
c = a >> getCombo(readOp())
}
}
fmt.Println("")
}

3450
day18/data.txt Normal file

File diff suppressed because it is too large Load Diff

25
day18/example.txt Normal file
View File

@ -0,0 +1,25 @@
5,4
4,2
4,5
3,0
2,1
6,3
2,4
1,5
0,6
3,3
2,6
5,1
1,2
5,5
2,5
6,5
1,4
0,4
6,4
1,1
6,1
1,0
0,5
1,6
2,0

3
day18/go.mod Normal file
View File

@ -0,0 +1,3 @@
module stevenlr.com/aoc2024/day18
go 1.23.3

204
day18/main.go Normal file
View File

@ -0,0 +1,204 @@
package main
import (
"bufio"
"container/heap"
"fmt"
"math"
"os"
"strconv"
"strings"
)
func main() {
positions := readData("example.txt")
maze := makeMaze(positions[:12], 7)
fmt.Println(part1(maze), 22)
positions2 := readData("data.txt")
maze2 := makeMaze(positions2[:1024], 71)
fmt.Println(part1(maze2), 284)
fmt.Println(6, 1)
fmt.Println(part2(positions, 7, 11))
fmt.Println(part2(positions2, 71, 1023))
}
type Position struct {
x, y int
}
type Candidate struct {
pos Position
estimateCost int
}
type CandidateItem struct {
cnd *Candidate
index int
}
type CandidateQueue struct {
elements []*CandidateItem
index map[Position]*CandidateItem
}
func MakeCandidateQueue() *CandidateQueue {
queue := new(CandidateQueue)
queue.index = make(map[Position]*CandidateItem)
return queue
}
func (queue *CandidateQueue) Len() int {
return len(queue.elements)
}
func (queue *CandidateQueue) Less(i, j int) bool {
return queue.elements[i].cnd.estimateCost < queue.elements[j].cnd.estimateCost
}
func (queue *CandidateQueue) Swap(i, j int) {
queue.elements[i], queue.elements[j] = queue.elements[j], queue.elements[i]
queue.elements[i].index = i
queue.elements[j].index = j
}
func (queue *CandidateQueue) Push(x any) {
candidate := x.(Candidate)
item := &CandidateItem{&candidate, len(queue.elements)}
queue.elements = append(queue.elements, item)
queue.index[candidate.pos] = item
}
func (queue *CandidateQueue) AddElement(candidate Candidate) {
item, alreadyIn := queue.index[candidate.pos]
if alreadyIn {
item.cnd = &candidate
heap.Fix(queue, item.index)
} else {
heap.Push(queue, candidate)
}
}
func (queue *CandidateQueue) Pop() any {
if len(queue.elements) == 0 {
return nil
} else {
elmt := queue.elements[len(queue.elements)-1]
queue.elements = queue.elements[:len(queue.elements)-1]
delete(queue.index, elmt.cnd.pos)
return elmt.cnd
}
}
func makeMaze(walls []Position, size int) (maze [][]byte) {
maze = make([][]byte, size+2)
for y := range maze {
maze[y] = make([]byte, size+2)
maze[y][0] = '#'
maze[y][size+1] = '#'
}
for x := range size + 2 {
maze[0][x] = '#'
maze[size+1][x] = '#'
}
for _, p := range walls {
maze[p.y+1][p.x+1] = '#'
}
return
}
func IntAbs(x int) int {
if x < 0 {
return -x
} else {
return x
}
}
func part1(maze [][]byte) (steps int) {
startX, startY := 1, 1
endX, endY := len(maze)-2, len(maze)-2
estimateCost := func(x, y int) int {
return IntAbs(x-endX) + IntAbs(y-endY)
}
realCost := make([][]int, len(maze))
for y := range realCost {
realCost[y] = make([]int, len(maze))
for x := range realCost[y] {
realCost[y][x] = math.MaxInt
}
}
realCost[startY][startX] = 0
queue := MakeCandidateQueue()
queue.AddElement(Candidate{Position{1, 1}, estimateCost(1, 1)})
for queue.Len() > 0 {
candidate := heap.Pop(queue).(*Candidate)
tryDirection := func(dx, dy int) int {
xNext := candidate.pos.x + dx
yNext := candidate.pos.y + dy
realCostNext := realCost[candidate.pos.y][candidate.pos.x] + 1
if xNext == endX && yNext == endY {
return realCostNext
} else if maze[yNext][xNext] != '#' && realCostNext < realCost[yNext][xNext] {
realCost[yNext][xNext] = realCostNext
queue.AddElement(Candidate{Position{xNext, yNext}, realCostNext + estimateCost(xNext, yNext)})
}
return -1
}
if cost := tryDirection(1, 0); cost >= 0 {
return cost
}
if cost := tryDirection(-1, 0); cost >= 0 {
return cost
}
if cost := tryDirection(0, 1); cost >= 0 {
return cost
}
if cost := tryDirection(0, -1); cost >= 0 {
return cost
}
}
return -1
}
func part2(walls []Position, size int, okAt int) (blockX, blockY int) {
koAt := len(walls)
for koAt-okAt > 1 {
pivot := (okAt + koAt) / 2
maze := makeMaze(walls[:pivot+1], size)
result := part1(maze)
if result < 0 {
koAt = pivot
} else {
okAt = pivot
}
}
return walls[koAt].x, walls[koAt].y
}
func readData(fileName string) (positions []Position) {
fp, _ := os.Open(fileName)
scanner := bufio.NewScanner(fp)
for scanner.Scan() {
line := strings.Split(strings.TrimSpace(scanner.Text()), ",")
x, _ := strconv.Atoi(line[0])
y, _ := strconv.Atoi(line[1])
positions = append(positions, Position{x, y})
}
return
}

402
day19/data.txt Normal file
View File

@ -0,0 +1,402 @@
rwgw, ruwgb, urwbr, wu, uurbubr, gbbr, uwwb, rubgwu, wggwbwr, rugubuww, uw, rgru, rgrr, rrg, rbb, uurbrww, br, uwrwrwgb, bwbw, wgbu, wggu, urg, ugr, ugur, gurrbrr, ubgrruu, bb, rburguu, urgg, wggugggr, brww, bwwgr, wugub, grgg, ugw, grubw, gbwru, rww, wbu, ggwbu, ugurw, ggwb, uubuwgb, bbugw, rgg, wurr, bwbb, wburbb, rbrb, bbrwgw, gwbb, ubggr, gurr, rrr, rburg, uug, bbrubu, bwgu, gwug, guw, buwurgw, rruwggg, ubb, wwb, wbrg, wgr, wgrw, gubrr, rrwru, gbub, rbr, rwr, rubwu, ub, bgwr, gu, ggggwrbr, wrw, grg, rbuwu, bgbr, ugww, wrg, brwub, gruu, gbwbw, wubw, wur, grggwb, uuwuug, wug, rruuw, wgwg, uww, gbgu, rurr, gwguu, gwrwbw, guuww, rbugw, gg, uwbw, ubgrubur, wurrb, rgugurr, wrr, buggb, urwrb, ubuu, rgu, gwggb, uuu, uub, bruubb, bww, uwgb, rrubwg, ubwu, ugu, buwrrbwr, bbr, rbrww, ubuwg, bwwrr, gbwg, bw, gguugu, bgbbw, ggb, wrruuwbr, rug, uur, rgw, gbb, wuwg, r, guug, gwb, wbgr, bbbw, grwgwr, gwg, rurur, bubu, rguu, brb, ugbbbrr, wugrrr, bbw, bbru, bgrbubg, ubw, uruu, wgrgrwwr, bbwrugu, gbbbwur, rubbwbuw, wuwrwbu, brwbru, wub, rbrg, wwbwrbu, grbbu, ubbbwb, urw, gwuw, uu, urwugu, bgw, gw, rbwwwurg, gubr, bbu, rur, rburwgr, gwwgr, gb, rbur, rbw, ug, wurur, gbbrrb, ruuuwugr, wwrgug, gbrugu, wrww, wuwbgw, uwwwgrgb, gww, grwwu, ggu, rrurr, bgr, ubugwu, wwgwur, urrrbw, bwr, wrbgbu, wrwbb, gug, bwu, ruurw, rw, wbb, bbwgwrr, wgg, ugwu, wr, wwwr, w, wbwbuw, guugg, bug, bbbb, brbb, brur, rbg, wuu, wurwgb, rru, urrrbugr, grr, rubu, uugrwbb, bgbrurr, wgw, gub, ugwwgr, urwr, wbwbg, wrrb, rwrgg, ggwgrgw, bwbu, uwb, rg, urr, brrur, wg, u, bu, ubbbrw, brgbbbbu, wgrgu, bgb, ubu, uugubg, bub, rwrr, gggbrw, gwwrww, grub, urgrgw, bru, wgwgb, wubrg, ugrwwbb, wbgwrru, gbwb, wugu, uwwwg, ubr, gwr, bguwb, guwbw, wrb, grw, gwwgbb, wbwwr, grbwub, ubg, bwbgw, rwu, uurb, rbwgur, ubbr, grrr, ubwg, rgwuug, rgb, grrbub, bwb, uwuuubg, wrugb, brurub, wurg, urur, uru, bwwrrr, urwub, uwr, brr, ggg, bbg, bgg, guuruuu, ubwb, uburgbb, gbgrgug, rbwr, uwu, rwwbuugr, ubwwg, wwr, brg, wruububu, bgbb, ww, wrgbu, ugb, gru, bbwgbr, brw, bwwbb, wbr, grbg, wbbb, brbrwwbw, gbgwrrub, wwu, wgb, rruruu, wuggr, urb, bwg, wbg, rbu, wwg, wuw, wrbbugg, rb, rrgrbrg, guu, bwwugr, rwrb, gwbrb, wrugub, ubbrwu, uggbb, ggr, wwru, rgbb, bbgbgrr, wuruw, gbg, ubbwrg, bur, wuwuu, bgu, ruwgur, gbu, wwuwb, ggbgg, ugrbb, bugw, rggrb, rrw, rgwru, ubru, grbbuw, wbrr, wruu, ggw, wbgguuw, rggrugw, gbgwwg, gwwru, gur, rr, wbgb, burbwr, rggu, wgwu, rwuug, gwrbr, wbbwbgb, wurb, gbbuggg, gbbgbg, ur, ugwwu, wgu, bg, urrbgr, gurwg, bbb, urrr, bwurbrr, gbr, gwurb, ugg, uwbbrr, buggr, rub, bwrgbw, uwbb, ububggw, uuwrbbu, rrrwr, ruwgub, bugb, wwrw, gwbg, wwwrrr, urgggwb, gwuwr, www, g, wgrg, wbuwb, grwrg, uuw, wuwgb, buru, rgr, rrgu, urbgb, wgrr, gbuwww, rrgrgw, rgbrg, gugbuw, rrb, rrgbug, ugwbrgw, rwuw, grugrrbr, gbgww, ruw, wubb, gr, ruu, ubbg, brgurb, rwg, gwu, ruwr, grb, uwg, wgww, bgbbrww, buu, rurbgr, rwbw, gwwr, rwwbbugu, grgbr
rubbgwuwbrwgrgrgrbrbbubgbggrbwrurwuggggwrbrgwbrrwb
urwgurrubuguruwuuuruwbbgrbbuwrbwrruuuubbuububuubrw
gguurrubwbuwgrbrrurrgbgburbrrurwbrrrubburuggbbgb
rgbuuwwwgbbwgurrwurgwgrgrbbbuggwgwugbrwb
rwggurbrgwrrwuururwwubgrurwwrubgguububururwb
ggrgrruwwwgrwuubgrggbbwrrgbrwrwgwwububrubguurggbrwbg
ggurrgrggwrwruuwrbrgbrubrbuggugwgrwgwurbub
wwwwuburrwbwugguwuwgwwrbggbwuwuuuuruwwurbwurgbwbggrr
urburguuwwwgrbrbgbbgbgrbgbubguugwubugwgrruuuugbbbbgubggu
guurrgwububururwgugrguuubrwrguurbuuuugrgbuwru
urwuwuuguwwwgrgbuwbgubwuwuurwuwggbwgubrbrguurrgrwb
bwwbbwuwbubgrbbgwuubrrbwgbggubbrbbwrwuuuguugwrwbub
wwwguwbgrrgbrgggwrgwuuwwwgwgwrgbrbgwgwruuruguubruug
gruuwuwbugubrwbbubrubgrruubuwugurbggrrbbbbg
wurubbwuggrrurbwwgrwubgbwguurbrwgwwwgrwuuuggwbguwwr
ggbguwrwguguwubgurgggrguuwugbuwbwwgwburgbwwuwgbrwbub
gwugrwruguwuugubbbrubbwbuwwwrgburrbbguwbgbgwrwb
grgugwwrgggbbbubububwuggrrgwruwrubwbrbbgwrwrggbuwrururrrrg
guwgggwrwrggbgwrrubrwburbuuububrbwrrrgurwugwggr
wuwwugwrbbuuburuururuwwrggbubwwugbuwugbburrwuwbubgbw
ugbggwbgurubbwrgwgggggwggrruubrgrwrgugwwgurrrbwbrwwur
wurubwrrbbgruurbbgurbbubuggubrrwwgbgwrwuuuwrgwbbrbw
rwwbruubgwrrugggwubgwwubwruuwggwrbwwbbrrwb
ugwgbguggggwwbwgwwuggurbwwgrbbuwurugwwrrrgugburruwb
brrrugbwrwbwwurbgbwwuugrbwbrgwgrgrbgrurwgwurgwruuguwbrurwu
rruwrrbgubguurwwugurrgrwbbuuwuburrbwwbbrggwuwr
uuwrburgruurrbuwwguurwbwwbwggrbubrwuuwuuwrbbg
gbbrrwgggbwwggwgwuurubrrurgwgwgbwgubwggrrbggug
wrwuggugbrwuuubbgrbugubbgurgrrburgwrbugrwb
bbbwgbuwbgrgggugrugwwwbwgrrbbbuubuguuugwburrrwrggwrrruwug
urbwwguugwrgbrrrrrrrbbwggrrubwgwugbbbuurugggrg
uugrugurbbruubwgbwbbbwubbrbbgwuuuwggwwwuubrrrwuwubrgrbrw
wbrugrwrwrrgugwugrrugugwubugrrrwbrwbwrggbwurrbgubgwbgbbgrwb
uwwbbubgrrrurgwrbgurugwbbrbbburggguugbwbrbgwbubuwbbgubgwg
rrbwbrbruwurwbwgggwrguwbbubuwuwurwubgwbwwgbubggwbbubbrbr
wwrwggbwwwrgubwrbwuuwbuuuwbrgwwrbrbrguruwrwbrrgrugb
wwbwrrubbbgwurbrbubwwbbbgbrbgbwbbuggrurbrwgwbubguurrwrwwb
rwurrgwuugrubggwbuubrbuwrggguwbgrbbgrgbbuwggbgwrbwgwbuuru
gwrrugbuurgrrwgbggwggguwwrrbgrbwwrrgwwbwubwbwrgbrgbgwwbgu
brrrwbururwwrwwrrgbwbubgbwgrgwwruuuwgugrwwrgbubru
uugbwguruwuwubburrgbbgbbrwrrbubuguugwgwwbw
gwburgbrwgwwubugrrrbuwugrbbwrrguwrbgbbgrggggbwuuwwgwgbww
rwwwbgwuubugurwbwururgbwbwwrwubgwuuruurbwbwgbwwbuwgg
bwwwbuwwrwgurbbwbguwwgwubwuwgwwubbwwwuwuuubbwr
urugrwggbbrburugwggbwbbuubbrbguuggwurgbrbbbgrbwuw
bgrbrbgbgwrrwgugbubbgbrurwrrgbwbbgrwrwbwwb
gbwubwgurggwbbgwwgbrrubguwgwwbrgwgrgwwwgwwbruwrwbuurwb
wuuwrwrbugruurrrrgwurguggbgwubugrugwwuguwwruuwbrrrwwruggb
ugrugbrrwuuwrwuguggwwgggubuwrrbwrugwwuugwbburrbrwb
wrrggbggbrgurbwguurugbwgrgwwgbwbgrbgwrbrwb
bugubbrwbuwugwwrwbgwugbuuubrwbugwrugggbwwrbgbwuurgw
bwrrwbrruuuugugggwgrgrwwrwwgwwgrbggwruwrwwwgrurwgggwbbw
gwwuwbuwwgwuurwwwgbruwuugruuwrgbbwugwbbwbguguw
uwrwwrurwwuwwwuwuubbbwbbrrwwbrrgbwbwggwgwruurrwb
rguuugbrbgrbwbbrwuuwwubwrrwggrwrgwwrgwuubwgbbwubbwbgbrruwu
gbgrgrwgbbbrwgubugwwuuwrrgbwbwgbwuwrugrbururbwrwrwbubrr
ruwrgurgguuurrggrurbuurubrbbguwbbrrbuuuwrgrwb
guurwgbwrbuurrrbugrbgbbrurbubbuugrgbwugbru
uggbgwrrgrrubgbbgwubwurgbbugububwrwbrgwbbbwwrwb
gwwgbbrrurbwwwrrrbruurbruggbrgwbgurbrwggwbrgurbbbwubbuw
wbgrwbuguguwrbbuurbubgubwgwwbrrrrbugurgggbbgb
buurgwggbbwgrrbruwuwruububuubrrbrrwrgbwbbwbwwururbgurbrrgrwb
rbgggbwrugrgwrwgwurggbrbgwgwgwwrbubbrwrbbuurugrrgwbrggbu
grrbbbwwguwbruwggwruwurrgrbgwubbubggwuugwubuwrrugurwb
rrbububbrrbbuwwuuwggbbwuwuwwrwgwwgwgrburbgrgrw
uuurugrbrrgwbrrggurrbubbuwguwuwgrurwbrbgwurwurw
rwubrwbuuuwbggrbwrwgwwrgrbrrbbwgrrwrwrrgbruggwwwgbbrwuuwrg
bburuwbugrggrwggrwbgbbuurwubuuugrbrrwgwgbrggrgggwbuuwbwbuw
wrbrbugwgrbuwrubwgwuwugbrgbwrwrgwururwrrrggrgurrwb
rggrbururgwuuwgbuwuwrruguugwbgubuwrubuwbrggbggbggrwb
gwurbruwrrgrrwbbwuwbgwrgwubbbuburrgbwrwrwb
urbrugbrwurgrgbrruwrbbrgwbrrbrwurbbbugwuugrwguwr
brrgurwwrguuubrggbggwwbgbgrrwwbburwuwrrwggbwubrrbggugubu
rwgwwuugbwrwrguwrrbrgwrurbwurrggwuwuwbgwgwwguurgrwb
guggggubguggwugbgbbwwgurubwugrbwgububbggbbrwb
wgwrguwggbugwwgrrrrwgwwwwrwwubgugwugbwgwggubwubrwb
grwwgbrwbubbwrwwwubugbgrubuuwbgurwurrugbwrgrrr
uugwwbuubggggruwugrurguwwwbrggggggrwwwrbrgugu
rgubgwbwurrguwgwburwubgrgbubbrbrruugrugbgrwwru
wbwwrubbbguggwbuugrgwguruuggurwggrrbruwbwrgbuw
rgugbrwuurrrrrurubrrgguuwbrrwruggubbbubgbwguurburggbrwb
rbuuggwwurwuuwgubgrbrruwrburugurwuubbburrguuruwr
rwurwrbbubgrwgggwwwbruuubwrwuwuwgrgbrgrgbugwrubrrbwbwbwrwb
gwrgbggrwrgbbbuuggbgrrgrrrruurbrwuugbubgbwur
rrurrwuuwuguuwbububrrwugbwuurbbgguwrwrrgrwwgbrggrburwg
ubruwgwbrubwrgbbrbbubggggwrggrgwbgggbgrburuwrbbrurgrgbbww
wrwgubgbwruugwubbggwugbgwwugwrbruuuwrwbbrrrru
rwubrrgbwrbgrbrwggugbbuugrguruwwwugrgurwb
wrgruuwrgguwwbrurbbugbrgruwrgrwggrbwwbwbgwrbrwubwubrwb
bggwugbrbwbgugwuwwurrwrrrwrgrguwuwurwguggwbrrbugrwr
ugubbwurburwrrbbbgwrbgwuwgbubrrgwgubrubrgrbb
gbwuggwruuuguurrwuurubrbwwbbwwuburgwgwurbbubg
uubwugrgburwubbbuururrwrwrgwurbwrrwurrubrwb
urbrwgwbuugbrwgbugggbbwwbuguuubbubwbguuubgbrrbububrru
rrbwwwbgrgwgurwwuwrbgwrwgrruwbgwbgugurwgrbugrbgbrbruw
ugrwbgrbrburugwbgugwugurrgwgrgwwrbgguwgrwrwb
wwbgbrgrwgggrbrugwwrwrbgubgrwguwbwubwwbgguggbbrgugbugrbbr
ubrwgwuwguwbwgguugrrbwuggwubbwwrrurbwruwbuw
gubrwwrbbrwwbuugrbwwugbgwwbbbugwrgbwbwwbwguggb
rurwgbbggugrwbubugrrwugrubuwwwwrwububgwwrwgwbr
wgbbrbbubgrrwwwgugugurbrubbuwbgwwwgwwgwrbwbw
ubgubwgwrwbuubgbbgrwbubugbbbrugrgwurubwgubguwugrrbu
gruuuwggwwwguwwguubggbguguuugwugwwgugwrwb
wrwbrgbgurwgbrbgurbbbggrbgwgubwbbggwrbwgbbu
bggubwbggbgrrrrggwbwbbgrguurrrggwbgurgrgwbuwbwurg
wuwbggrwwwbubrbwgrgrwgbrurggwwwubwwgwgbwuwwuguuwwgggbb
rwrugrubggrbururrwuwurbrwbuuggrbrbuugrwubbruggrbwuuru
wbrgggbwgrwwubbbguuuugrburubbrbrrrwubwgwguu
wrugrwruurrbwwwurggwbbwbuggrbwuruugwrburrwb
rburbbrwwrwgwbrubgwgwrwgrbwurgubuguwwwruuggbbuwwwggrwb
gwuugurgwwwrwwgbrbwwugwgurwbbbrwuwwwgrgbwbbgbbgruwgwwgwrb
rruwgbbwwrugugugrwubgrguguuwggbrrbrbubbwugurbgbubb
uuubwuburgrrwuugububuuwwrwrgbwbbgwgubwwgwgubrrbgbruggbu
wgrwuruuurwwbrwbwgrrwwrgurrbubwrwbgwrggbrrgugbuu
ugwbrgbbbwrgrgwbrguwrbrrgggbbuubgwbwgbgrwbrrwrrrgbrbgg
rgrggguuguwgbgrgrrgwrbbwbgurrrgwbwwguwbgggrbugugrbrurwb
bbwuwgrbbbbwrbrgbrgbbbburgruggrrrrbwrbbrwb
wbwuuwrruwggubggbgwbwwbggwbgbrrruggbwrrrbrwrb
wuubruggbruggbwbwuuugwrrwuwrgbwwbwuwwwrrgwrr
uwwgrbuubwbwbbrwburbrggburubwgguuwbwgbwburggwrgbrwb
ggbrubuwuurubruuubrbrgwuubguwbgbgwrrubrrrwb
rwgbbburwggwwgbbbrruuurbgrgbggrbgruuggbrgggg
rwwbwgwgwwbrbugbuuwbgggggwgrurbgrgwgwrgbbbuugbbgruwgwwwbg
rbwubbwuugwggrruuuugbruwwwwuuuuurgbgwwwgwbggwgbrurww
rwguwwrgugrbuwrwwbbugurrrwubruwugbrwubrwrgrbggbgr
ubbbugrbugrwgwggbwugwwbgwguubugbggbggrbuuwwbbbbbwr
gburuuwbrwrguwbrubgbwgruuwrwgbrwbrwwgwbgwggw
ggwwwguwgbuwrggbugurrrwwwrbrrbgurbbbgbruwrwwrbgrwwbuugrwb
rgbgrbrrubwuggruuwbgggwguuwwwrrrwuwrrgrubbbgrr
uwwgrrbugrrbwgggwuruwuuwggwbgwggwrbbuwbrrruubuguwugbrurwb
brwruwruwggrrubrwugbgbwwuggggruubrruugbgurrgwwugrurbrr
rgbbrrrbubrgbbbuuggruuurguubwgwgrwwgrbbwruwwb
rrbuuwgbuwwwbggrgbuurrbwwbwbwbrwwubuurrggrbg
urgbuwuwwugbrbguugbrbbggwggwgburgwgrwgurrbwwgrbbgw
uubrrugwggwgwbgbbwggwrrwbruwbrwuurgwwugrwgrwg
rgrguwguwrgwwgruggbwwbugbruubgurgrwuwrugbbggbuwrrggrwuug
uwubrubgbbwrgbgugwwwwwubwwubrburbbuurgwrrbwbubrbw
rgrbbwggrbgrrggrgbububggwggwwwwbrubguwgbuwbruwgugrgwrww
bbrwwrwgbgbgbrwwubbrgwuruwbrbubrrburuurwb
uuwgwgubwwbburwgrrbwgwrugrbwwgbggrurgwbuwru
uuggrgwuguuwwrbwrbuwrbrbgbuburuwwbbgbggbbugwwbu
bwbgwgwbrbbbwwbwrwgwbwgurggguwugrubrubrbrbuwwuugubru
uwuwrgwuubbruurbbbururrurrrbrwggbgbbgwrbuwubgbrrgwuurwb
bwgbbrgbbbbuugurgrburrrugbuubgbbwwwwgbuuwuggbgwguubb
uubwbuurbbwgbrgruwbugguguwbubbgrgbbgwbubggrrbwrwb
rrrguwbgwuwwbrrwrrwguwurbgbrburrwgrrburgwbbrruwwrrwbwrb
rruguburbgwgrgbguggggrugrgwbwwbwrbggwwgbruwuwrwwbubgburgr
rurgbwbugrbrgbgrurruwbubugubbgwuubgrwgrwwwgwbwrwbbwb
bbgbwggwgbbwbuugrrubbubgbrbrgubrugugrwbrwwbg
gwgugbburwwwwgbwwubwrwrwuurruuwuwwurugrrrgb
wwwrrrgruwrrrwuubwbrrurwbwrwrwbwggggrrbwuwggg
gbwrwguguggbwwrrbwgwwbwgbbbgwbuwuwrgwwrgbwuurb
guguuugbrbgruwbwbubwurrwggrubruwwggbwwubguub
uubbrubgrwwwuwrwgugbwbgurgrbbrugbrurguwrwwbbuguuuburwb
gubbuuuuubbwubgrwwguruggrbrgrrubuuuurrwrwb
uwwgbgrgrbrrgrguwgubuuwbwgguwbgurbwugbbrgguw
buwbgrggwwubrgrggbwurubgrbuuuwurrbuwurbbbbbrubgbrbuwwwrw
uwbrrbbwwruurgrrgrwruruwuubrgbrwwgwbugrbbrggrbwwbgrrwb
rbwgwbrguubbbugwguwrgrgbggbrruggrwubrwbgbwwuuwrrgwg
rbrbbgwggwuuburggwwrruruuruggwubruwwbrurubwbu
rbubuuurbwrugurggbwwbugbguuuuuwrubbguwrwb
bbwbubwrbuwgubguwrwrwgbgrrwwruurwwrbugrrurwb
bbuguurruwrrbguuuugwrguubwuubrbggrwubgugbwbwrrurugrugrwb
gbuuwurrbrwwrubgurbuubugrrbwubuurwuwwwgbbgbrwbrrrubggrwbgwb
grggrugrrbruuwbbbrrugbbbbuwbrwurrwgbwbuwrwb
bguurbwgwgbgbgrgrbbwgbbwubbwggrbubrwrbrubrbrgrwbburwb
grrrbrrwubuuggrgrurruuwwubwuuwubrrbburbrwwggrwgurgwgggwr
wbgubuuubwuwbrububrbwgrugrrbrrwbugguwwuuugu
rrgwgrguwruwgrwwrbgrgbbbbbwrgbugbggbrrwb
gwbrrgrruurwurburwbgrbggruuurbrbwubguwgrrburbgwwwu
bwwbugbruwrrguubruwbruuwrrwuwbruwgrwgwruwurgrbgurgruguwbg
brgrrbururwguwbburgurgrggbgubuwgruuuurbrrrrwugg
uwrbugwwrwuwgwwbuugbuurbwwbrwwrgrbggbgwwwrbrbwrrubbgrugw
uuggwbwrrwgrruwgggbggbgbubgwgbugwwrggrgbrgrururgugur
bwwwrugrrgbggbggbwubburrgubgwgwwrbwwgwbgurw
gburbuurwgbwgwwgggwbguwuwruububuwububwuwbgg
gbwggbgguwggbgwwrurwggbuburwrrgrbgbbuwuuuwrggwggwb
gbbwwwgbgwurgrbbwbgguwrwrggguwbugwbrgbwurgwuwgrrug
rgbugwrgugwbbbgggrwgwubbbwuurbrbrwbrgrwuurwgrg
ruwbuwurgwbuwrrrgwbrwrrruwwgggwugbwwrgruwgwubbgrwrrrwu
brrbwbbgwwwuururbrbuuwwwuguwwburbrurwuwgbwrbuubrbbww
rrrwrwugurubugbubbgwgrggwbbggbrugwbwrbggburgbrwr
ubrggrgbgwgruggrgrrwbruubwrrurubrbgwrwbggbrgbbrgwbbbr
ggrbbggrurbrbruwwugwrbrwrrbwgbrwwgubwrbrrgrbbwwwruwggww
wugbrbgwwwwrbugbwwrrburuwrbruruwuuuurbuwwwbgrgbrwb
bbgbgruurgbubburgwruwgrwuuubbwbwgugwbrbuuwwgurrurgwwrrb
wwburbbgbwurubrbrurwwgrwgubbgwbgrguuugurbwuwbuwuwuru
bwrgbuwrrrbubbwugbbrrgwgrbbbuguugrwbrurwrugguubbrubuggrwb
rgrwugwgbuuwubwrguuburuuuwuwbgguwuubggrrbugrbugwbgwwubwwbb
wbwrgurwrwrgggbbgggwwrbrbgurggubbbgrgbwbug
rbwbuwgurbbbgwuubwbgrwwubwbbwbgggwurbbbgbuu
wbburugwgrwwwgwwrwrbubrwuwrbgbwgbbwbrrbwbubbwbruubgrug
wrwggwgwwuuubbgrrwggrguubrgurrwuurubwurggwbrbbbugwuuwubwgu
bggrgbruwguurrurrbwuuwgugbrbwbuwwgwrgurggwburbbwgbuw
wwwbbugrrwwbrbwwgwububbuggrgrurggrwgrurruggbburwwgwurwb
rbrrwubgrwrbrbrggwwrurrwbwrurbwgbubggbrrrwwrwb
wuburwgwrwuwggbwwrgwwwugbwbggrurgbrurruwburuugwrwb
gwbwurbrbuurgwwbuuurrubbbrbwgruwuwuuuugwgbbb
wguwrbrbrgbbbggbggbgbgwgwbrggbggwguwurwwbbwbrrrrbwrwgrwb
wwwbruruubrurbugrrwwuburubbguwwrrbbwbbbrgbbubuwrurugr
brurrgggruwgrburwuggugrrbwbuuwbwuubgurwubruwrgwurbrwb
gwrruuwbrbwwbbbuwbwgrgubgggggwubgugubrbgugwuuburubugruwu
uubwruurruwwbrwburwggugggrguuurrgbbwbuggbwbuuurbgrwb
ggwrurbgrwgbbbruuurbbuubrwururgwwbuuwgrgwrgbubugrbrrgg
gubrurubwbrgrwwgggwwbwwguubbgggbggwbwwrguwrgwuggr
rwwugrbggburrrrbgwwgwgrurbbrguwrrbbbruwubgrgbrrwb
bgrrrbbgrguwgwwgurwwwrwugwwgrgrrwwguugbbruruuuwburbbuur
gwrgubrbubbbbrggrrbgwuwwbgbbuubugwgrwubgbbr
bwwwgwguwrrguruugwwbwgrgrwwbbwbrrgwbburuubbugbbrgggw
wburrbwwgubwbbwrbrgrwrbwugwuwwgwuugwwwgurgrguwuwgrgruu
wggrrrbgbgwurwrrwbrubbwbrwgrrwuugbrwwuwgruwwurw
rrbwggggurwrbwrrwubbrrurwwgbbrwuuwrruuwbrwb
ugwwwrbrbugbgrbuwbubwuggbwwugbgwrrwurrrwrrbgwrub
gbwgguuguuuugwgbuubggwuwbgrrbrbgwwbgugguruwrwggwwrwgwgu
wuubbbugwgrugububgrbgwugrurruwbwrbggwbgbbgurgrgbw
gwugwbbrwbwgwrwbrgurbwuwuugrrrbwwrburubgwrwwbbg
wwrgrrbubbuuwwbuwgrrwrrgggguwrrubbugrgwwbbug
gwubbruruuuwbbgrugbbbgbgwurwgwgwbwbwugggugbwuburwb
grgwgwrugugbgbwwbwubgwgbrgwguuwrrwwwugbgwgbgwruwwrwgwwrwb
rwrggugrwbbwgbubuwuwrrrgguguwrggbwbbwrrwb
rbgbwuwbwrbbwbbgugwgbbbwbrrrugwbrbubgruburwgwrrwb
wrrgbbbbwwuwgrgrrrbgurugbuwuubrgbgrbbbrrwb
ggrbwgwgrugrbrrwgugwguuwubuwwrugbbwwbbwuwggwuu
rwuuwwbugruwrruubuwuruuwubrugwrrwgruwrwrubbruruuwwg
rwrwuwbuwugbubgbbrguwgubuubbuwbwbgurubggbgubgwu
ugrrrruuwruuguwggubguwwwgrwuuwrwugwruwgrrbbw
ggwgwgurwrggrrwgwruuguwrugubrbuurwwruwbgrgrwb
rwbrrwuwbbbgbrrbwburwbbgbggwbbggwggugggrrrwbugg
ugbruwrruwgrbwuggrwwbruwwubrurrggbubgubugbgruugrrwb
wwwuubbwubwrubgubwrugrurbugguurburrrrwgguwwuggugurguwurwr
bwwbrruwbugbwguubbgggbrwbbrurgwbrwgggbgugbbgrbww
brgbwwubgubguwugwwuruubggwwuuwgwgwggbbwwbubbbggu
rbbrbbrurbuwwwguggguwgwggburbggubuwwbrbbubruuwwbgbru
rwuuugbwgwuugurbwrrwwbugbggbuururrbgwbwuuurggrurbgwbgggrrwb
bbgrgwwugwbwugggbugbgubgbgwbbuwrruurbwurwrgwurwb
bgwgguuwggrbbugbgwwwrwurrrbugrgguugrbgwbgwgwggruwwggwwgrwb
urrwggrubuwgbwggbbuwwbwbbwwrrgwrwbgurwurru
uwwbugruuuwggrrrrrbrrrbrurgwrrwwrrwbwbruwbbbuggwuu
wrururubbrugbggubggrbruuuubuubwuggggwwwubbwbbwbgbgbbgurwb
ubrubrbrgugurbuwrwuuwgbgwwrrwrrbbgwgbwruwrrrggggr
rbwguruwbgbgbbbbubbrrrugrruggurwwgrrrbrwb
rurgwubwbwgubwrbgguugrruururgwgbuwwurgugww
bwugrgruugguguwbgrbbbwuuwrrgwrrwrrubgrbrgbrggbww
rrgwbrwggbbgrggugurwgrgbrgwgbwrruwgwggwgrwuwrwbburwwbu
uurbwggwubwgwwguwbbgwwggugrrruggbgwbrrgwrr
grwbwbwrgrwrrubbbgwgrbbwrbgrurwrguwwwwggrbwbrwubbwrggr
gbuwbugrgubbrrbwwrbgwuwrwrbrbrwwbwbwrwuurrruurwb
ubrwurrrwwrbgwwgguubuwwgwbguwggurwbbgrugwbbrubug
rbugbwbguwggwwrwbbgwwuuruwwbrububbrurbubrgwwrbugugwbubggru
uuguruubgwwrrrwwugwurbgwbubrgrurrgwuuuuuggwbgrwbugu
gwwbugrrburuuwbwwbbugguubuuwwbuwbuwgubuwbruuugrgurgbuuubbw
ugwwgubwubbrubbrugbbbrurwgrgubgubugururgwgwwburgr
uggrgbruwrrbwrwgrruurwgguguwrwrwgbrggububgwrbguwbugwwguw
gruruurbgwrggggbrrugrbrgubrurrgugbbgrbgrwwugbrubw
ruggggwgbubuuubbgbburuwwgbbugrwubbrubgbrgbggrgubrb
wrguwbuwbrrbbbwbwrbgrrubwggbuwrrrgugbbrwbrguugrbrwgbrgg
rrgrwbgurgbbrgrbgugwrgrruruuugrgrrbbrrrwb
uuggrwugruuggrurbwggwgrwbwrgrbbbgbwbubugwg
rwwwrwrrbgrrgrgrwrgururgwrwburubwgrguwbuwwrrugugbbrwb
bbgguuwwuwbbuuwgwgurrwrwgbbrgurwgbrrbwrwbrwrbuggbwwrwrbuw
wrwwbgwgwruwrubbwrrwurwubgrrwrggbbgbbbgwwbgwggrbbwbrbbgbg
wgggrbrbwuwgubrguubgrguwrwuuuwbwwubuuwgbgrgbruubb
uggrwrwwbguwurbbburrgwgwururgwrgruwbwuubugubrurbuubrwrbuurwb
wrugguwugrgbuuwrbugrubrggggwwrbuwuurbuwruwwuww
wugwrwbbbrbbbrggrwbuwrwgwwbbrbwwgbruwugwruggggbw
uguurbwgwbbuuguwrwguubuugwurbgwrrbgbrrguwuwug
uwwuubgrrwgwrbbrgwwwbwugbbggbuuuurgubgwugrbgurbbwug
gwuwgwrrwgrwbwggugrbrggubbuburbbbgugrbuwrurrwbrwgggr
wwgrugrwuguwbruwugguurguwrugubwubrbgwwbrwbrwgbwrgwrruwurbr
gwgburrgwuurwburubuuwwwwgbbwbggwwgwuugrgwrbwrrw
rbgwgbbruuwwugugugrubbuugggwgubrguwwgrwgrrrgwbggbuguwu
rwwrrbrggruuubgruburgwubrrguwbwwgrgbwggruggwg
burgwuwugwbbbgrwgrubguuwugrbrbguubwwwrbbrwbrrugubuwwguuurw
gburugwwrwrrugugbbubrwrburrugrubbrurbrwwgrbbww
wuubbrbubbrbuubuwuwwgbuubugbrrgrugwrgwgwwwwwwwuurb
wuwgrrgwbbgrurbrgrrurbbgwuggggbgwuurwggurrwb
grbbggbgrugwbuubruwrgbwrbbwuugwrrugwrggbrurbwrrurbrwb
uuubbgrbwrurbwbuggbbgrwuguuwubrwgbgrrwurubbrwgggwbggrwb
urgwrgbbuwwrbrrrbbrwgwugwwrgrugwbgbbgrwb
wgbrwggguwwruuwwggwwrwbbbugbruwugbbbuuuwwgurrrbwwbubbwgburwb
buggbbgbgbbwwwurwrwrwbruwgwbbgrruwwgruubgwwwuggur
rbgbwubgbbgrurwwguwubrwubbuuggrugurubwuwgrwgubgugwguugrgw
urbbgurbubwwgbbwburrrbgrbwwubggwugbrrbugwrbgubrb
wbrurrrbgrgbgbwwwrwurrwbuuwrwwgrburwrrbgruggubgrguwgbwur
uuururbwrrwgwbwwrwwgwgruwurrbugwrgburgwrwrbrbw
rrwrurbrgubuguwurwgururugbgrbgubrgrgggurggugurgrbbuwgw
rrwuwrugwwbbubbrbrwrbwbwubgubgwwgrbugwgrugbgb
grwgbggwwwgwrwgruggbbgwrgwubgwrwguwgrguuuuuwgbbubgguugg
rbuurugruurwuwgburwgwgugrwgwwgwwgbrrugguwruw
urubgguwggurwbgrwwbubguwggbbbgrugwgrbgbrwgwrrbrbbrguub
wrbrurgwbubbwbbrwbbrugwgbubrwbgrgwguwuugbgugrgbg
rwuruwurgugggrgrrrugrurgggrrubguurbububugugbwurwuwwug
uubwuwrwwgrbbwgrrgubwgguggbrrwuruuwuubgrwuggbgruggbrr
uurbbgrgbrgbbgrgrbwwugbrrubgubgurrbbrrrbubr
guguggbgggwbbwrwrbwbgggrurburgurgbbwwgruru
wbrrbbuurwruuuwugrgubwuuurbrwurwurbwwbwububwbbbrwb
ubbrwgggwrwbwwwrbgbrrrbrubwrgurgbbgbuuuuugbwgwgrwuwwbuu
bwrbggbgrbbgubbwrrrubgwburgrgrrruurwuuggbguwbwwurrwrwb
gwuguuwbruwuuggrbrrbuwurbggbbwguwwgwwbgrurrwb
rrggbbgurwbbbgurbgbggubgrruuwbrbwgbrguwubbggguwbgruwwrwb
uwugbwwwrbbruubwbrgbuuubbgrubururrbrrgwwbgrwgbrwruwrwb
bwurruruwuguwrbuuggbwbrubbrwuwurbgwwbrgurgwuggr
ruuuwugrrurbwrgrbgurbrwbrbubbwwuuwwuwwuugugbbgrbggwr
uugrgwgwwgrbrubbugbgbrguwbbwwgrubbbgbgbruwugrrwb
brbgbwwwbbuuugrwrugbwurrgggbwwuubwruuburrbrr
wrwrgwwrwrugrwrrurbuuwgurgbrgbrwwbwrggwbrbbuugrbbwugrwb
rugbbggbuggwgwwuruwrwbggwgburuubuwugbggbrbgubrwgr
ubrrwuwguwwrbgwbbbrrgrggrgrgwgbrugubuwwwwuwguuurwb
ruguguwuruubbwwwgwgrrrwrwwuuuruuuwuwgwubwwrwu
brggrwrbrwwwuwwbwrgwbwurbuwwrbrgrrugbwugrbguuwb
gwuugwuuuggrgurbbwggrubbwuurruuwrggrggurgrrwrrgbrb
ugwggbgbbrrwgwrbuggurrbuugbwrurbbuggubwbgwgwuwgwrrrwubuwurwb
wwuugrrggrbrrgwuuugbwbwrurrbuwwwubwrbrggubbubbgrrr
ggwuubgurubrurbwgrwwuggururbrgruwgruugugrbwgrbubrbrb
rwggguwwubburgwwuurrurrrgwgbrgbbbrruguwbwugguuurr
rrbwbrrwbuwwbwrrbbbwwubuwgurrguwugguwrbuwuubbwuwrbggbuu
grgrbggrburrbgwbwbuugugbburbrwrrrguuwbugggugrrrgrwrwb
buubrrggburbggwgwgrbgurwbwwwubbwbgbwwuwbwwrwb
wguuurrggwguurburgugugbrwrgbwrrwbgrugwuugbwgbbuubggrugbub
wbwgruuugggrrubbwrwwubugguguwwguubwurwgwwrbgubwrgbbubrwb
ruwrggugbbbbgurwggruuggwwggrwwrwbbbrwguuuuug
bggwwuwgwbuguwggrgurbwugbbbuurwgwuggubgrwbwwwbwgrrbuug
rrgwugbuwugubuuggbrwwguurwuwugwuuuubgrwrrwrbgrgwbuggwr
grguwrrurgbwbwrgwwwrggrwbwgbuwbbbwbggrbrwbbrwb
uubgbrgrwbbgwrbrwwgbgburbuurbubbguuwbgbuuwburbubggguug
gwbgwrbwwwubuwwrwbbwrrrgwuwbrubwbgggubugbwwgggburrbugrgu
bwgwguugggbrrbuggwggwgbrbugurbwwuuwwwugbbubbrwb
rwgwbgbwwuwrbgbgwbrwuwruuubbrbwwuruwbwrbrwrwrgru
wwrbwwwurggbgggugwuggubbbwgrrwrbwwuugwrbubwgrbgrrr
ubrubggrgguugburwgbbrwurbrburuuwwrrbrrwwbgwbgggwugurugwwrwb
gbggrubrgubgubbwwwwuwrbburrgrwbrgrwbrwguuwwuwrgguwrwb
bbwgbrwggwrbwugbgubugwwuwwggbgubwubgggwwrbgrwrwwgb
uubrbgbbguugrruurbrwbbuuuubbwwuruuuwbbgwbgrbwrrrgb
bbbwugurwrwurgbuuugrrruubrwrgwguwubrurgburbgrrwrr
gggwwgwubwwwrrbubuuuggrgrgburugbgbuurbgrugrwrgwgruu
burugbguwbuwgubugubbburrgrrwuruubbrbrwwbwrburubwubbb
wrwbwrbggggbgbruwwwubuurwbgwgrrgrwubwrrbbggrgbwbwbbbuwbbrwb
uuurggrbbwubuwbwbwrgrbbwgrgugbrruguuugrgrubb
buuugbwbbgwrgruuwrbwbgwbbrgwbrgrwruwwwgwruggrb
rgwrrguwuugbgrbubgbuburgrbuuwwgbbwgurrwwubrgwguw
ruuwwurgwurgbuwurruurbbbbugrubrrgwrgurgubbgbbwgugrwb
urrwrwgugrrbbrgggrgubwbrwwgbgururbwruguwwrgburg
rugrggruuubgguuwwwbgbgbbgugrwgurrruubrgburgrrwb
ubwwrugbguwrrrbwuwggrwrwrububurbgruwbgwrbbbgrrrgggwr
wuggwbgwbbbwugrbbwwubgrbwrgrgrrgwuuwgrwgwwurug
bgwwbbbwrrwugwgwwrruggrbwuwbwwgrwrgrrguwgrurwgurgggrrwb
guwrwubwrwwwgugguuwwurbgugbuwrrbwrguuwgbwbbgbgurrgwbbu
gwugguubwruguubuguguugbuuugrrwrrrurrbwgrbwgwugburuu
brwgwrbbgwurgrugggrrbbwruugrgburrwggwguwuuwrrbw
bwbugwurgbgurwwrugurgbbgbuurugggwugubrwb
bbbuuubggggggwrbrgbbwruwuuwugurbubgwgrrguugbwuggrubrwbwgr
wgrrrurugrbgwbgbbrrgurrgwrurrwwwbgrguuggrgurwww
gubbrbwurgwwbbggurwgbgrwrwbrugrwrburgrrugb
uubuubgguwwbrrwwwwubgwbbwbwwwwugguguwburgbrbbbg
ubgrwugugrruwuurrwguggwuwbrwbwrugruuuwrugwwuwrubuugbrwrrrwb
wrgwguugruurububuurwurrwuggrrubbrrrgugwuugwurgrg
bwubggubrrburbrbwggrurwrbwbgbbgwggubggbubrububrwb
urugwwbubbrrwwwrbrwuwbwurwgrurbwbrurbrwrgrruburwb
rruubgwwwgrwrggubgubwrbbgwgbguruwwgrgburgwrg
rgugrgrbbrgwbguwgguguwrrubgwwgwgwuwubwbwrggbwuuuwrrbwgwu
gwuwbwuwwbwwggbbgrgwugwrgugruuubgwguwwgbbrwb
bbwuguwwwuguuuuurrbbububurbwruuubugbgrbuwgrururwb
bbbugrrrbrgburgwuuruwrbwgwrgwgrugbrgububrbwwgrbrgbuwbgguu
bubwuuwwuwbggrwwubruwbubbwwgwrubuguwbuuwugwrbbugr
uwrgubbrrgguggubuuwrrrwrrurbuubrgbbbwgrwub
wbbguubbbbguwuwbwrgwwubwrurgwurbrrwurrbgrbbburw
rgbwugbubggbrbwgbuuubrwgbrruwggbbggbbuggwg
rgrugbgrwbwgwuwrbggrwuburrbguwguguuugwgubrgruwwbw
uuuruwuurbwubrwgwuuwbugrrwggbwwubbugwgubbrwgwwwugbwwrwb
brgbguwuwggbbwrbggggbrbubbwbrwbbgwuubbbbgwrgwgbbwu
uggrgrubuuuwruuurbuwwugbwwgwwguubuggubwwugrrwbggwrgubrbwrw
wbburbgbbrbbggrgrrurwwgurbubwuurwwgwbwrgbguuuwrubwwubuu
buwbgbrwgbubbrbrgwuwbgbrwburgbbrwgguwwbwgbwbgbww
gurwggwurgwbbubbgbgruggbrbubuwbruwwrwguggrbbbrggwgbrgbgu
wbwwwbbbwgruuuwubbrrgbbggwbrgwwbgurbbwgwgwgrbggwrugrugggbrwb
bbgrwgruggrwwurwwrggbruugbbrgwggrrugrwuuugbrrwb
wwbugbwuguwgbrwrwgrrbuwgwuwgwrbbbubwwgbrguwuw
ugwbgbwrrgbwrrrbrwwguggruwugwwurwrrbgwubbwrggugbruuw
bbbruuwuwwurrwbuwbuguuggurgbgbruruwurgbgbgrrwb
bggwgrggrrugwwbuwgbrbbgwbbuwwuwbrgbwbggwbbgggugwggrwbbur
uuurruuuuugrbuwwgrbwwuuwbruggggbgrbuuggbuuuwgrrb
gbgrgubggbgrgguuwbwbrwbggwurgbwwwbrubwgwrggrbwurggrwrrr
ggbrbrbguwguuugubruggbgwbbuwwrbuuugbuuwgww
wurrbururbgrbrgwggwggrgrgrgbgrrgbbwwgbrgwururwb
uubugrgbrubuggrggrbwbbbruwbrrwugugrurwbgwwwbubgrggr
rgwwbwgbwugugrwrrwubrwbgwuwuruggbguubbwbugururu
wbuwrbggrrwbgbrbwwwbbgwbwrrggubrubbwbubrgwrwburbgb
gbwuruuwuwwwbggurugrwgwubbgbwwwurgwbruwgbgrbwrgurwb
gwururwwugrrubbruwbuwrbgwrbruugbuuugggwbubwubb
wgrgrrgwwruugbrrrbwwrwrrgbguwwgwrbgwuuwbgwuwrugg
ugurwrbgrbubwbbgrwgrwrbgwbwuwubgrbuwwrubrggwuguwbgbu
ugrrburuwwrrwgrugbruwgwbbubrbuwbwwruuurgbuwwgwgbwwbuburwb
wurugurbrbubbbbburuubrbrrbwubguwggwubbrbrbrgurrbwwwuggwg
bwrburggbggbbgbuguwbgwwbbbubugwguwbbgbgwbg
gbwrbgbgbrugbbguruuwgurwwruggggbuburbgwwrwb
rubrgwubrrrrrwbwbrurbwwggrrburrugrrubwbbguwbbgrwwrbburrwbr
wgbuurbrrbgrugwgubuwbgurrwwuwgrbrgrbgwrwwbrururuuwrrrwb
grwuuggwugwgrbggggbwbgwububwrgwgburrugurbugurrrwrwrububrwb
bbggugurwurrgggrrbbrurubbwbuwbbwwbrwgrrrubrgur
gwwwugwuguubuuwgbgruruwguugrbbwgbbwwgrgrwwrrrrrbuwbbwburwb

10
day19/example.txt Normal file
View File

@ -0,0 +1,10 @@
r, wr, b, g, bwu, rb, gb, br
brwrr
bggr
gbbr
rrbgbr
ubwu
bwurrg
brgr
bbrgwb

3
day19/go.mod Normal file
View File

@ -0,0 +1,3 @@
module stevenlr.com/aoc2024/day19
go 1.23.3

105
day19/main.go Normal file
View File

@ -0,0 +1,105 @@
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
patterns, targets := readData("example.txt")
fmt.Println(part1(patterns, targets), 6)
fmt.Println(part2(patterns, targets), 16)
patterns, targets = readData("data.txt")
fmt.Println(part1(patterns, targets), 280)
fmt.Println(part2(patterns, targets))
}
func part1(patterns []string, targets []string) (okCount int) {
notFound := make(map[string]bool)
for _, target := range targets {
if doable(patterns, target, notFound) {
okCount++
}
}
return
}
func part2(patterns []string, targets []string) (okCount int) {
combis := make(map[string]int)
for _, target := range targets {
okCount += combinations(patterns, target, combis)
}
return
}
func combinations(patterns []string, target string, combis map[string]int) (combiCount int) {
if combiCountCache, ok := combis[target]; ok {
return combiCountCache
}
for _, p := range patterns {
if len(p) > len(target) {
continue
}
if target[:len(p)] != p {
continue
}
if len(p) == len(target) {
if p == target {
combiCount++
}
} else {
combiCount += combinations(patterns, target[len(p):], combis)
}
}
combis[target] = combiCount
return
}
func doable(patterns []string, target string, notFound map[string]bool) bool {
if len(target) == 0 {
return true
}
if _, n := notFound[target]; n {
return false
}
for _, p := range patterns {
if len(p) > len(target) {
continue
}
if target[:len(p)] != p {
continue
}
if doable(patterns, target[len(p):], notFound) {
return true
}
}
notFound[target] = true
return false
}
func readData(fileName string) (patterns []string, targets []string) {
fp, _ := os.Open(fileName)
scanner := bufio.NewScanner(fp)
scanner.Scan()
patterns = strings.Split(scanner.Text(), ",")
for i, p := range patterns {
patterns[i] = strings.TrimSpace(p)
}
scanner.Scan()
for scanner.Scan() {
targets = append(targets, strings.TrimSpace(scanner.Text()))
}
return
}

141
day20/data.txt Normal file
View File

@ -0,0 +1,141 @@
#############################################################################################################################################
#...........#...#...#...#.....#...###...#...................#...#.....#.................#.......###...###.......###...###...................#
#.#########.#.#.#.#.#.#.#.###.#.#.###.#.#.#################.#.#.#.###.#.###############.#.#####.###.#.###.#####.###.#.###.#################.#
#.....#.....#.#...#...#.#...#...#.#...#.#.................#...#...#...#.......#.........#.#.....#...#...#.#.....#...#...#.....#.............#
#####.#.#####.#########.###.#####.#.###.#################.#########.#########.#.#########.#.#####.#####.#.#.#####.#####.#####.#.#############
###...#.....#.........#.###.....#.#...#.###.......#.....#...#.......#.......#.#.#.........#.....#.....#.#.#.#...#.....#.###...#.#...#...#...#
###.#######.#########.#.#######.#.###.#.###.#####.#.###.###.#.#######.#####.#.#.#.#############.#####.#.#.#.#.#.#####.#.###.###.#.#.#.#.#.#.#
#...#.......###...#...#.#.......#.....#...#.#.....#...#.....#.......#.....#.#.#.#.....#.........###...#.#.#...#.#...#.#...#...#...#...#...#.#
#.###.#########.#.#.###.#.###############.#.#.#######.#############.#####.#.#.#.#####.#.###########.###.#.#####.#.#.#.###.###.#############.#
#...#...###...#.#.#...#...#.............#.#.#.###...#.........#.....#...#.#.#.#...###.#.###...#...#...#.#.#.....#.#.#.#...#...#...#.........#
###.###.###.#.#.#.###.#####.###########.#.#.#.###.#.#########.#.#####.#.#.#.#.###.###.#.###.#.#.#.###.#.#.#.#####.#.#.#.###.###.#.#.#########
###...#...#.#...#.###.......#...#.....#.#.#.#...#.#...........#...###.#.#.#.#.#...#...#.....#.#.#.....#...#...#...#...#.....#...#...#.......#
#####.###.#.#####.###########.#.#.###.#.#.#.###.#.###############.###.#.#.#.#.#.###.#########.#.#############.#.#############.#######.#####.#
#...#.#...#.#.....#.......#...#.#...#.#.#...#...#.....#.....#...#...#.#.#.#.#.#.###...#...#...#.........#.....#.#.............#...#...#...#.#
#.#.#.#.###.#.#####.#####.#.###.###.#.#.#####.#######.#.###.#.#.###.#.#.#.#.#.#.#####.#.#.#.###########.#.#####.#.#############.#.#.###.#.#.#
#.#...#...#.#.....#.....#.#...#.#...#...#.....#...###...#...#.#.#...#.#.#.#...#.#...#.#.#...#####...#...#.#.....#...............#...#...#...#
#.#######.#.#####.#####.#.###.#.#.#######.#####.#.#######.###.#.#.###.#.#.#####.#.#.#.#.#########.#.#.###.#.#########################.#######
#.....#...#.#.....###...#...#.#.#.......#.#...#.#.....#...#...#.#.#...#.#.#.....#.#...#...#...#...#...#...#...#.......................###...#
#####.#.###.#.#######.#####.#.#.#######.#.#.#.#.#####.#.###.###.#.#.###.#.#.#####.#######.#.#.#.#######.#####.#.#########################.#.#
#.....#...#.#.......#.....#...#.....#...#...#.#...#...#.....#...#...#...#.#.#...#.#.......#.#.#.#.....#.###...#.....#...###...#.....#...#.#.#
#.#######.#.#######.#####.#########.#.#######.###.#.#########.#######.###.#.#.#.#.#.#######.#.#.#.###.#.###.#######.#.#.###.#.#.###.#.#.#.#.#
#.....#...#.#.......#...#.........#...#...#...#...#.#...#...#...#.....###.#.#.#...#...#...#.#.#...#...#...#...#...#...#.....#...#...#.#.#.#.#
#####.#.###.#.#######.#.#########.#####.#.#.###.###.#.#.#.#.###.#.#######.#.#.#######.#.#.#.#.#####.#####.###.#.#.###############.###.#.#.#.#
#.....#.###.#.#...#...#.#...#...#...#...#...###.#...#.#...#...#.#.......#.#.#...#.....#.#...#.#...#.....#.....#.#.#...............###.#.#.#.#
#.#####.###.#.#.#.#.###.#.#.#.#.###.#.#########.#.###.#######.#.#######.#.#.###.#.#####.#####.#.#.#####.#######.#.#.#################.#.#.#.#
#.....#.....#.#.#.#...#...#.#.#.....#.#...###...#.#...#....S#...#.......#.#.#...#.....#.#.....#.#.#.....#.......#.#.......#...........#.#.#.#
#####.#######.#.#.###.#####.#.#######.#.#.###.###.#.###.#########.#######.#.#.#######.#.#.#####.#.#.#####.#######.#######.#.###########.#.#.#
#...#.#.......#.#...#.....#.#.......#.#.#...#.#...#.....#####.....###...#.#...#.......#.#...#...#.#.....#.#.....#.........#.#...........#.#.#
#.#.#.#.#######.###.#####.#.#######.#.#.###.#.#.#############.#######.#.#.#####.#######.###.#.###.#####.#.#.###.###########.#.###########.#.#
#.#.#.#.......#.#...###...#.........#.#.#...#.#.......#######.###...#.#.#.....#.###...#.#...#.#...#...#.#.#.#...#...#...###.#.............#.#
#.#.#.#######.#.#.#####.#############.#.#.###.#######.#######.###.#.#.#.#####.#.###.#.#.#.###.#.###.#.#.#.#.#.###.#.#.#.###.###############.#
#.#...#.......#.#.#...#.............#...#...#.#...#...#######.#...#.#.#.#...#.#...#.#...#...#.#...#.#...#...#.....#.#.#...#.#.......#.....#.#
#.#####.#######.#.#.#.#############.#######.#.#.#.#.#########.#.###.#.#.#.#.#.###.#.#######.#.###.#.###############.#.###.#.#.#####.#.###.#.#
#.#...#...###...#...#.....#.......#.#.......#.#.#...#########.#...#.#.#.#.#.#.#...#.#.......#.#...#...#.............#.#...#.#.....#...###...#
#.#.#.###.###.###########.#.#####.#.#.#######.#.#############.###.#.#.#.#.#.#.#.###.#.#######.#.#####.#.#############.#.###.#####.###########
#...#...#...#...#...#.....#.....#...#...#...#.#.#...#########.#...#...#.#.#.#.#.#...#...#...#.#.#.....#.............#.#.....#.....#...###...#
#######.###.###.#.#.#.#########.#######.#.#.#.#.#.#.#########.#.#######.#.#.#.#.#.#####.#.#.#.#.#.#################.#.#######.#####.#.###.#.#
###...#.#...###...#.#.#...#.....#...#...#.#...#.#.#.#######...#.......#.#.#.#.#.#.....#...#...#.#...#...#.......#...#.#.....#.....#.#.#...#.#
###.#.#.#.#########.#.#.#.#.#####.#.#.###.#####.#.#.#######.#########.#.#.#.#.#.#####.#########.###.#.#.#.#####.#.###.#.###.#####.#.#.#.###.#
#...#...#.....#...#.#.#.#.#.......#.#...#.....#.#.#.#######...#...#...#.#.#.#.#.#.....#.........#...#.#...#...#...#...#...#.......#.#.#.#...#
#.###########.#.#.#.#.#.#.#########.###.#####.#.#.#.#########.#.#.#.###.#.#.#.#.#.#####.#########.###.#####.#.#####.#####.#########.#.#.#.###
#.#.......#...#.#...#...#...#...#...#...#...#.#.#.#.#########.#.#...#...#.#...#.#.....#.#...#...#.###.......#...#...#.....#.........#...#...#
#.#.#####.#.###.###########.#.#.#.###.###.#.#.#.#.#.#########.#.#####.###.#####.#####.#.#.#.#.#.#.#############.#.###.#####.###############.#
#.#.#...#.#.....#...#...#...#.#.#...#.....#...#...#.###.......#...###...#.#.....#...#.#.#.#...#.#.#...#.........#...#.......#.......#.....#.#
#.#.#.#.#.#######.#.#.#.#.###.#.###.###############.###.#########.#####.#.#.#####.#.#.#.#.#####.#.#.#.#.###########.#########.#####.#.###.#.#
#...#.#...#.....#.#...#.#.....#...#.............###.###...#.....#.#...#...#.......#...#...#...#...#.#.#.......#...#.#.........#...#...#...#.#
#####.#####.###.#.#####.#########.#############.###.#####.#.###.#.#.#.#####################.#.#####.#.#######.#.#.#.#.#########.#.#####.###.#
#.....#...#.###...###...#...#...#.............#.#...#E#...#.#...#...#...#...#...###.........#.###...#.........#.#...#...........#.....#...#.#
#.#####.#.#.#########.###.#.#.#.#############.#.#.###.#.###.#.#########.#.#.#.#.###.#########.###.#############.#####################.###.#.#
#.#.....#...#...#...#.#...#...#.............#...#.....#.....#.#.....#...#.#...#...#.........#.#...#.............#...#...#...#...#...#...#...#
#.#.#########.#.#.#.#.#.###################.#################.#.###.#.###.#######.#########.#.#.###.#############.#.#.#.#.#.#.#.#.#.###.#####
#...#.......#.#...#...#...#...#...#...#...#.#.................#.###.#.....#.....#.#.........#...#...#.......#.....#...#...#...#...#...#.....#
#####.#####.#.###########.#.#.#.#.#.#.#.#.#.#.#################.###.#######.###.#.#.#############.###.#####.#.#######################.#####.#
###...#...#...#...........#.#...#...#...#...#.#...#.......#...#...#...#...#...#.#.#...#...#.......###.#...#.#...............#...#...#.......#
###.###.#.#####.###########.#################.#.#.#.#####.#.#.###.###.#.#.###.#.#.###.#.#.#.#########.#.#.#.###############.#.#.#.#.#########
#...#...#.......#...#...#...#.............#...#.#.#...###...#...#.###...#.#...#...###...#...#...#...#.#.#.#...#.....#...#...#.#...#.........#
#.###.###########.#.#.#.#.###.###########.#.###.#.###.#########.#.#######.#.#################.#.#.#.#.#.#.###.#.###.#.#.#.###.#############.#
#.....#...........#.#.#.#...#.#...........#.....#.#...#...#.....#.......#.#.....#...#.........#...#.#...#...#.#...#...#.#.#...#.............#
#######.###########.#.#.###.#.#.#################.#.###.#.#.###########.#.#####.#.#.#.#############.#######.#.###.#####.#.#.###.#############
#...#...#...#.....#...#.....#.#...........###...#...###.#...#...#...#...#...#...#.#.#.#...........#.........#...#.....#...#...#...#.....#...#
#.#.#.###.#.#.###.###########.###########.###.#.#######.#####.#.#.#.#.#####.#.###.#.#.#.#########.#############.#####.#######.###.#.###.#.#.#
#.#...#...#.#...#.....#.....#.#.........#.....#...#...#...#...#...#.#.....#...###.#.#...#.........#...........#.#...#...#...#.#...#.#...#.#.#
#.#####.###.###.#####.#.###.#.#.#######.#########.#.#.###.#.#######.#####.#######.#.#####.#########.#########.#.#.#.###.#.#.#.#.###.#.###.#.#
#.#.....###.....#.....#...#.#.#.....###.........#.#.#...#.#...#.....#...#...#.....#.#.....#.....#...###.......#...#.....#.#.#.#.....#.....#.#
#.#.#############.#######.#.#.#####.###########.#.#.###.#.###.#.#####.#.###.#.#####.#.#####.###.#.#####.#################.#.#.#############.#
#.#.....#.........#...#...#...#.....#.....#...#.#...#...#...#.#.....#.#.....#.....#.#.#...#.###.#.....#...#...#...#...###.#...#...#.........#
#.#####.#.#########.#.#.#######.#####.###.#.#.#.#####.#####.#.#####.#.###########.#.#.#.#.#.###.#####.###.#.#.#.#.#.#.###.#####.#.#.#########
#.#.....#...#...#...#...#.......#...#.#...#.#.#.....#...#...#...###.#.###.....#...#...#.#...#...#...#.#...#.#.#.#.#.#.....#...#.#...#...#...#
#.#.#######.#.#.#.#######.#######.#.#.#.###.#.#####.###.#.#####.###.#.###.###.#.#######.#####.###.#.#.#.###.#.#.#.#.#######.#.#.#####.#.#.#.#
#.#...#.....#.#.#.#.......#...#...#...#.....#.....#.....#.....#.#...#...#.#...#...#.....###...#...#...#.....#.#.#...#.......#.#.#...#.#.#.#.#
#.###.#.#####.#.#.#.#######.#.#.#################.###########.#.#.#####.#.#.#####.#.#######.###.#############.#.#####.#######.#.#.#.#.#.#.#.#
#.#...#.#.....#...#.........#...#...........#...#.........#...#.#.......#.#.#...#.#.#.......#...#...........#...#...#.....###...#.#...#.#.#.#
#.#.###.#.#######################.#########.#.#.#########.#.###.#########.#.#.#.#.#.#.#######.###.#########.#####.#.#####.#######.#####.#.#.#
#.#...#...#...#...#...#...#.....#.......###...#...........#.....#.....#...#.#.#.#...#.....#...#...#.......#.#.....#.....#.........#...#...#.#
#.###.#####.#.#.#.#.#.#.#.#.###.#######.#########################.###.#.###.#.#.#########.#.###.###.#####.#.#.#########.###########.#.#####.#
#.#...#.....#.#.#.#.#.#.#.#...#.......#.........#...#...#.....#...#...#.#...#.#...........#.###.....#...#.#.#.......###.........#...#.......#
#.#.###.#####.#.#.#.#.#.#.###.#######.#########.#.#.#.#.#.###.#.###.###.#.###.#############.#########.#.#.#.#######.###########.#.###########
#...###.....#...#...#...#...#.......#.........#...#...#.#...#.#...#.###.#...#.......#...#...#.....#...#...#.........#...#.....#.#.###...#...#
###########.###############.#######.#########.#########.###.#.###.#.###.###.#######.#.#.#.###.###.#.#################.#.#.###.#.#.###.#.#.#.#
#.....#...#...........#...#.......#.#.......#...#...#...#...#.#...#...#.#...###...#...#...###...#.#...................#.#.#...#...#...#...#.#
#.###.#.#.###########.#.#.#######.#.#.#####.###.#.#.#.###.###.#.#####.#.#.#####.#.#############.#.#####################.#.#.#######.#######.#
#...#.#.#.#...#...###...#.......#.#...#.....#...#.#...###...#.#...#...#.#...#...#...#...#...#...#...............#.....#...#.........#...#...#
###.#.#.#.#.#.#.#.#############.#.#####.#####.###.#########.#.###.#.###.###.#.#####.#.#.#.#.#.#################.#.###.###############.#.#.###
#...#...#...#...#.......#.......#.......#...#.....#.......#.#.#...#.....#...#...#...#.#.#.#.#.#...............#.#...#.....#.....#.....#.#...#
#.#####################.#.###############.#.#######.#####.#.#.#.#########.#####.#.###.#.#.#.#.#.#############.#.###.#####.#.###.#.#####.###.#
#.#.....#...#.......#...#.......#.........#...#...#...#...#.#.#...#.......#...#.#.#...#.#.#.#.#.#.............#...#.....#...###.#...###.....#
#.#.###.#.#.#.#####.#.#########.#.###########.#.#.###.#.###.#.###.#.#######.#.#.#.#.###.#.#.#.#.#.###############.#####.#######.###.#########
#.#.#...#.#...#...#.#.#.......#...#...........#.#.....#.#...#.....#.#...#...#...#.#...#.#.#.#...#...............#.......#.....#...#.........#
#.#.#.###.#####.#.#.#.#.#####.#####.###########.#######.#.#########.#.#.#.#######.###.#.#.#.###################.#########.###.###.#########.#
#...#.....#.....#...#.#...#...#...#.........#...#...#...#.........#.#.#.#.#...#...#...#...#.....#...#...#.....#...........#...###...#.......#
###########.#########.###.#.###.#.#########.#.###.#.#.###########.#.#.#.#.#.#.#.###.###########.#.#.#.#.#.###.#############.#######.#.#######
#...###...#.........#.#...#.....#...........#.#...#...###.......#.#...#.#...#.#...#...#.........#.#...#...###...........#...#...###...#...###
#.#.###.#.#########.#.#.#####################.#.#########.#####.#.#####.#####.###.###.#.#########.#####################.#.###.#.#######.#.###
#.#.....#.....#...#.#.#.....#.......#.......#.#.###.....#...#...#.....#...#...#...###.#.#.......#...#.................#...#...#.#.......#...#
#.###########.#.#.#.#.#####.#.#####.#.#####.#.#.###.###.###.#.#######.###.#.###.#####.#.#.#####.###.#.###############.#####.###.#.#########.#
#...#...#...#...#...#...###...###...#.#.....#.#...#...#.....#.#...###.#...#...#.#.....#.#.#.....###...###.............#...#.#...#...#.......#
###.#.#.#.#.###########.#########.###.#.#####.###.###.#######.#.#.###.#.#####.#.#.#####.#.#.#############.#############.#.#.#.#####.#.#######
#...#.#...#.....#.....#...###...#.....#...###...#...#.......#.#.#...#.#.#...#.#.#.....#...#.#...#...#...#...#...........#.#.#.#.....#.......#
#.###.#########.#.###.###.###.#.#########.#####.###.#######.#.#.###.#.#.#.#.#.#.#####.#####.#.#.#.#.#.#.###.#.###########.#.#.#.###########.#
#...#.#.....#...#.###...#.....#.........#.#...#.#...###...#.#.#...#.#.#.#.#.#.#...#...#.....#.#.#.#.#.#.....#.#.......#...#.#...#.....#...#.#
###.#.#.###.#.###.#####.###############.#.#.#.#.#.#####.#.#.#.###.#.#.#.#.#.#.###.#.###.#####.#.#.#.#.#######.#.#####.#.###.#####.###.#.#.#.#
#...#.#...#...#...#...#...#...#.......#...#.#.#.#.....#.#.#.#.....#...#.#.#.#.#...#...#.....#.#...#.#.........#.....#...###.#.....###...#...#
#.###.###.#####.###.#.###.#.#.#.#####.#####.#.#.#####.#.#.#.###########.#.#.#.#.#####.#####.#.#####.###############.#######.#.###############
#.#...#...#...#.#...#.....#.#.#.#.....#...#.#.#.#.....#.#.#.........#...#.#.#.#.#...#...#...#...#...#...#.......#...###.....#...............#
#.#.###.###.#.#.#.#########.#.#.#.#####.#.#.#.#.#.#####.#.#########.#.###.#.#.#.#.#.###.#.#####.#.###.#.#.#####.#.#####.###################.#
#.#.#...#...#...#.....#...#.#.#.#.#...#.#.#.#.#.#.#...#.#.#...#...#.#...#.#.#.#.#.#...#.#...#...#...#.#.#.....#...#.....#.....#.............#
#.#.#.###.###########.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.###.#.#.#.#.#.###.#.###.#.#####.#.#.#####.#####.#####.###.#.#############
#...#.....###.........#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#...#.#.#...#...#...#.#...#.....#...#...#...###...#...#...#.#.#...#...#...#
#############.#########.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#####.#.#.###.#.#.#########.###.#.#######.#######.#.#####.###.#.###.#.#.#.#.#.#.#.#.#
#.............#...#...#.#.#.#...#.#.#.#.#.#.#...#...#.#.....#.#.#.#...#.#.........#.#...#.#...#...###.....#.......#...#.....#.#...#...#...#.#
#.#############.#.#.#.#.#.#.#####.#.#.#.#.#.#########.#####.#.#.#.#.###.#########.#.#.###.#.#.#.#####.#############.#########.#############.#
#...#...#.....#.#...#.#.#...#.....#.#...#.#.........#...#...#.#.#.#.###...#...#...#.#.#...#.#...#...#.....#.......#.........#.#...#.......#.#
###.#.#.#.###.#.#####.#.#####.#####.#####.#########.###.#.###.#.#.#.#####.#.#.#.###.#.#.###.#####.#.#####.#.#####.#########.#.#.#.#.#####.#.#
#...#.#...#...#.#.....#.....#.....#...#...#...#.....#...#.#...#.#.#.....#.#.#.#...#.#.#...#.......#.#.....#.....#.#...#.....#...#.#...#...#.#
#.###.#####.###.#.#########.#####.###.#.###.#.#.#####.###.#.###.#.#####.#.#.#.###.#.#.###.#########.#.#########.#.#.#.#.#########.###.#.###.#
#...#.#...#...#.#.....#...#...###.#...#.....#.#.....#...#.#...#.#.....#.#...#...#.#.#.###...#...#...#.#...#.....#.#.#.#.........#.#...#...#.#
###.#.#.#.###.#.#####.#.#.###.###.#.#########.#####.###.#.###.#.#####.#.#######.#.#.#.#####.#.#.#.###.#.#.#.#####.#.#.#########.#.#.#####.#.#
#...#.#.#.....#.###...#.#...#.#...#.#.....#...#...#.###.#.#...#.....#.#.#...###.#.#.#.#.....#.#.#...#.#.#.#.#...#...#.#...#.....#.#...#...#.#
#.###.#.#######.###.###.###.#.#.###.#.###.#.###.#.#.###.#.#.#######.#.#.#.#.###.#.#.#.#.#####.#.###.#.#.#.#.#.#.#####.#.#.#.#####.###.#.###.#
#.#...#...#...#...#...#...#...#.....#...#...#...#.#.#...#.#.#...#...#.#.#.#.....#.#.#.#.#.....#.#...#.#.#.#...#.#.....#.#.#.....#.#...#.#...#
#.#.#####.#.#.###.###.###.#############.#####.###.#.#.###.#.#.#.#.###.#.#.#######.#.#.#.#.#####.#.###.#.#.#####.#.#####.#.#####.#.#.###.#.###
#...#...#...#...#...#.....#...###...###.#...#.###...#...#.#.#.#.#...#.#.#...#...#.#.#.#.#...#...#.###...#.#.....#.....#.#...#...#.#...#.#.###
#####.#.#######.###.#######.#.###.#.###.#.#.#.#########.#.#.#.#.###.#.#.###.#.#.#.#.#.#.###.#.###.#######.#.#########.#.###.#.###.###.#.#.###
#.....#.........#...###.....#.....#.....#.#.#...#.......#.#.#.#.#...#.#.#...#.#...#.#.#.....#.#...#.......#.........#.#.#...#...#...#.#.#...#
#.###############.#####.#################.#.###.#.#######.#.#.#.#.###.#.#.###.#####.#.#######.#.###.###############.#.#.#.#####.###.#.#.###.#
#.............#...#.....#...#...#...#...#.#...#.#...#...#.#...#.#...#.#.#...#.#.....#.....#...#...#.#.....#.....#...#.#.#.#...#...#...#.....#
#############.#.###.#####.#.#.#.#.#.#.#.#.###.#.###.#.#.#.#####.###.#.#.###.#.#.#########.#.#####.#.#.###.#.###.#.###.#.#.#.#.###.###########
#.............#.###.#...#.#.#.#.#.#.#.#.#...#.#...#...#.#...#...#...#.#.###...#...#...#...#.#...#.#...#...#...#.#...#...#.#.#...#...###...###
#.#############.###.#.#.#.#.#.#.#.#.#.#.###.#.###.#####.###.#.###.###.#.#########.#.#.#.###.#.#.#.#####.#####.#.###.#####.#.###.###.###.#.###
#.......#.....#.#...#.#...#.#.#.#.#.#.#.#...#.#...###...#...#...#...#.#.#.........#.#.#...#...#...#.....#...#.#...#...###.#.###...#.....#...#
#######.#.###.#.#.###.#####.#.#.#.#.#.#.#.###.#.#####.###.#####.###.#.#.#.#########.#.###.#########.#####.#.#.###.###.###.#.#####.#########.#
#.....#...#...#.#...#...###.#.#...#.#.#.#.#...#.....#...#...###.#...#...#...#.......#...#...#.......#...#.#...###.....#...#.....#.#...#...#.#
#.###.#####.###.###.###.###.#.#####.#.#.#.#.#######.###.###.###.#.#########.#.#########.###.#.#######.#.#.#############.#######.#.#.#.#.#.#.#
#...#.#...#...#.#...#...#...#...#...#.#.#.#.#...#...#...#...#...#.........#.#.#.........#...#.....#...#...#...#...#.....#...#...#.#.#.#.#.#.#
###.#.#.#.###.#.#.###.###.#####.#.###.#.#.#.#.#.#.###.###.###.###########.#.#.#.#########.#######.#.#######.#.#.#.#.#####.#.#.###.#.#.#.#.#.#
#...#...#.....#.#.....###...#...#.#...#.#.#.#.#...###...#...#.#...#...#...#...#...#.....#...#.....#.........#...#.#...#...#.#.###.#.#.#.#.#.#
#.#############.###########.#.###.#.###.#.#.#.#########.###.#.#.#.#.#.#.#########.#.###.###.#.###################.###.#.###.#.###.#.#.#.#.#.#
#.#...#.....#...#...........#.#...#...#.#.#.#.#.........#...#.#.#.#.#.#.........#.#.#...#...#.#.....#...#...#...#.#...#...#.#...#.#.#.#.#.#.#
#.#.#.#.###.#.###.###########.#.#####.#.#.#.#.#.#########.###.#.#.#.#.#########.#.#.#.###.###.#.###.#.#.#.#.#.#.#.#.#####.#.###.#.#.#.#.#.#.#
#...#...###...###.............#.......#...#...#...........###...#...#...........#...#.....###...###...#...#...#...#.......#.....#...#...#...#
#############################################################################################################################################

15
day20/example.txt Normal file
View File

@ -0,0 +1,15 @@
###############
#...#...#.....#
#.#.#.#.#.###.#
#S#...#.#.#...#
#######.#.#.###
#######.#.#...#
#######.#.###.#
###..E#...#...#
###.#######.###
#...###...#...#
#.#####.#.###.#
#.#...#.#.#...#
#.#.#.#.#.#.###
#...#...#...###
###############

3
day20/go.mod Normal file
View File

@ -0,0 +1,3 @@
module stevenlr.com/aoc2024/day20
go 1.23.3

111
day20/main.go Normal file
View File

@ -0,0 +1,111 @@
package main
import (
"bufio"
"fmt"
"math"
"os"
"slices"
"strings"
)
func main() {
fmt.Println(part1(readData("example.txt")))
fmt.Println(1358)
fmt.Println(part1(readData("data.txt")))
}
func IntAbs(x int) int {
if x >= 0 {
return x
} else {
return -x
}
}
func part1(maze [][]byte) (score1, score2 int) {
startX, startY := findInMaze(maze, 'S')
endX, endY := findInMaze(maze, 'E')
distMap := buildDistMap(maze, startX, startY, endX, endY)
dirs := [][2]int{}
for dy := -20; dy <= 20; dy++ {
for dx := -20; dx <= 20; dx++ {
d := IntAbs(dx) + IntAbs(dy)
if d >= 1 && d <= 20 {
dirs = append(dirs, [2]int{dx, dy})
}
}
}
x, y := startX, startY
for x != endX || y != endY {
distNow := distMap[y][x]
xNext, yNext := x, y
for _, dir := range dirs {
x2, y2 := x+dir[0], y+dir[1]
dist := IntAbs(dir[0]) + IntAbs(dir[1])
if dist == 1 && maze[y2][x2] != '#' && distMap[y2][x2] > distNow {
xNext, yNext = x2, y2
}
if dist > 1 && x2 >= 0 && y2 >= 0 && y2 < len(maze) && x2 < len(maze[y2]) && distMap[y2][x2] > distNow && maze[y2][x2] != '#' {
saved := distMap[y2][x2] - distNow - dist
if dist == 2 && saved >= 100 {
score1++
}
if saved >= 100 {
score2++
}
}
}
x, y = xNext, yNext
}
return
}
func buildDistMap(maze [][]byte, x, y int, endX, endY int) (distMap [][]int) {
distMap = make([][]int, len(maze))
for y, _ := range distMap {
distMap[y] = make([]int, len(maze[0]))
for x := range distMap[y] {
distMap[y][x] = math.MaxInt
}
}
distMap[y][x] = 0
var dirs = [4][2]int{{1, 0}, {-1, 0}, {0, 1}, {0, -1}}
for x != endX || y != endY {
for _, dir := range dirs {
x2, y2 := x+dir[0], y+dir[1]
if maze[y2][x2] != '#' && distMap[y2][x2] == math.MaxInt {
distMap[y2][x2] = distMap[y][x] + 1
x, y = x2, y2
break
}
}
}
return
}
func findInMaze(maze [][]byte, needle byte) (x, y int) {
for y, line := range maze {
if x := slices.Index(line, needle); x >= 0 {
return x, y
}
}
panic("not found")
}
func readData(fileName string) (maze [][]byte) {
fp, _ := os.Open(fileName)
scanner := bufio.NewScanner(fp)
for scanner.Scan() {
maze = append(maze, []byte(strings.TrimSpace(scanner.Text())))
}
return
}

3
day21/go.mod Normal file
View File

@ -0,0 +1,3 @@
module stevenlr.com/aoc2024/day21
go 1.23.3

183
day21/main.go Normal file
View File

@ -0,0 +1,183 @@
package main
import (
"fmt"
"math"
"strings"
)
type Position struct {
x, y int
}
type Movement struct {
from Position
to Position
}
type Keypad struct {
keys map[byte]Position
forbidden Position
}
var numpad = Keypad{
keys: map[byte]Position{
'7': {0, 0},
'8': {1, 0},
'9': {2, 0},
'4': {0, 1},
'5': {1, 1},
'6': {2, 1},
'1': {0, 2},
'2': {1, 2},
'3': {2, 2},
'0': {1, 3},
'A': {2, 3},
},
forbidden: Position{0, 3},
}
var dirpad = Keypad{
keys: map[byte]Position{
'^': {1, 0},
'A': {2, 0},
'<': {0, 1},
'v': {1, 1},
'>': {2, 1},
},
forbidden: Position{0, 0},
}
type DpKey struct {
code string
depth int
}
func main() {
fmt.Println(part1("029A"), 68)
fmt.Println(part1("980A"), 60)
fmt.Println(part1("179A"), 68)
fmt.Println(part1("456A"), 64)
fmt.Println(part1("379A"), 64)
fmt.Println("")
fmt.Println(137870)
fmt.Println(part1("805A")*805 + part1("170A")*170 + part1("129A")*129 + part1("283A")*283 + part1("540A")*540)
fmt.Println("")
fmt.Println(part2("029A"))
fmt.Println(part2("980A"))
fmt.Println(part2("179A"))
fmt.Println(part2("456A"))
fmt.Println(part2("379A"))
fmt.Println("")
fmt.Println(170279148659464)
fmt.Println(part2("805A")*805 + part2("170A")*170 + part2("129A")*129 + part2("283A")*283 + part2("540A")*540)
}
func part1(code string) int {
memo := make(map[DpKey]int)
return typeCode(memo, code, []Keypad{numpad, dirpad, dirpad}, 0)
}
func part2(code string) int {
memo := make(map[DpKey]int)
return typeCode(memo, code, []Keypad{
numpad,
dirpad, dirpad, dirpad, dirpad, dirpad,
dirpad, dirpad, dirpad, dirpad, dirpad,
dirpad, dirpad, dirpad, dirpad, dirpad,
dirpad, dirpad, dirpad, dirpad, dirpad,
dirpad, dirpad, dirpad, dirpad, dirpad,
}, 0)
}
func combine(prefix []string, suffix []string) (res []string) {
for _, p := range prefix {
for _, s := range suffix {
res = append(res, p+s)
}
}
return
}
func typeCode(memo map[DpKey]int, code string, keypads []Keypad, depth int) int {
subCode := strings.Split(code, "A")
subCode = subCode[:len(subCode)-1]
cost := 0
for _, subCode := range subCode {
cost += typeSubCode(memo, subCode+"A", keypads, depth)
}
return cost
}
func typeSubCode(memo map[DpKey]int, code string, keypads []Keypad, depth int) int {
if cost, isIn := memo[DpKey{code, depth}]; isIn {
return cost
}
codeSeqs := []string{}
{
pos := keypads[depth].keys['A']
seqs := []string{""}
for i := range code {
nextPos := keypads[depth].keys[code[i]]
childSeqs := buildSeqs(keypads[depth], pos, nextPos)
seqs = combine(seqs, childSeqs)
pos = nextPos
}
codeSeqs = append(codeSeqs, seqs...)
}
minCost := math.MaxInt
if depth < len(keypads)-1 {
for _, seq := range codeSeqs {
minCost = min(typeCode(memo, seq, keypads, depth+1), minCost)
}
} else {
for _, seq := range codeSeqs {
minCost = min(len(seq), minCost)
}
}
memo[DpKey{code, depth}] = minCost
return minCost
}
func shortestSeq(seqs []string) int {
minLength := math.MaxInt
for _, s := range seqs {
minLength = min(minLength, len(s))
}
return minLength
}
func buildSeqs(kp Keypad, from, to Position) (seqs []string) {
type Step struct {
p Position
seq string
}
steps := []Step{{from, ""}}
for len(steps) > 0 {
nextSteps := []Step{}
for _, s := range steps {
if s.p == to {
seqs = append(seqs, s.seq+"A")
continue
}
if s.p.x < to.x && !(s.p.x+1 == kp.forbidden.x && s.p.y == kp.forbidden.y) {
nextSteps = append(nextSteps, Step{Position{s.p.x + 1, s.p.y}, s.seq + ">"})
} else if s.p.x > to.x && !(s.p.x-1 == kp.forbidden.x && s.p.y == kp.forbidden.y) {
nextSteps = append(nextSteps, Step{Position{s.p.x - 1, s.p.y}, s.seq + "<"})
}
if s.p.y < to.y && !(s.p.y+1 == kp.forbidden.y && s.p.x == kp.forbidden.x) {
nextSteps = append(nextSteps, Step{Position{s.p.x, s.p.y + 1}, s.seq + "v"})
} else if s.p.y > to.y && !(s.p.y-1 == kp.forbidden.y && s.p.x == kp.forbidden.x) {
nextSteps = append(nextSteps, Step{Position{s.p.x, s.p.y - 1}, s.seq + "^"})
}
}
steps = nextSteps
}
if len(seqs) == 0 {
seqs = []string{"A"}
}
return
}

1540
day22/data.txt Normal file

File diff suppressed because it is too large Load Diff

3
day22/go.mod Normal file
View File

@ -0,0 +1,3 @@
module stevenlr.com/aoc2024/day22
go 1.23.3

80
day22/main.go Normal file
View File

@ -0,0 +1,80 @@
package main
import (
"bufio"
"fmt"
"os"
"slices"
"strconv"
)
func main() {
fmt.Println(part1([]int64{1, 10, 100, 2024}), 37327623)
fmt.Println(part1(readData("data.txt")), 13004408787)
fmt.Println(part2([]int64{1, 2, 3, 2024}), 23)
fmt.Println(part2(readData("data.txt")))
}
func part1(init []int64) (result int64) {
for _, n := range init {
for range 2000 {
n = next(n)
}
result += n
}
return
}
func makeChangeId(memory [4]int, i int) (result int) {
for j := range 4 {
result = result*19 + memory[(i+j)%4] + 9
}
return
}
func part2(init []int64) int {
priceForChangeId := make([]int, 19*19*19*19)
for _, n := range init {
seenChange := make([]bool, 19*19*19*19)
prevPrice := n % 10
memory := [4]int{0, 0, 0, 0}
for i := range 2000 {
n2 := next(n)
price := n2 % 10
change := price - prevPrice
memory[i%4] = int(change)
if i >= 3 {
changeId := makeChangeId(memory, i)
if !seenChange[changeId] {
seenChange[changeId] = true
priceForChangeId[changeId] += int(price)
}
}
n, prevPrice = n2, price
}
}
return slices.Max(priceForChangeId)
}
func prune(a int64) int64 {
return a % 16777216
}
func next(a int64) int64 {
a = prune((a << 6) ^ a)
a = prune((a >> 5) ^ a)
a = prune((a << 11) ^ a)
return a
}
func readData(fileName string) (numbers []int64) {
fp, _ := os.Open(fileName)
scanner := bufio.NewScanner(fp)
for scanner.Scan() {
n, _ := strconv.ParseInt(scanner.Text(), 10, 64)
numbers = append(numbers, n)
}
return
}

3380
day23/data.txt Normal file

File diff suppressed because it is too large Load Diff

32
day23/example.txt Normal file
View File

@ -0,0 +1,32 @@
kh-tc
qp-kh
de-cg
ka-co
yn-aq
qp-ub
cg-tb
vc-aq
tb-ka
wh-tc
yn-cg
kh-ub
ta-co
de-co
tc-td
tb-wq
wh-td
ta-ka
td-qp
aq-cg
wq-ub
ub-vc
de-ta
wq-aq
wq-vc
wh-yn
ka-de
kh-ta
co-tc
wh-qp
tb-vc
td-yn

3
day23/go.mod Normal file
View File

@ -0,0 +1,3 @@
module stevenlr.com/aoc2024/day23
go 1.23.3

144
day23/main.go Normal file
View File

@ -0,0 +1,144 @@
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strings"
)
func main() {
fmt.Println(part1(readData("example.txt")), 7)
fmt.Println(part1(readData("data.txt")), 1043)
fmt.Println("co,de,ka,ta")
fmt.Println(part2(readData("example.txt")))
fmt.Println("ai,bk,dc,dx,fo,gx,hk,kd,os,uz,xn,yk,zs")
fmt.Println(part2(readData("data.txt")))
}
const SIZE = 26 * 26
func buildAdjacency(pairs [][2]int) [][]bool {
matrix := make([][]bool, SIZE)
for a := range matrix {
matrix[a] = make([]bool, SIZE)
}
for _, p := range pairs {
matrix[p[0]][p[1]] = true
matrix[p[1]][p[0]] = true
}
return matrix
}
func part1(pairs [][2]int) (count int) {
matrix := buildAdjacency(pairs)
triples := make(map[[3]int]bool)
for a := range SIZE {
connectedToA := make([]int, 0)
for b := a + 1; b < SIZE; b++ {
if matrix[a][b] {
connectedToA = append(connectedToA, b)
}
}
for ib, b := range connectedToA {
for ic := ib + 1; ic < len(connectedToA); ic++ {
c := connectedToA[ic]
if matrix[b][c] {
sortTriple(&a, &b, &c)
triples[[3]int{a, b, c}] = true
}
}
}
}
for t := range triples {
if containsT(t[0]) || containsT(t[1]) || containsT(t[2]) {
count++
}
}
return count
}
func part2(pairs [][2]int) string {
matrix := buildAdjacency(pairs)
sets := [][]int{}
for a := range SIZE {
isInAnySet := false
for i, set := range sets {
connectedToAll := true
for _, other := range set {
if !matrix[a][other] {
connectedToAll = false
break
}
}
if connectedToAll {
sets[i] = append(set, a)
isInAnySet = true
}
}
if !isInAnySet {
sets = append(sets, []int{a})
}
}
maxSet := []int{}
for _, set := range sets {
if len(set) > len(maxSet) {
maxSet = set
}
}
ids := make([]string, 0, len(maxSet))
for _, id := range maxSet {
ids = append(ids, numToId(id))
}
sort.Sort(sort.StringSlice(ids))
return strings.Join(ids, ",")
}
func containsT(x int) bool {
const MIN = int('t'-'a') * 26
const MAX = MIN + 25
return x >= MIN && x <= MAX
}
func sortTriple(a, b, c *int) {
maybeSwap := func(a, b *int) {
if *a > *b {
*a, *b = *b, *a
}
}
maybeSwap(a, b)
maybeSwap(b, c)
maybeSwap(a, b)
maybeSwap(b, c)
}
func idToNum(s string) int {
return int(s[0]-'a')*26 + int(s[1]-'a')
}
func numToId(id int) string {
return string([]byte{byte(id/26 + 'a'), byte(id%26 + 'a')})
}
func readData(fileName string) (pairs [][2]int) {
fp, _ := os.Open(fileName)
scanner := bufio.NewScanner(fp)
for scanner.Scan() {
line := scanner.Text()
pair := [2]int{idToNum(line[0:2]), idToNum(line[3:5])}
pairs = append(pairs, pair)
}
return
}

313
day24/data-2.txt Normal file
View File

@ -0,0 +1,313 @@
x00: 1
x01: 1
x02: 0
x03: 0
x04: 0
x05: 1
x06: 0
x07: 1
x08: 1
x09: 0
x10: 1
x11: 0
x12: 0
x13: 0
x14: 1
x15: 1
x16: 1
x17: 0
x18: 1
x19: 1
x20: 0
x21: 0
x22: 0
x23: 0
x24: 1
x25: 1
x26: 0
x27: 0
x28: 1
x29: 1
x30: 0
x31: 1
x32: 0
x33: 0
x34: 1
x35: 1
x36: 0
x37: 0
x38: 0
x39: 0
x40: 0
x41: 0
x42: 0
x43: 1
x44: 1
y00: 1
y01: 0
y02: 1
y03: 1
y04: 0
y05: 0
y06: 1
y07: 1
y08: 0
y09: 1
y10: 1
y11: 1
y12: 1
y13: 0
y14: 1
y15: 0
y16: 0
y17: 1
y18: 1
y19: 0
y20: 1
y21: 1
y22: 1
y23: 1
y24: 0
y25: 0
y26: 0
y27: 0
y28: 1
y29: 1
y30: 0
y31: 1
y32: 1
y33: 0
y34: 0
y35: 1
y36: 0
y37: 0
y38: 0
y39: 1
y40: 0
y41: 0
y42: 1
y43: 0
y44: 1
fjm XOR gqp -> z14
x18 XOR y18 -> hdn
wbb AND vnp -> shd
srq OR mpk -> cqw
y30 AND x30 -> tjw
x26 AND y26 -> qhf
y10 XOR x10 -> nbd
y43 XOR x43 -> swn
sfj OR jks -> rkg
y01 XOR x01 -> tct
nsv XOR pjt -> z04
dcq AND knt -> hfc
hfh AND cjm -> jks
hwv OR cpr -> ngm
fsm AND btg -> nhn
y16 AND x16 -> tqh
qtf XOR nsp -> z06
vjv AND vvn -> pbj
y23 XOR x23 -> bpn
tsm OR dnc -> tqq
knt XOR dcq -> z19
ktj AND cmb -> qqf
ckh OR rrp -> cmb
x43 AND y43 -> hrf
mwc OR qjs -> pfv
qpj XOR vmh -> z05
y16 XOR x16 -> dgs
x29 XOR y29 -> kcf
qqf OR jjp -> jmf
rnp XOR mbj -> z03
x12 AND y12 -> cpr
x06 AND y06 -> ksv
swn XOR rkg -> z43
x38 XOR y38 -> fkg
x04 XOR y04 -> nsv
x07 XOR y07 -> dhf
bhp OR shd -> hfh
pwm XOR jgj -> z33
ddd AND hdn -> cfb
qhf OR kqk -> bdh
tcg AND rtn -> ckh
mjj OR dcw -> wps
pjk AND jsv -> sbj
gfr OR ckc -> vts
bnp AND mtq -> tsm
y31 XOR x31 -> gtq
vjv XOR vvn -> z44
tnc XOR gbw -> z09
pjt AND nsv -> tdr
x09 AND y09 -> gcp
x19 XOR y19 -> knt
mkh OR pbj -> z45
bnr AND jhf -> bwd
x22 AND y22 -> kkt
x41 AND y41 -> bhp
x10 AND y10 -> kbs
qnn AND gsw -> mjj
tjw OR rds -> pns
y35 XOR x35 -> srg
pnj XOR srn -> z26
rqp OR qbc -> wrd
gtq XOR pns -> z31
y40 AND x40 -> vpj
y03 AND x03 -> bcm
dgs AND wps -> ckr
jwh OR gcp -> dnn
sqd OR pvg -> qtf
cmb XOR ktj -> z37
vnp XOR wbb -> z41
bpn AND pjm -> hvk
cmj AND hpp -> ckb
bnp XOR mtq -> z20
hds AND cpw -> tmk
jvr OR kbs -> jsv
pcs OR kqm -> pnj
y33 AND x33 -> jbr
jww XOR mrf -> z30
dnn XOR nbd -> z10
x05 XOR y05 -> vmh
x25 AND y25 -> pcs
qbk XOR bpp -> z12
y25 XOR x25 -> rpf
x39 XOR y39 -> cmj
vpj OR nhn -> wbb
y18 AND x18 -> djn
ctm XOR ngm -> z13
pjb AND qtk -> ckc
y15 XOR x15 -> qnn
y31 AND x31 -> nqk
x02 XOR y02 -> ndk
jdv XOR rkk -> z22
x19 AND y19 -> skb
wrd AND nnd -> tjd
y07 AND x07 -> rqp
x01 AND y01 -> mwc
y03 XOR x03 -> mbj
pns AND gtq -> sfd
bwd OR bwm -> jgj
hrf OR grs -> vvn
y17 AND x17 -> dmf
ckr OR tqh -> nbt
x00 AND y00 -> pgc
tqq AND gmm -> ffk
x39 AND y39 -> kqt
pjm XOR bpn -> z23
qrm OR ksv -> rrw
x11 AND y11 -> krf
nbd AND dnn -> jvr
y30 XOR x30 -> mrf
tdr OR psq -> qpj
qnn XOR gsw -> z15
x32 XOR y32 -> jhf
wrd XOR nnd -> z08
x44 AND y44 -> mkh
jhf XOR bnr -> z32
fjm AND gqp -> nbw
jsv XOR pjk -> z11
y21 AND x21 -> stc
hwc OR mvv -> rnp
y13 AND x13 -> rmd
x42 AND y42 -> sfj
y15 AND x15 -> dcw
x28 XOR y28 -> tjn
x38 AND y38 -> mrc
jgj AND pwm -> hqs
srn AND pnj -> kqk
x33 XOR y33 -> pwm
tmk OR fmr -> crw
dhf XOR rrw -> z07
y28 AND x28 -> nbj
y36 AND x36 -> rrp
rkg AND swn -> grs
y17 XOR x17 -> chp
hfh XOR cjm -> z42
tnc AND gbw -> jwh
x37 XOR y37 -> ktj
y21 XOR x21 -> gmm
pjb XOR qtk -> z34
kjb OR nbj -> bvh
nbt XOR chp -> z17
rrw AND dhf -> qbc
pfv XOR ndk -> z02
y27 XOR x27 -> bkd
qpj AND vmh -> sqd
mrc OR ftb -> hpp
hvk OR gpq -> cpw
vts XOR srg -> z35
vfr OR kkt -> pjm
hpp XOR cmj -> z39
y34 AND x34 -> gfr
skb OR hfc -> bnp
rkk AND jdv -> vfr
kcf AND bvh -> crj
ppq OR crj -> jww
btg XOR fsm -> z40
jmf XOR fkg -> z38
y02 AND x02 -> mvv
hdn XOR ddd -> z18
ffk OR stc -> rkk
x44 XOR y44 -> vjv
y08 AND x08 -> vsw
tjd OR vsw -> tnc
pvc OR nbw -> gsw
y42 XOR x42 -> cjm
x06 XOR y06 -> nsp
kcf XOR bvh -> z29
y05 AND x05 -> pvg
x36 XOR y36 -> rtn
y24 AND x24 -> fmr
mbj AND rnp -> ppp
crw AND rpf -> kqm
cpw XOR hds -> z24
pgc XOR tct -> z01
ndk AND pfv -> hwc
x14 XOR y14 -> gqp
qtf AND nsp -> qrm
tct AND pgc -> qjs
rmd OR wdq -> fjm
x20 AND y20 -> dnc
y13 XOR x13 -> ctm
nbt AND chp -> cbf
x40 XOR y40 -> fsm
x32 AND y32 -> bwm
jww AND mrf -> rds
x00 XOR y00 -> z00
dmf OR cbf -> ddd
x29 AND y29 -> ppq
crw XOR rpf -> z25
qbk AND bpp -> hwv
y11 XOR x11 -> pjk
bdh AND bkd -> mpk
wps XOR dgs -> z16
sbj OR krf -> bpp
kqt OR ckb -> btg
x12 XOR y12 -> qbk
y26 XOR x26 -> srn
y34 XOR x34 -> qtk
cqw XOR tjn -> z28
sfd OR nqk -> bnr
hqs OR jbr -> pjb
y08 XOR x08 -> nnd
bdh XOR bkd -> z27
y37 AND x37 -> jjp
tcg XOR rtn -> z36
x04 AND y04 -> psq
gmm XOR tqq -> z21
bgp OR ntc -> tcg
ngm AND ctm -> wdq
y35 AND x35 -> bgp
y23 AND x23 -> gpq
vts AND srg -> ntc
x09 XOR y09 -> gbw
y41 XOR x41 -> vnp
x22 XOR y22 -> jdv
y20 XOR x20 -> mtq
x24 XOR y24 -> hds
cfb OR djn -> dcq
jmf AND fkg -> ftb
ppp OR bcm -> pjt
y27 AND x27 -> srq
tjn AND cqw -> kjb
y14 AND x14 -> pvc

313
day24/data.txt Normal file
View File

@ -0,0 +1,313 @@
x00: 1
x01: 1
x02: 0
x03: 0
x04: 0
x05: 1
x06: 0
x07: 1
x08: 1
x09: 0
x10: 1
x11: 0
x12: 0
x13: 0
x14: 1
x15: 1
x16: 1
x17: 0
x18: 1
x19: 1
x20: 0
x21: 0
x22: 0
x23: 0
x24: 1
x25: 1
x26: 0
x27: 0
x28: 1
x29: 1
x30: 0
x31: 1
x32: 0
x33: 0
x34: 1
x35: 1
x36: 0
x37: 0
x38: 0
x39: 0
x40: 0
x41: 0
x42: 0
x43: 1
x44: 1
y00: 1
y01: 0
y02: 1
y03: 1
y04: 0
y05: 0
y06: 1
y07: 1
y08: 0
y09: 1
y10: 1
y11: 1
y12: 1
y13: 0
y14: 1
y15: 0
y16: 0
y17: 1
y18: 1
y19: 0
y20: 1
y21: 1
y22: 1
y23: 1
y24: 0
y25: 0
y26: 0
y27: 0
y28: 1
y29: 1
y30: 0
y31: 1
y32: 1
y33: 0
y34: 0
y35: 1
y36: 0
y37: 0
y38: 0
y39: 1
y40: 0
y41: 0
y42: 1
y43: 0
y44: 1
fjm XOR gqp -> z14
x18 XOR y18 -> hdn
wbb AND vnp -> shd
srq OR mpk -> cqw
y30 AND x30 -> tjw
x26 AND y26 -> qhf
y10 XOR x10 -> kbs
y43 XOR x43 -> swn
sfj OR jks -> rkg
y01 XOR x01 -> tct
nsv XOR pjt -> z04
dcq AND knt -> hfc
hfh AND cjm -> jks
hwv OR cpr -> ngm
fsm AND btg -> nhn
y16 AND x16 -> tqh
qtf XOR nsp -> ksv
vjv AND vvn -> pbj
y23 XOR x23 -> bpn
tsm OR dnc -> z20
knt XOR dcq -> z19
ktj AND cmb -> qqf
ckh OR rrp -> cmb
x43 AND y43 -> hrf
mwc OR qjs -> pfv
qpj XOR vmh -> z05
y16 XOR x16 -> dgs
x29 XOR y29 -> kcf
qqf OR jjp -> jmf
rnp XOR mbj -> z03
x12 AND y12 -> cpr
x06 AND y06 -> z06
swn XOR rkg -> z43
x38 XOR y38 -> fkg
x04 XOR y04 -> nsv
x07 XOR y07 -> dhf
bhp OR shd -> hfh
pwm XOR jgj -> z33
ddd AND hdn -> cfb
qhf OR kqk -> bdh
tcg AND rtn -> ckh
mjj OR dcw -> wps
pjk AND jsv -> sbj
gfr OR ckc -> vts
bnp AND mtq -> tsm
y31 XOR x31 -> gtq
vjv XOR vvn -> z44
tnc XOR gbw -> z09
pjt AND nsv -> tdr
x09 AND y09 -> gcp
x19 XOR y19 -> knt
mkh OR pbj -> z45
bnr AND jhf -> bwd
x22 AND y22 -> kkt
x41 AND y41 -> bhp
x10 AND y10 -> nbd
qnn AND gsw -> mjj
tjw OR rds -> pns
y35 XOR x35 -> srg
pnj XOR srn -> z26
rqp OR qbc -> wrd
gtq XOR pns -> z31
y40 AND x40 -> vpj
y03 AND x03 -> bcm
dgs AND wps -> ckr
jwh OR gcp -> dnn
sqd OR pvg -> qtf
cmb XOR ktj -> z37
vnp XOR wbb -> z41
bpn AND pjm -> hvk
cmj AND hpp -> z39
bnp XOR mtq -> tqq
hds AND cpw -> tmk
jvr OR kbs -> jsv
pcs OR kqm -> pnj
y33 AND x33 -> jbr
jww XOR mrf -> z30
dnn XOR nbd -> z10
x05 XOR y05 -> vmh
x25 AND y25 -> pcs
qbk XOR bpp -> z12
y25 XOR x25 -> rpf
x39 XOR y39 -> cmj
vpj OR nhn -> wbb
y18 AND x18 -> djn
ctm XOR ngm -> z13
pjb AND qtk -> ckc
y15 XOR x15 -> qnn
y31 AND x31 -> nqk
x02 XOR y02 -> ndk
jdv XOR rkk -> z22
x19 AND y19 -> skb
wrd AND nnd -> tjd
y07 AND x07 -> rqp
x01 AND y01 -> mwc
y03 XOR x03 -> mbj
pns AND gtq -> sfd
bwd OR bwm -> jgj
hrf OR grs -> vvn
y17 AND x17 -> dmf
ckr OR tqh -> nbt
x00 AND y00 -> pgc
tqq AND gmm -> ffk
x39 AND y39 -> kqt
pjm XOR bpn -> z23
qrm OR ksv -> rrw
x11 AND y11 -> krf
nbd AND dnn -> jvr
y30 XOR x30 -> mrf
tdr OR psq -> qpj
qnn XOR gsw -> z15
x32 XOR y32 -> jhf
wrd XOR nnd -> z08
x44 AND y44 -> mkh
jhf XOR bnr -> z32
fjm AND gqp -> nbw
jsv XOR pjk -> z11
y21 AND x21 -> stc
hwc OR mvv -> rnp
y13 AND x13 -> rmd
x42 AND y42 -> sfj
y15 AND x15 -> dcw
x28 XOR y28 -> tjn
x38 AND y38 -> mrc
jgj AND pwm -> hqs
srn AND pnj -> kqk
x33 XOR y33 -> pwm
tmk OR fmr -> crw
dhf XOR rrw -> z07
y28 AND x28 -> nbj
y36 AND x36 -> rrp
rkg AND swn -> grs
y17 XOR x17 -> chp
hfh XOR cjm -> z42
tnc AND gbw -> jwh
x37 XOR y37 -> ktj
y21 XOR x21 -> gmm
pjb XOR qtk -> z34
kjb OR nbj -> bvh
nbt XOR chp -> z17
rrw AND dhf -> qbc
pfv XOR ndk -> z02
y27 XOR x27 -> bkd
qpj AND vmh -> sqd
mrc OR ftb -> hpp
hvk OR gpq -> cpw
vts XOR srg -> z35
vfr OR kkt -> pjm
hpp XOR cmj -> ckb
y34 AND x34 -> gfr
skb OR hfc -> bnp
rkk AND jdv -> vfr
kcf AND bvh -> crj
ppq OR crj -> jww
btg XOR fsm -> z40
jmf XOR fkg -> z38
y02 AND x02 -> mvv
hdn XOR ddd -> z18
ffk OR stc -> rkk
x44 XOR y44 -> vjv
y08 AND x08 -> vsw
tjd OR vsw -> tnc
pvc OR nbw -> gsw
y42 XOR x42 -> cjm
x06 XOR y06 -> nsp
kcf XOR bvh -> z29
y05 AND x05 -> pvg
x36 XOR y36 -> rtn
y24 AND x24 -> fmr
mbj AND rnp -> ppp
crw AND rpf -> kqm
cpw XOR hds -> z24
pgc XOR tct -> z01
ndk AND pfv -> hwc
x14 XOR y14 -> gqp
qtf AND nsp -> qrm
tct AND pgc -> qjs
rmd OR wdq -> fjm
x20 AND y20 -> dnc
y13 XOR x13 -> ctm
nbt AND chp -> cbf
x40 XOR y40 -> fsm
x32 AND y32 -> bwm
jww AND mrf -> rds
x00 XOR y00 -> z00
dmf OR cbf -> ddd
x29 AND y29 -> ppq
crw XOR rpf -> z25
qbk AND bpp -> hwv
y11 XOR x11 -> pjk
bdh AND bkd -> mpk
wps XOR dgs -> z16
sbj OR krf -> bpp
kqt OR ckb -> btg
x12 XOR y12 -> qbk
y26 XOR x26 -> srn
y34 XOR x34 -> qtk
cqw XOR tjn -> z28
sfd OR nqk -> bnr
hqs OR jbr -> pjb
y08 XOR x08 -> nnd
bdh XOR bkd -> z27
y37 AND x37 -> jjp
tcg XOR rtn -> z36
x04 AND y04 -> psq
gmm XOR tqq -> z21
bgp OR ntc -> tcg
ngm AND ctm -> wdq
y35 AND x35 -> bgp
y23 AND x23 -> gpq
vts AND srg -> ntc
x09 XOR y09 -> gbw
y41 XOR x41 -> vnp
x22 XOR y22 -> jdv
y20 XOR x20 -> mtq
x24 XOR y24 -> hds
cfb OR djn -> dcq
jmf AND fkg -> ftb
ppp OR bcm -> pjt
y27 AND x27 -> srq
tjn AND cqw -> kjb
y14 AND x14 -> pvc

47
day24/example.txt Normal file
View File

@ -0,0 +1,47 @@
x00: 1
x01: 0
x02: 1
x03: 1
x04: 0
y00: 1
y01: 1
y02: 1
y03: 1
y04: 1
ntg XOR fgs -> mjb
y02 OR x01 -> tnw
kwq OR kpj -> z05
x00 OR x03 -> fst
tgd XOR rvg -> z01
vdt OR tnw -> bfw
bfw AND frj -> z10
ffh OR nrd -> bqk
y00 AND y03 -> djm
y03 OR y00 -> psh
bqk OR frj -> z08
tnw OR fst -> frj
gnj AND tgd -> z11
bfw XOR mjb -> z00
x03 OR x00 -> vdt
gnj AND wpb -> z02
x04 AND y00 -> kjc
djm OR pbm -> qhw
nrd AND vdt -> hwm
kjc AND fst -> rvg
y04 OR y02 -> fgs
y01 AND x02 -> pbm
ntg OR kjc -> kwq
psh XOR fgs -> tgd
qhw XOR tgd -> z09
pbm OR djm -> kpj
x03 XOR y03 -> ffh
x00 XOR y04 -> ntg
bfw OR bqk -> z06
nrd XOR fgs -> wpb
frj XOR qhw -> z04
bqk OR frj -> z07
y03 OR x01 -> nrd
hwm AND bqk -> z03
tgd XOR rvg -> z12
tnw OR pbm -> gnj

10
day24/example_simple.txt Normal file
View File

@ -0,0 +1,10 @@
x00: 1
x01: 1
x02: 1
y00: 0
y01: 1
y02: 0
x00 AND y00 -> z00
x01 XOR y01 -> z01
x02 OR y02 -> z02

3
day24/go.mod Normal file
View File

@ -0,0 +1,3 @@
module stevenlr.com/aoc2024/day24
go 1.23.3

256
day24/main.go Normal file
View File

@ -0,0 +1,256 @@
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strings"
)
func main() {
fmt.Println(part1(readData("example_simple.txt")), 4)
fmt.Println(part1(readData("example.txt")), 2024)
fmt.Println(part1(readData("data.txt")), 49574189473968)
// fmt.Println(part2(readData("data.txt").gates))
fmt.Println(part2(readData("data-2.txt").gates))
}
const (
AND = "AND"
OR = "OR"
XOR = "XOR"
)
type Gate struct {
op string
a, b string
}
type Circuit struct {
values map[string]bool
gates map[string]Gate
}
func part1(input Circuit) (result uint64) {
queue := []string{}
for output := range input.gates {
queue = append(queue, output)
}
for len(queue) > 0 {
output := queue[len(queue)-1]
if _, alreadyComputed := input.values[output]; alreadyComputed {
queue = queue[:len(queue)-1]
continue
}
gate := input.gates[output]
valueA, okA := input.values[gate.a]
valueB, okB := input.values[gate.b]
if !okA || !okB {
if !okA {
queue = append(queue, gate.a)
}
if !okB {
queue = append(queue, gate.b)
}
} else {
input.values[output] = evaluate(gate.op, valueA, valueB)
queue = queue[:len(queue)-1]
}
}
zWires := []string{}
for wire := range input.values {
if wire[0] == 'z' {
zWires = append(zWires, wire)
}
}
sort.Sort(sort.Reverse(sort.StringSlice(zWires)))
for _, w := range zWires {
if input.values[w] {
result = result<<1 | 1
} else {
result = result << 1
}
}
return
}
func evaluate(op string, a, b bool) bool {
switch op {
case AND:
return a && b
case OR:
return a || b
case XOR:
return a != b
default:
panic("unknown operator")
}
}
func name(prefix byte, num int) string {
a := byte(num%10 + '0')
b := byte(num/10 + '0')
return string([]byte{prefix, b, a})
}
func evaluateAdder(gates map[string]Gate, a, b uint64) uint64 {
circuit := Circuit{gates: gates, values: make(map[string]bool)}
for i := range 50 {
x := a&(uint64(1)<<i) != 0
y := b&(uint64(1)<<i) != 0
circuit.values[name('x', i)] = x
circuit.values[name('y', i)] = y
}
return part1(circuit)
}
func printAround(w string, prefix string, gates map[string]Gate, depth int) {
if depth == 0 {
return
}
if g, ok := gates[w]; ok {
fmt.Println(prefix, w, g)
printAround(g.a, prefix+" ", gates, depth-1)
printAround(g.b, prefix+" ", gates, depth-1)
}
}
func part2(gates map[string]Gate) string {
// ckb-z39
// tqq-z20
// ksv-z06
// kbs-nbd
// ckb,kbs,ksv,nbd,tqq,z06,z20,z39
// fmt.Println("z without xor")
// for out, g := range gates {
// if out[0] == 'z' && g.op != XOR && out != "z45" {
// fmt.Println(out, g)
// }
// }
// z39 {0 cmj hpp} DONE
// z20 {1 tsm dnc} DONE
// z06 {AND x06 y06} DONE
// nsp {XOR x06 y06}
// ksv {XOR qtf nsp}
// printAround("z06", gates, 3)
// fmt.Println("")
// for out, g := range gates {
// if g.a == "nsp" || g.b == "nsp" {
// fmt.Println(out, g)
// }
// }
// fmt.Println("xor without x or y")
// for out, g := range gates {
// if g.op == XOR && (g.a[0] != 'x' && g.a[0] != 'y' && g.b[0] != 'x' && g.b[0] != 'y' && out[0] != 'z') {
// fmt.Println(out, g)
// }
// }
// ckb {2 hpp cmj} DONE
// tqq {2 bnp mtq} DONE
// ksv {2 qtf nsp} DONE
// for i := range uint64(50) {
// x := uint64(1) << i - 1
// res1 := evaluateAdder(gates, x, 1)
// res2 := x + 1
// if res1 != res2 {
// fmt.Println(i, res1, res2)
// }
// }
// Issue at 11
// printAround("z11", "", gates, 4)
// printAround("z10", "", gates, 4)
// z11 {XOR jsv pjk}
// jsv {OR jvr kbs}
// jvr {AND nbd dnn}
// nbd {AND x10 y10}
// dnn {OR jwh gcp}
// kbs {XOR y10 x10}
// pjk {XOR y11 x11}
//
// z10 {XOR dnn nbd}
// dnn {OR jwh gcp}
// jwh {AND tnc gbw}
// tnc {OR tjd vsw}
// gbw {XOR x09 y09}
// gcp {AND x09 y09}
// nbd {AND x10 y10}
// findGate := func(gate Gate) string {
// for output, g := range gates {
// if g.op == gate.op && ((g.a == gate.a && g.b == gate.b) || (g.a == gate.b && g.b == gate.a)) {
// return output
// }
// }
// return ""
// }
// carry := make([]string, 100)
// carry[0] = findGate(Gate{AND, "x00", "y00"})
// if carry[0] == "" {
// panic("Oh no")
// }
// for i := 1; i < 2; i++ {
// if tmpz0 := findGate(Gate{XOR, name('x', i), name('y', i)}); tmpz0 != "" {
// fmt.Println("tmpz0", i, name('x', i), name('y', i), "->", tmpz0)
// z := findGate(Gate{XOR, tmpz0, carry[i-1]})
// if z[0] == 'z' {
// fmt.Println("z", i, tmpz0, carry[i-1], "->", z)
// } else {
// fmt.Println("oh no")
// }
// } else if tmpz0 := findGate(Gate{XOR, name('x', i), carry[i-1]}); tmpz0 != "" {
// fmt.Println("tmpz0", i, name('x', i), carry[i-1], "->", tmpz0)
// } else if tmpz0 := findGate(Gate{XOR, name('y', i), carry[i-1]}); tmpz0 != "" {
// fmt.Println("tmpz0", i, name('y', i), carry[i-1], "->", tmpz0)
// }
// }
// // for output, g := range gates {
// // }
return ""
}
func readData(fileName string) (data Circuit) {
data = Circuit{
values: make(map[string]bool),
gates: make(map[string]Gate),
}
fp, _ := os.Open(fileName)
scanner := bufio.NewScanner(fp)
for scanner.Scan() {
line := strings.TrimSpace(scanner.Text())
if len(line) == 0 {
break
}
wire := line[0:3]
value := line[5] == '1'
data.values[wire] = value
}
for scanner.Scan() {
line := strings.Split(strings.TrimSpace(scanner.Text()), " ")
data.gates[line[4]] = Gate{line[1], line[0], line[2]}
}
return
}

3999
day25/data.txt Normal file

File diff suppressed because it is too large Load Diff

39
day25/example.txt Normal file
View File

@ -0,0 +1,39 @@
#####
.####
.####
.####
.#.#.
.#...
.....
#####
##.##
.#.##
...##
...#.
...#.
.....
.....
#....
#....
#...#
#.#.#
#.###
#####
.....
.....
#.#..
###..
###.#
###.#
#####
.....
.....
.....
#....
#.#..
#.#.#
#####

3
day25/go.mod Normal file
View File

@ -0,0 +1,3 @@
module stevenlr.com/aoc2024/day25
go 1.23.3

64
day25/main.go Normal file
View File

@ -0,0 +1,64 @@
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
fmt.Println(part1(readData("example.txt")), 3)
fmt.Println(part1(readData("data.txt")), 3)
}
type Data struct {
keys [][5]int
locks [][5]int
}
func fits(k, l [5]int) bool {
for i := range k {
if k[i]+l[i] > 5 {
return false
}
}
return true
}
func part1(data Data) (count int) {
for _, k := range data.keys {
for _, l := range data.locks {
if fits(k, l) {
count++
}
}
}
return
}
func readData(fileName string) (data Data) {
data = Data{}
fp, _ := os.Open(fileName)
scanner := bufio.NewScanner(fp)
for scanner.Scan() {
isKey := scanner.Text()[0] == '.'
code := [5]int{0, 0, 0, 0, 0}
for i := 0; scanner.Scan() && i < 5; i++ {
line := scanner.Text()
for j := range 5 {
if line[j] == '#' {
code[j]++
}
}
}
scanner.Scan()
if isKey {
data.keys = append(data.keys, code)
} else {
data.locks = append(data.locks, code)
}
}
return
}

10
go.work
View File

@ -8,6 +8,16 @@ use (
./day13
./day14
./day15
./day16
./day17
./day18
./day19
./day20
./day21
./day22
./day23
./day24
./day25
./day2
./day3
./day4