Compare commits
10 Commits
7ea9fa5a6b
...
main
Author | SHA1 | Date | |
---|---|---|---|
5f7666ee13 | |||
46859764ad | |||
c6ca510a5c | |||
865aaa1117 | |||
1ea4c003ac | |||
be16486655 | |||
fac8626030 | |||
4572482be6 | |||
431ee3626a | |||
68f5cce6fb |
@ -55,7 +55,7 @@ func (queue *CandidateQueue) Len() int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (queue *CandidateQueue) Less(i, j int) bool {
|
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) {
|
func (queue *CandidateQueue) Swap(i, j int) {
|
||||||
|
141
day16/data.txt
Normal file
141
day16/data.txt
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
#############################################################################################################################################
|
||||||
|
#.....#.........#.............#.............................#...........#.............#.......#.....#...#...........#.........#.......#....E#
|
||||||
|
#.#.#.#.#.#######.#####.#####.#.#############.###.###.#.###.#.#####.###.#######.#.###.#.###.###.###.#.#.#.#######.#.#.#######.#.###.#.#.###.#
|
||||||
|
#.#.#...#...#.....#...#.....#.......#.....#.....#.#...#...#.#.#.....#.#.......#.#...#...#.#...........................#...#...#.#.#.#.#...#.#
|
||||||
|
#.###.###.#.#.#####.#.#####.###.###.#.###.#.#.#.#.#.###.#.#.#.#.#####.#.#####.#.#.#.#####.#######.###.#######.#######.#.#.#.#.#.#.#.#.###.#.#
|
||||||
|
#...#.#...#.#.....#.#.#...#.....#.....#.#...#...#.#.....#.#.....#...#.........#...#.#.......#...#.#...#...#...#...#...#.#.#...#...#.#...#.#.#
|
||||||
|
#.#.#.#.#.#.###.#.#.#.#.#.#####.#######.#####.###.#######.###.#####.#.###########.#.#.#####.#.#.#.#.###.###.###.#.#.###.#.###.###.#.#.#.###.#
|
||||||
|
#.#.#...#.#.....#.#.#...#.....#...#.......#...#.....#...#.........#.#.......#.....#.#.#.....#.#.#.#.#...#...#...#...#.#.#.......#.#...#.....#
|
||||||
|
#.#.#.###.###.#.#.#.#######.###.#.#####.###.#.#.#####.#.#.#.#.###.#.#######.###.#.#.###.###.#.#.#.#.###.#.###.#######.#.#.###.#.#.###.#####.#
|
||||||
|
#.#.#...#...#.#.#.#.....#...#.....#.....#...#...#.....#.#.#.....#...#.....#...#.#.#...#...#.#.#...#.....#.#...#...........#...#.#.#...#...#.#
|
||||||
|
#.#.#.#.#.#.#.#.#.#.#####.#.#.#####.#####.#.#.###.#####.#.#.#.#.#####.###.###.#.#####.#.#.###.#.#######.#.#.###.###.#.###.#.#.#.#.#.#.###.#.#
|
||||||
|
#.#...#.#...#...#.#.#...#.#.#.#...#.#...#...#...#...#...#.#.#.........................#.#.#...#.#.....#.#...#.....#.#.#...#.....#.#.#...#...#
|
||||||
|
#.###.#.#.#####.#.###.#.#.###.#.#.#.#.#.###.#.#####.#.###.###.###.#.###.#####.#.###.#.#.#.#.#####.#.#.#.###########.#.#.#.#.#####.#.#.#.###.#
|
||||||
|
#.....#...#...#.#...#.........#.#...#.#...#.#.#.....#.#.....#.#.....................#.#.#.#.#.....#.#.#.......#.....#.#.#...#.....#...#...#.#
|
||||||
|
#.#.#.###.#.#.#.###.#.###.#.###.#####.###.#.#.#.#####.#.###.#.#.###.#.###.#.#######.#.###.#.#.#####.#.#######.#.###.#.#.#.#.#.#.#####.###.#.#
|
||||||
|
#.#.....#.#.#.#...#...#.#.#...#.....#.#.#...#.#.#.#...#...#.#.....#.....#...#.....#.......#...#.....#...#...#...#...#.#...#...#.#...#...#.#.#
|
||||||
|
#.###.#.#.#.#.###.#####.#.###.#.###.#.#.#.#.###.#.#.###.#.#.#####.#.###.#######.#.#####.#####.#.#######.#.#.#####.#.#.###.#####.#.###.#.#.#.#
|
||||||
|
#.#...#...#.#.#...#.....#.#...#...#.....#...#...#.......#...#...#...#.#.#.......#...#...#...#.#.........#.#.......#.#...........#...#.#...#.#
|
||||||
|
#.#.#.#.#.#.#.#.#.#.#.###.#.#####.#########.#.###.###########.#.#####.#.#.###.#####.#####.#.#.#.#.#######.#####.###.###.#.#.#####.#.#.#.#####
|
||||||
|
#...#.#.#...#...#...#.#...#.#.#.....#.....#...#...#.......#...#...#.....#.#...#...........#.#.#.#...#...........#.#...#.#...#.....#.#.#.#...#
|
||||||
|
#####.#.#.#######.###.#.###.#.#.#####.###.#.#######.#####.#.#####.#.#.#.#.#.#.#############.#.#.#####.#.###.#####.###.#.#########.#.#.###.#.#
|
||||||
|
#.....#.#.....#...#.#.....#.#...#.....#.#.#.#.......#...#...#.....#.#.#.#.#.......#.....#...#.#...#...#.....#.......#.#.........#.#.........#
|
||||||
|
#.#.###.#####.#.###.#######.#.###.#####.#.###.#####.#.#.#####.#####.#.#.#####.###.#.#.###.#######.#.###.#.#########.#.#######.#.###.#.###.#.#
|
||||||
|
#.#.....#...#.#.#...#.....#.#.#...#.....#...#.....#...#.....#...#...#.......#.#...#.#.#...#.......#.#...#.#.................#...#...#...#.#.#
|
||||||
|
#.#######.###.#.#.#.#.###.#.#.#.#####.#####.#####.#.###.#####.#.###########.#.#.#####.#.#####.###.#.#.#.#.#.#####.#.###.#####.###.###.#.###.#
|
||||||
|
#.......#.#...#.#.#.#...#...#.#.....#.#...#.#.....#.#...#...#.#.#.....#...#.#.#...#...#.....#...#.#...#.#...#...#.#...#.....#...#...#.#...#.#
|
||||||
|
#######.#.#.#.#.#.#.###.###########.#.#.#.#.#.#####.#.###.#.#.#.#.###.###.#.#.###.#.#######.#.#.#######.#######.#.#####.###.###.###.#.###.#.#
|
||||||
|
#.....#...#.#.#.#.#...#.....#.....#.#.#.#...#...#...#.#...#.#.#...#...#...#.#.#...#.......#.#.#.......#...#.....#.#...#.#.#.....#...#...#...#
|
||||||
|
#.#####.###.#.#.###.#######.#.###.#.#.#.#.#.###.#.#.###.###.#######.###.#.#.###.###.###.#.#.#.#######.###.###.#.#.#.#.#.#.#.#####.#.###.###.#
|
||||||
|
#.......#...#.#...#.....#.#.#.....#.#.#.#.#...#.#...#...#...........#.#.....#...#.#.#.#.#.#.#.......#...#.....#.#...#...#.........#...#...#.#
|
||||||
|
#.#######.###.###.#.#.#.#.#.###.#.#.#.#.###.#.#.###.#.###.###.#.#.###.#.#####.###.#.#.#.#.#.#####.###.#########.#.#############.#####.###.###
|
||||||
|
#.........#...#...#.#.#.#.#...#.#.#...#...#.#.......#.#.#.#...#...#...........#.......#.#.#.........#.....#...#.#...#.........#.#.....#.#...#
|
||||||
|
#.#######.#.###.###.#.#.#.#.#.#.#.###.###.#.#######.#.#.#.#.#.###.###################.#.#######.###.###.#.###.#.#.#.#.#.#####.#.#.#####.###.#
|
||||||
|
#.#.......#.#.#.#...#.#...#.#.#.#.#.....#...#.....#...#...#.#...#.#...#...............#...........#.#...#.....#.#.#.#.#.....#.#.#.#.......#.#
|
||||||
|
#.#.#######.#.#.###.#.###.#.#.#.#.#.#####.###.###.#.###.###.###.###.#.#.#############.#.###.#######.#.#######.#.#.#.#######.#.#.#.#.#####.#.#
|
||||||
|
#.#.#...#.....#...#.#.#...#.#...#.#.#.........#...#...#...#.#.#.........#.......#...#.#...#...#.......#.#.....#...#.........#...#.#...#.#.#.#
|
||||||
|
#.#.#.#.#########.#.#.###.#.#.###.#.#.#########.#####.###.#.#.###########.#####.###.#.#######.#.#####.#.#.#############.#####.###.###.#.#.#.#
|
||||||
|
#.................#.#...#.#...#.#.#.#.......#.#.#.....#...#.#.......#.......#.......#...#...#.#.#...#...#.#...#.........#...#...#...#.#...#.#
|
||||||
|
#.#####.#.#########.###.#######.#.#.#######.#.#.#.#####.###.#.#####.#######.#.#########.#.#.#.#.#.#.#.#.#.#.#.#.#####.#.#.#.#.#.###.#.#.###.#
|
||||||
|
#.#...#...#.....#...#.#.#.......#.#...#...#.#.........#.#.....#.........#...#.#...#...#.#.#.#...#.#.#.#.#.#.#.#.#...#.#.#.#...#.....#.#.#.#.#
|
||||||
|
#.#.#####.#####.#.###.#.#.#.#####.###.#.#.#.#######.#.###.###.#########.#.#.###.#.#.#.#.#.#.#####.#.###.#.#.#.#.#.#.#.###.###########.#.#.#.#
|
||||||
|
#...#...#.....#...#...#.#.#.....#.....#.#...#.....#.#...#...#...#...#.#...#.#...#...#.#...#.......#...#.#.#.#.#.#.#.#...#.#.#.........#...#.#
|
||||||
|
#.###.#.#####.#.###.#.#.#.#####.#######.###.#.###.#.###.###.#.#.#.#.#.#.#.#.#.#######.#####.#########.#.#.###.#.#.#.###.#.#.#.#######.#####.#
|
||||||
|
#...............#...#.#.....#.....#.....#.#.#.#.#.#...#...#.#.#...#.#.#.#.#.#...#.........#...#.#.....#.....#.#...#.#...#.#...#...#...#.....#
|
||||||
|
#.#.###.#.#.#.#.#####.#######.#####.#####.#.#.#.#.###.#.#.#.#.#####.#.#.#.###.###.#.#.###.#.#.#.#.#########.#.#####.#.###.#.###.#.#.#.#.###.#
|
||||||
|
#.#...#.#.#...#...........#...#.....#...#...#...#.#...#.....#.#...#.#...#.........#.#.#.#...#.#.#.......#...........#...#.#.................#
|
||||||
|
###.###.#.#####.#.#########.#.#.#####.#.#####.###.#.#####.#.#.#.###.#.#.#.#####.###.#.#.#####.#.#######.#.#####.#.#.###.#.#.#.#######.#.#.#.#
|
||||||
|
#...#...#.#.....#.#...#...#.#.#.......#...#...#...#.#.#...#.#...#...#.#.#...#.#.#.#...#.....#.....#...#.#.#...#...#...#...#.#.#.....#.#.#...#
|
||||||
|
#.###.###.###.#.###.#.#.#.#.#.###########.#.###.###.#.#.###.#####.###.#.###.#.#.#.#########.###.###.#.#.###.#.#######.#.#.#.#.#.###.#.#.#.###
|
||||||
|
#.#.#.#.......#.....#.#.#...#.....#.....#...#.#.......#...........#.#.#.......#.#.............#.#...#.#...#.#.......#.#...#.#.#.#...#.#.#.#.#
|
||||||
|
#.#.#.###############.#.#########.#.#.#.#####.#####################.#.###.#####.#.###.#####.###.#.###.#.#.#.#.#.#.#.#.#######.#.###.###.#.#.#
|
||||||
|
#...#...............#.#.#.........#...#.......#.#.........#...#.................#...#.....#.#...#.#.#.#.#.#.#...#.#.#.#.....#.#...#.....#.#.#
|
||||||
|
###.###############.#.#.#.#####.#.###.###.###.#.#.#######.#.#.###.#################.#####.###.###.#.#.#.#.#.#####.###.#.###.#.###.#######.#.#
|
||||||
|
#.#.#.........#...#.#.#.#.#...#.#...#...#.#.......#.....#...#...#...#.......#.....#.#...#.......#.....#.#.#...#.#.....#...#...#...#.#.....#.#
|
||||||
|
#.#.#.#######.#.#.#.#.#.#.#.#.#.###.#.###.#.#####.#.###.#######.###.#.#####.#.#.#.###.#.#.#######.#.###.#.###.#.#########.#.###.###.#.#.###.#
|
||||||
|
#.#.#...#...#...#.#.#...#...#.#.#...#.#...#...#...#.......#.....#...#.....#.#.#.......#.#.#.......#...#.#...#...#.........#.#.............#.#
|
||||||
|
#.#.#.#.#.#######.#.#.#######.###.#####.###.###.###.###.###.###.###.#.###.#.#.#########.###.#########.#.###.###.#.#########.#.#####.#.#.#.#.#
|
||||||
|
#.#.#.#.#.....#...#.........#...#.#.....#...#...#.#...#...#.......#...#...#.#.........#.#...#.......#.#.#.#...#...#.........#.....#.....#...#
|
||||||
|
#.#.###.#.#.###.###########.#.#.#.#.#.###.###.###.###.###.#######.###.#.###.###.#####.#.#.###.#.###.#.#.#.#.#######.#########.###.#####.###.#
|
||||||
|
#.#.....#.......#.....#...#.#.#.#.#.#.#.....#.#.....#.#.#.......#.....#...#...#.#...#.#.#...........#.#...#.......#.#.....#.......#.......#.#
|
||||||
|
#.#######.#####.#.#.#.#.#.#.#.#.#.###.#.#####.###.#.#.#.#.#####.###.#.#.#.###.#.#.#.#.#.###.###.#####.#####.#####.#.#.#####.#.#####.###.#.###
|
||||||
|
#.....#.#.....#...#.#...#.#.#.#.#.....#.#.....#...#.#...#.#.#...#...#.#...#...#...#.#.#.#.......#...#.............#...#.....#.#.........#...#
|
||||||
|
#.###.#.#####.#####.###.#.#.#.#.#.#######.#####.#####.###.#.#.#.#.#####.###.#######.#.#.#.#######.#########.#.#######.#.#######.#######.###.#
|
||||||
|
#...#.#.............#.....#.#.#...#.......#.....#.....#...#.#.#.#.....#.#...#.......#.#.#.....#...#.........#.#.......#.....#.......#.......#
|
||||||
|
#.#.#.###.#.#########.#####.#######.#########.###.#####.###.#.#.#####.#.#.###########.#.#####.#.###.###.###.#.#.###########.#.#.#####.#.###.#
|
||||||
|
#.#.#...#.#...#.............#.......#.......#.#...#...#.#...#.#.....#.#.#...#.....#...#.......#.....#.......#.#.....#.....#...#.....#.#...#.#
|
||||||
|
#.#.#.#.###.#.#.#####.#####.#.#######.#####.#.#.###.###.###.#.###.#.#.#.###.#.###.#.###########.#####.###.###.#####.#.###.#####.###.#.#.###.#
|
||||||
|
#...........#.#.#...#.#.....#.#.......#.....#.#.....#...#...#.....#.#.#...#.#.#...#.#...........#...#.#...#.......#...#.....#...#.#.#.#.....#
|
||||||
|
#.#.#.#########.#.#.#.#.###.#.#######.#.#####.#.#####.###.#.#######.#.###.#.#.#.###.#######.#.###.#.#.#.###.#.#.#######.#####.#.#.#.#.#.#####
|
||||||
|
#.#.#.#.........#.#...#...#.#...#.....#...#...#.#.....#.....#.....#.#.....#.#.#.#.#...#...#...#...#.#.#...#.#.#.........#.#...#...#.#.#.#...#
|
||||||
|
#.#.#.#.#########.###.###.#####.#.#######.#.###.#.#####.###.###.###.#####.#.#.#.#.#.#.#.#.#.###.#####.#.#.#.#.#.#########.#.###.#.#.#.#.###.#
|
||||||
|
#.#.....#.....#...#...#.#.....#...#.....#.#.....#.#.....#.#.....#...#.#.#.#...#.#...#.#.#.#.....#.....#...#.#...#.........#...#...#...#.....#
|
||||||
|
#.###.###.#.#.#.###.###.#####.#####.###.#.#######.#.#####.#.#.#.#.###.#.#.#####.#.###.#.#.#######.###.#.#####.###.#######.#.#.#.###########.#
|
||||||
|
#.......#.#.#...#.#.....#...#.#...#.#...#...#.....#...#.....#...#.#...#.#.#.....#...#...#.......#.#...#.....#...#...#.....#...#.....#...#...#
|
||||||
|
#####.#.###.#####.#####.#.#.#.#.#.#.#.#####.#.#######.#.#.###.###.#.#.#.###.#######.###########.#.#########.###.#####.#####.###.#.#.###.#.###
|
||||||
|
#.....#.....#...#.....#...#.#...#...#.....#.#...#.....#.#.....#.#...#.#...#.#...#...#.......#...#.#...#...#.#...#.....#.....#...#.#.#...#...#
|
||||||
|
#.###.#######.#.#####.###.#.###########.###.#.#.#.#####.#######.#####.###.#.#.###.#######.#.#.###.#.#.#.#.#.#.###.###.#.#.###.#.#.#.#.#.###.#
|
||||||
|
#...#.#.......#.......#.....#...#.......#...#.#.#.#...#.#.........#.#...#...#...#.......#.#.#.#.#...#...#.........#...#.#.....#...#...#.#...#
|
||||||
|
#.#.#.#.###########.###.#######.#.#.#####.#####.#.#.#.#.#.#######.#.###.#####.#.#.#####.#.#.#.#.#.#############.#######.#.###.#####.#####.###
|
||||||
|
#.#.#.#.#.....#...#.....#.....#.#.......#.....#.#.#.#.#.#.....#.......#.....#.#...#...#...#.#.#.#...#...#.......#.........#...#...#.#.......#
|
||||||
|
###.#.#.#.###.#.###.#.#.###.#.#.#.#####.#####.#.#.#.#.#.#####.#.###########.#######.#.#####.#.#.###.#.#.#.#######.#######.#####.#.###.#####.#
|
||||||
|
#...#...#.#...#.....#.#...#.....#.....#.....#.#.#.#.#.#.......#...#.......#.......#.#...#...#.#...#...#.#...#...#...#.....#.....#...#.#...#.#
|
||||||
|
#.###.###.#.###.#.#.#.#.#.#.###.#.###.#####.#.#.#.#.###########.###.#####.#######.#.#.#.#.#.#.#.#.#####.###.#.#.###.#####.#.#######.#.#.#.###
|
||||||
|
#.#.......#.#...#...#...#...#...#.#.#.....#...#.#.#.........#...#...#...#...#.....#.#...#...#.#.#.#.........#.#...#...............#...#.#...#
|
||||||
|
#.#.#######.#.###############.###.#.#####.#####.#.#.#######.#.###.#####.###.#.#.###.#.#######.#.###.#######.#.###.#####.#.#############.###.#
|
||||||
|
#...#.............#.........#.#...#.....#.......#.#.#.....#.#...#.........#.#.......#.........#...#.......#.#.#.#.....#.#...#...........#.#.#
|
||||||
|
#.###.#.#####.#.#.#######.#.#.#.#.#.###.#########.#.#####.#.###.#########.#.###################.#.#######.###.#.#####.#.#####.###########.#.#
|
||||||
|
#...#.#...#...#.#...#.....#.#...#...#.....#.......#...#...#...#.#.#.....#.#...........#.........#.......#...#.#.......#.....#.....#.......#.#
|
||||||
|
###.#.###.###.#.###.#.#####.#####.###.###.#####.#####.#.###.###.#.#.###.#.###.#######.#.#####.#.###.###.###.#.#.###.#.#.#.#.#####.#.#####.#.#
|
||||||
|
#.#.#...........#...#.#...#.#.......#.#...#...#.#...#.#...#...#...#.#...#.#.#.....#.....#...#.#.#.#.#.....#...#.#...#.#...#.....#.#...#.....#
|
||||||
|
#.#.#.#####.#######.#.#.#.#.#########.#.###.#.#.#.#.#.###.###.###.#.#.###.#.#####.#####.#.#.#.#.#.#.###########.#####.#.###.#####.###.#.#.#.#
|
||||||
|
#.#.#.....#...#...#.#.#.#...#.........#.#...#.#.#.#.#.......#.....#.#...#.#.#...#.....#...#...#...#.#.......#...#.....#...#.....#...#.#...#.#
|
||||||
|
#.#.#.#.#####.#.#.#.#.#.#####.#########.#.###.#.#.#.#.#############.###.#.#.#.#.#####.#####.#.###.#.#.###.#.###.#.###########.#.###.#.###.#.#
|
||||||
|
#...#.#.#.....#.#.#...#.#.....#...#.......#...#.#.#.#.#...............#...#...#.....#.....#...#...#.#...#.#.....#.#.#.......#.#.....#...#.#.#
|
||||||
|
#.#####.#.#####.#.#####.#.#####.#.#.#########.#.#.#.#.#.#################.#.#######.#####.#####.###.###.#.#####.#.#.#.#.###.#.#######.#.#.#.#
|
||||||
|
#.......#.......#.#...#.#.....#.#.#.#.......#.....#.#.#.............#...#.#...#.....#.........#.#.#.....#.....#.#.#.#.#.#...#.........#.#.#.#
|
||||||
|
###.#########.#.#.#.#.#.#####.#.#.#.#.#####.#####.#.#########.#####.#.#.#.###.#.###.#.#.#####.#.#.###########.###.#.#.#.#.#############.#.#.#
|
||||||
|
#...#.........#.#...#.#.....#.#.#.#.#.....#.......#.....#...#...#...#.#.#...#.#.#.#.#.#.....#.#.......#.....#.....#.#.#.#...........#.#.#.#.#
|
||||||
|
#.###.#######.#.#####.#####.#.###.#.#####.#############.#.#.###.#.###.#.###.###.#.#.#######.#.#######.#.###########.#.#.###########.#.#.#.#.#
|
||||||
|
#...............#...#.#.......#...#...#...........#...#...#.......#...#...#...#.#...#.....#.#...#.#...#.#...#.....#...#...#...#.....#...#.#.#
|
||||||
|
#.#.#.#.#.###.###.#.#.#########.#.#.###.#########.#.#.###.#########.#####.###.#.###.#.###.#.#.#.#.#.###.#.#.#.###.#.#####.#.###.#####.###.#.#
|
||||||
|
#.....#...........#.#.....#.....#.#.#...#.....#...#.#...#...#...#...#.....#...#...#...#.#...#.#.....#.....#.#...#.#.#...#.#.........#.#...#.#
|
||||||
|
###.#.#######.#####.#####.#.#.#.###.#.###.###.#.###.###.#.###.#.#.###.#####.#####.#####.###.#.#####.#####.#.###.#.#.#.#.#.#.#######.###.###.#
|
||||||
|
#...#.#...#...#...........#...#.....#...#.#.#.#...#...#.......#...#.........#.....#...#.....#.#...#.....#.#.....#...#.....#...#...#...#.#...#
|
||||||
|
#.###.#.#.#.#.#########.#.#####.#######.#.#.#.###.###.#############.###.#.#####.###.#.###.###.#.#.#####.#.###########.#########.#.###.#.###.#
|
||||||
|
#...#...#...#.#.......#.#.....#.#.....#.#.#...........#.#.........#...#.#.....#...#.#.......#...#.#.....#.#.........#...........#.#.........#
|
||||||
|
###.#########.#.#####.#.#####.#.#.###.#.#.#############.#.#######.###.#.###.#.###.#.###.###.#####.#.#####.#.###.#####.###########.#.#####.#.#
|
||||||
|
#.#.#.......#.#.....#.#.......#.#...#.#.#.....#.........#.#.....#.#...#.....#.#...#.#.#.#.......#.#.#.#...#.#...#...#.#.....#.....#.......#.#
|
||||||
|
#.#.#.#######.###.###.#########.###.#.#.#####.#.#######.#.#####.#.#.#########.#.#.#.#.#.#####.###.#.#.#.#####.#.#.#.#.#.###.#.#############.#
|
||||||
|
#...#...#.....#...#...#.......#...#.#.#.....#.#.....#...#.....#.#...#.......#.#.#.#.#.....#...#...#.........#.#.#...#.#.#.#.#.#.#.........#.#
|
||||||
|
#.###.#.#.###.#.###.###.#######.###.#.#####.#.#####.#.#.#.#.#.#.#######.###.#.#.#.#.#####.#####.#.#.###.#.#.#.#.#.#.###.#.#.#.#.#.###.#####.#
|
||||||
|
#.#...#.#...#.#.#.#.#...........#...#.#.....#.#.......#.#.#.#.#...#...#.#...#...#.#...#.....#...#.#...#...#...#.#.#.#...#.................#.#
|
||||||
|
#.#####.###.#.#.#.#.#.###########.###.#.#####.###.#.#.###.#.#.#.#.#.#.#.#.###.#####.#.#.###.#.###.###.###########.#.#.###.###.#####.###.#.#.#
|
||||||
|
#.......#...#.#...#.#.......#.....#.#...#...#...#...#...#...#...#.#.#...#...#.#...#.#...#.#.....#.#.#.#...........#.#...#.#...#.....#...#...#
|
||||||
|
#########.###.###.#.#.#######.#####.#####.###.#.###.###.#.#.#####.#.#######.###.#.#.###.#.#####.#.#.#.#.###########.#.#.#.###.#.###.#.#######
|
||||||
|
#.........#...#...#.#.#.......#...........#.....#.#.#.#...#.#...#...#.....#.....#.#.#...#.......#...#.#.#.........#.#...#...#...............#
|
||||||
|
#.#######.###.#.###.#.#.#######.#######.###.#####.#.#.#####.#.#.###.#.#.#########.#.#.###.###.#####.#.#.#.#######.#.#.#####.#.#.#.#####.#.###
|
||||||
|
#...#...#.#.....#...#.#.#.....#.#.....#.#...#.......#.......#.#...#...#.........#.#.#.#.....#.......#.#.#...#.....#.#.....#...#.#.#.....#...#
|
||||||
|
###.#.#.#.#.#.###.#####.#.###.#.#####.#.#.###.#########.#####.###.#.#####.#####.#.#.#.#####.#########.#.###.#.###.#.#.###.#######.#.#####.#.#
|
||||||
|
#...#.....#.....#.#.....#.#.#...#.....#.#...#...........#...#...#.....#...#.....#.#.#.....#.........#.#.#...#.#.#.#.#.#...#.....#.#...#...#.#
|
||||||
|
#.###.#.#####.#.#.#.#####.#.#####.#####.###.###.#########.#.###########.#.#######.#######.#####.###.#.#.#.###.#.#.#.###.###.###.#.###.#####.#
|
||||||
|
#.#.....#.....#.#.#.....#.#.....#.#...#...#...#...........#...........#.#.#.......#.......#.#.......#...#.#...#...#...#.....#...#...#.#.....#
|
||||||
|
#.###.#.#.#.#.#.#.#####.#.#.#.#.#.#.#.###.###.#####.#.#####.#########.#.#.#.#######.#######.#.#########.###.###.#####.#.#####.#####.#.#.#.#.#
|
||||||
|
#.........#.....#.....#.#.#.#.#...#.#.......#.....#.#.........#.......#.#.......#...#.......#.#.............#.#.....#.#...#...#.....#...#.#.#
|
||||||
|
#.###.#.###.#.#####.#.#.#.###.###.#.#########.###.#.#.#######.#.#######.#######.#.###.#.#####.#.#########.###.#.#####.#.###.###.#.#.#####.#.#
|
||||||
|
#...#.....#.....#.....#.#...#...#.#.#.......#.#...#.#.#...#...#.#.............#...#...#.#.....#.#...#...#.#.....#.....#.#...#...#.#...#.....#
|
||||||
|
###.#.#.#.###.###.#.###.#.#.###.#.#.#.#####.###.###.#.#.#.#.###.###.#######.#.#####.###.#.#####.#.#.#.###.#.#.###.###.#.#.###.###.###.#.#####
|
||||||
|
#.#.#...#...#.....#.#...#.#.#...#...#.#...#...#...#.......#...#...#.#.......#.#.......#.#.#...#...#...#...#.#.....#...#.#.#.....#.#...#.....#
|
||||||
|
#.#.#.#.###.#.#######.#####.#.#.#.###.#.#.###.#.#.#.#########.###.###.#.#####.#.#####.#.#.#.#.#######.#.#####.#######.#.#.#####.#.#.#######.#
|
||||||
|
#.....#...#.#.......#...#...#...#.#...#.#.........#.#...#...#...#.#...#.......#.....#.#.#.#.#.#...#.#.#.......#.....#...#...#...#.#.#.....#.#
|
||||||
|
#.###.#.#.#.#.#####.###.#.###.#.#.#.###.#.###########.#.#.#.###.#.#.#.#.#####.#####.#.#.#.#.#.#.#.#.#.#.#####.#.###.#.#####.#####.#.#.#.###.#
|
||||||
|
#.#.......#.#.#.......#...#.............#.#...#.......#.....................#.......#.......#...#...#.....#.....#...#.....#.....#.#.#.#.....#
|
||||||
|
###.###.###.#.#.#####.#####.#.#########.#.###.#.###.#######.#.#########.#.#.#######.###.###############.#.###.###.###.#########.#.#.#.#######
|
||||||
|
#...#...#.......#...#...#...#.#.......#.#.#...#.#.........#.#.#...#.....#.#.......#.....#...............#...#...#.#...#.........#.#.#.#.#...#
|
||||||
|
#.###.#.#####.###.#.###.#.#.#.#.#####.#.#.#.#.#.###.#.#####.#.#.#.#.###.#.#######.#####.#.#########.#.#.###.#.#.#.#####.#########.###.#.#.#.#
|
||||||
|
#.#...#...#.......#.........#...#...#.#.#...#.#.....#.#...#.#...#...#.....#.....#...#...#.....#.#...#.#...#.....#.....#...#.........#.#...#.#
|
||||||
|
#.#.#####.###.#############.#####.###.#.#############.#.#.#.#.#######.#.###.#######.#.#.#####.#.#.#####.#.###########.#.#.###.#####.#.#####.#
|
||||||
|
#...#...#...#.#.....#.........................#...#...#.#...#.......#.#.........#...#.......#...#.#...#.#.........................#.#.......#
|
||||||
|
#.###.#.###.###.###.#.###.###.###.#.###.#####.#.#.#.###.#############.#.#######.#.###.#.#######.#.#.#.#.#####.#.###########.#.###.#.#######.#
|
||||||
|
#S....#...#.......#.....#.......#...........#...#.....#.........................#.....#.........#...#.......#...............#.....#.........#
|
||||||
|
#############################################################################################################################################
|
15
day16/example.txt
Normal file
15
day16/example.txt
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
###############
|
||||||
|
#.......#....E#
|
||||||
|
#.#.###.# ###.#
|
||||||
|
#.....#.#...#.#
|
||||||
|
#.###.#####.#.#
|
||||||
|
#.#.#.......#.#
|
||||||
|
#.#.#####.###.#
|
||||||
|
#...........#.#
|
||||||
|
###.#.#####.#.#
|
||||||
|
#...#.....#.#.#
|
||||||
|
#.#.#.###.#.#.#
|
||||||
|
#.....#...#.#.#
|
||||||
|
#.###.#.#.#.#.#
|
||||||
|
#S..#.....#...#
|
||||||
|
###############
|
17
day16/example2.txt
Normal file
17
day16/example2.txt
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#################
|
||||||
|
#...#...#...#..E#
|
||||||
|
#.#.#.#.#.#.#.#.#
|
||||||
|
#.#.#.#...#...#.#
|
||||||
|
#.#.#.#.###.#.#.#
|
||||||
|
#...#.#.#.....#.#
|
||||||
|
#.#.#.#.#.#####.#
|
||||||
|
#.#...#.#.#.....#
|
||||||
|
#.#.#####.#.###.#
|
||||||
|
#.#.#.......#...#
|
||||||
|
#.#.###.#####.###
|
||||||
|
#.#.#...#.....#.#
|
||||||
|
#.#.#.#####.###.#
|
||||||
|
#.#.#.........#.#
|
||||||
|
#.#.#.#########.#
|
||||||
|
#S#.............#
|
||||||
|
#################
|
3
day16/go.mod
Normal file
3
day16/go.mod
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
module stevenlr.com/aoc2024/day16
|
||||||
|
|
||||||
|
go 1.23.3
|
138
day16/main.go
Normal file
138
day16/main.go
Normal 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
9
day16/simple.txt
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#####
|
||||||
|
# E#
|
||||||
|
# # #
|
||||||
|
# # #
|
||||||
|
# # #
|
||||||
|
# # #
|
||||||
|
# # #
|
||||||
|
#S #
|
||||||
|
#####
|
3
day17/go.mod
Normal file
3
day17/go.mod
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
module stevenlr.com/aoc2024/day17
|
||||||
|
|
||||||
|
go 1.23.3
|
115
day17/main.go
Normal file
115
day17/main.go
Normal 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
3450
day18/data.txt
Normal file
File diff suppressed because it is too large
Load Diff
25
day18/example.txt
Normal file
25
day18/example.txt
Normal 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
3
day18/go.mod
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
module stevenlr.com/aoc2024/day18
|
||||||
|
|
||||||
|
go 1.23.3
|
204
day18/main.go
Normal file
204
day18/main.go
Normal 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
402
day19/data.txt
Normal 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
10
day19/example.txt
Normal 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
3
day19/go.mod
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
module stevenlr.com/aoc2024/day19
|
||||||
|
|
||||||
|
go 1.23.3
|
105
day19/main.go
Normal file
105
day19/main.go
Normal 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
141
day20/data.txt
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
#############################################################################################################################################
|
||||||
|
#...........#...#...#...#.....#...###...#...................#...#.....#.................#.......###...###.......###...###...................#
|
||||||
|
#.#########.#.#.#.#.#.#.#.###.#.#.###.#.#.#################.#.#.#.###.#.###############.#.#####.###.#.###.#####.###.#.###.#################.#
|
||||||
|
#.....#.....#.#...#...#.#...#...#.#...#.#.................#...#...#...#.......#.........#.#.....#...#...#.#.....#...#...#.....#.............#
|
||||||
|
#####.#.#####.#########.###.#####.#.###.#################.#########.#########.#.#########.#.#####.#####.#.#.#####.#####.#####.#.#############
|
||||||
|
###...#.....#.........#.###.....#.#...#.###.......#.....#...#.......#.......#.#.#.........#.....#.....#.#.#.#...#.....#.###...#.#...#...#...#
|
||||||
|
###.#######.#########.#.#######.#.###.#.###.#####.#.###.###.#.#######.#####.#.#.#.#############.#####.#.#.#.#.#.#####.#.###.###.#.#.#.#.#.#.#
|
||||||
|
#...#.......###...#...#.#.......#.....#...#.#.....#...#.....#.......#.....#.#.#.#.....#.........###...#.#.#...#.#...#.#...#...#...#...#...#.#
|
||||||
|
#.###.#########.#.#.###.#.###############.#.#.#######.#############.#####.#.#.#.#####.#.###########.###.#.#####.#.#.#.###.###.#############.#
|
||||||
|
#...#...###...#.#.#...#...#.............#.#.#.###...#.........#.....#...#.#.#.#...###.#.###...#...#...#.#.#.....#.#.#.#...#...#...#.........#
|
||||||
|
###.###.###.#.#.#.###.#####.###########.#.#.#.###.#.#########.#.#####.#.#.#.#.###.###.#.###.#.#.#.###.#.#.#.#####.#.#.#.###.###.#.#.#########
|
||||||
|
###...#...#.#...#.###.......#...#.....#.#.#.#...#.#...........#...###.#.#.#.#.#...#...#.....#.#.#.....#...#...#...#...#.....#...#...#.......#
|
||||||
|
#####.###.#.#####.###########.#.#.###.#.#.#.###.#.###############.###.#.#.#.#.#.###.#########.#.#############.#.#############.#######.#####.#
|
||||||
|
#...#.#...#.#.....#.......#...#.#...#.#.#...#...#.....#.....#...#...#.#.#.#.#.#.###...#...#...#.........#.....#.#.............#...#...#...#.#
|
||||||
|
#.#.#.#.###.#.#####.#####.#.###.###.#.#.#####.#######.#.###.#.#.###.#.#.#.#.#.#.#####.#.#.#.###########.#.#####.#.#############.#.#.###.#.#.#
|
||||||
|
#.#...#...#.#.....#.....#.#...#.#...#...#.....#...###...#...#.#.#...#.#.#.#...#.#...#.#.#...#####...#...#.#.....#...............#...#...#...#
|
||||||
|
#.#######.#.#####.#####.#.###.#.#.#######.#####.#.#######.###.#.#.###.#.#.#####.#.#.#.#.#########.#.#.###.#.#########################.#######
|
||||||
|
#.....#...#.#.....###...#...#.#.#.......#.#...#.#.....#...#...#.#.#...#.#.#.....#.#...#...#...#...#...#...#...#.......................###...#
|
||||||
|
#####.#.###.#.#######.#####.#.#.#######.#.#.#.#.#####.#.###.###.#.#.###.#.#.#####.#######.#.#.#.#######.#####.#.#########################.#.#
|
||||||
|
#.....#...#.#.......#.....#...#.....#...#...#.#...#...#.....#...#...#...#.#.#...#.#.......#.#.#.#.....#.###...#.....#...###...#.....#...#.#.#
|
||||||
|
#.#######.#.#######.#####.#########.#.#######.###.#.#########.#######.###.#.#.#.#.#.#######.#.#.#.###.#.###.#######.#.#.###.#.#.###.#.#.#.#.#
|
||||||
|
#.....#...#.#.......#...#.........#...#...#...#...#.#...#...#...#.....###.#.#.#...#...#...#.#.#...#...#...#...#...#...#.....#...#...#.#.#.#.#
|
||||||
|
#####.#.###.#.#######.#.#########.#####.#.#.###.###.#.#.#.#.###.#.#######.#.#.#######.#.#.#.#.#####.#####.###.#.#.###############.###.#.#.#.#
|
||||||
|
#.....#.###.#.#...#...#.#...#...#...#...#...###.#...#.#...#...#.#.......#.#.#...#.....#.#...#.#...#.....#.....#.#.#...............###.#.#.#.#
|
||||||
|
#.#####.###.#.#.#.#.###.#.#.#.#.###.#.#########.#.###.#######.#.#######.#.#.###.#.#####.#####.#.#.#####.#######.#.#.#################.#.#.#.#
|
||||||
|
#.....#.....#.#.#.#...#...#.#.#.....#.#...###...#.#...#....S#...#.......#.#.#...#.....#.#.....#.#.#.....#.......#.#.......#...........#.#.#.#
|
||||||
|
#####.#######.#.#.###.#####.#.#######.#.#.###.###.#.###.#########.#######.#.#.#######.#.#.#####.#.#.#####.#######.#######.#.###########.#.#.#
|
||||||
|
#...#.#.......#.#...#.....#.#.......#.#.#...#.#...#.....#####.....###...#.#...#.......#.#...#...#.#.....#.#.....#.........#.#...........#.#.#
|
||||||
|
#.#.#.#.#######.###.#####.#.#######.#.#.###.#.#.#############.#######.#.#.#####.#######.###.#.###.#####.#.#.###.###########.#.###########.#.#
|
||||||
|
#.#.#.#.......#.#...###...#.........#.#.#...#.#.......#######.###...#.#.#.....#.###...#.#...#.#...#...#.#.#.#...#...#...###.#.............#.#
|
||||||
|
#.#.#.#######.#.#.#####.#############.#.#.###.#######.#######.###.#.#.#.#####.#.###.#.#.#.###.#.###.#.#.#.#.#.###.#.#.#.###.###############.#
|
||||||
|
#.#...#.......#.#.#...#.............#...#...#.#...#...#######.#...#.#.#.#...#.#...#.#...#...#.#...#.#...#...#.....#.#.#...#.#.......#.....#.#
|
||||||
|
#.#####.#######.#.#.#.#############.#######.#.#.#.#.#########.#.###.#.#.#.#.#.###.#.#######.#.###.#.###############.#.###.#.#.#####.#.###.#.#
|
||||||
|
#.#...#...###...#...#.....#.......#.#.......#.#.#...#########.#...#.#.#.#.#.#.#...#.#.......#.#...#...#.............#.#...#.#.....#...###...#
|
||||||
|
#.#.#.###.###.###########.#.#####.#.#.#######.#.#############.###.#.#.#.#.#.#.#.###.#.#######.#.#####.#.#############.#.###.#####.###########
|
||||||
|
#...#...#...#...#...#.....#.....#...#...#...#.#.#...#########.#...#...#.#.#.#.#.#...#...#...#.#.#.....#.............#.#.....#.....#...###...#
|
||||||
|
#######.###.###.#.#.#.#########.#######.#.#.#.#.#.#.#########.#.#######.#.#.#.#.#.#####.#.#.#.#.#.#################.#.#######.#####.#.###.#.#
|
||||||
|
###...#.#...###...#.#.#...#.....#...#...#.#...#.#.#.#######...#.......#.#.#.#.#.#.....#...#...#.#...#...#.......#...#.#.....#.....#.#.#...#.#
|
||||||
|
###.#.#.#.#########.#.#.#.#.#####.#.#.###.#####.#.#.#######.#########.#.#.#.#.#.#####.#########.###.#.#.#.#####.#.###.#.###.#####.#.#.#.###.#
|
||||||
|
#...#...#.....#...#.#.#.#.#.......#.#...#.....#.#.#.#######...#...#...#.#.#.#.#.#.....#.........#...#.#...#...#...#...#...#.......#.#.#.#...#
|
||||||
|
#.###########.#.#.#.#.#.#.#########.###.#####.#.#.#.#########.#.#.#.###.#.#.#.#.#.#####.#########.###.#####.#.#####.#####.#########.#.#.#.###
|
||||||
|
#.#.......#...#.#...#...#...#...#...#...#...#.#.#.#.#########.#.#...#...#.#...#.#.....#.#...#...#.###.......#...#...#.....#.........#...#...#
|
||||||
|
#.#.#####.#.###.###########.#.#.#.###.###.#.#.#.#.#.#########.#.#####.###.#####.#####.#.#.#.#.#.#.#############.#.###.#####.###############.#
|
||||||
|
#.#.#...#.#.....#...#...#...#.#.#...#.....#...#...#.###.......#...###...#.#.....#...#.#.#.#...#.#.#...#.........#...#.......#.......#.....#.#
|
||||||
|
#.#.#.#.#.#######.#.#.#.#.###.#.###.###############.###.#########.#####.#.#.#####.#.#.#.#.#####.#.#.#.#.###########.#########.#####.#.###.#.#
|
||||||
|
#...#.#...#.....#.#...#.#.....#...#.............###.###...#.....#.#...#...#.......#...#...#...#...#.#.#.......#...#.#.........#...#...#...#.#
|
||||||
|
#####.#####.###.#.#####.#########.#############.###.#####.#.###.#.#.#.#####################.#.#####.#.#######.#.#.#.#.#########.#.#####.###.#
|
||||||
|
#.....#...#.###...###...#...#...#.............#.#...#E#...#.#...#...#...#...#...###.........#.###...#.........#.#...#...........#.....#...#.#
|
||||||
|
#.#####.#.#.#########.###.#.#.#.#############.#.#.###.#.###.#.#########.#.#.#.#.###.#########.###.#############.#####################.###.#.#
|
||||||
|
#.#.....#...#...#...#.#...#...#.............#...#.....#.....#.#.....#...#.#...#...#.........#.#...#.............#...#...#...#...#...#...#...#
|
||||||
|
#.#.#########.#.#.#.#.#.###################.#################.#.###.#.###.#######.#########.#.#.###.#############.#.#.#.#.#.#.#.#.#.###.#####
|
||||||
|
#...#.......#.#...#...#...#...#...#...#...#.#.................#.###.#.....#.....#.#.........#...#...#.......#.....#...#...#...#...#...#.....#
|
||||||
|
#####.#####.#.###########.#.#.#.#.#.#.#.#.#.#.#################.###.#######.###.#.#.#############.###.#####.#.#######################.#####.#
|
||||||
|
###...#...#...#...........#.#...#...#...#...#.#...#.......#...#...#...#...#...#.#.#...#...#.......###.#...#.#...............#...#...#.......#
|
||||||
|
###.###.#.#####.###########.#################.#.#.#.#####.#.#.###.###.#.#.###.#.#.###.#.#.#.#########.#.#.#.###############.#.#.#.#.#########
|
||||||
|
#...#...#.......#...#...#...#.............#...#.#.#...###...#...#.###...#.#...#...###...#...#...#...#.#.#.#...#.....#...#...#.#...#.........#
|
||||||
|
#.###.###########.#.#.#.#.###.###########.#.###.#.###.#########.#.#######.#.#################.#.#.#.#.#.#.###.#.###.#.#.#.###.#############.#
|
||||||
|
#.....#...........#.#.#.#...#.#...........#.....#.#...#...#.....#.......#.#.....#...#.........#...#.#...#...#.#...#...#.#.#...#.............#
|
||||||
|
#######.###########.#.#.###.#.#.#################.#.###.#.#.###########.#.#####.#.#.#.#############.#######.#.###.#####.#.#.###.#############
|
||||||
|
#...#...#...#.....#...#.....#.#...........###...#...###.#...#...#...#...#...#...#.#.#.#...........#.........#...#.....#...#...#...#.....#...#
|
||||||
|
#.#.#.###.#.#.###.###########.###########.###.#.#######.#####.#.#.#.#.#####.#.###.#.#.#.#########.#############.#####.#######.###.#.###.#.#.#
|
||||||
|
#.#...#...#.#...#.....#.....#.#.........#.....#...#...#...#...#...#.#.....#...###.#.#...#.........#...........#.#...#...#...#.#...#.#...#.#.#
|
||||||
|
#.#####.###.###.#####.#.###.#.#.#######.#########.#.#.###.#.#######.#####.#######.#.#####.#########.#########.#.#.#.###.#.#.#.#.###.#.###.#.#
|
||||||
|
#.#.....###.....#.....#...#.#.#.....###.........#.#.#...#.#...#.....#...#...#.....#.#.....#.....#...###.......#...#.....#.#.#.#.....#.....#.#
|
||||||
|
#.#.#############.#######.#.#.#####.###########.#.#.###.#.###.#.#####.#.###.#.#####.#.#####.###.#.#####.#################.#.#.#############.#
|
||||||
|
#.#.....#.........#...#...#...#.....#.....#...#.#...#...#...#.#.....#.#.....#.....#.#.#...#.###.#.....#...#...#...#...###.#...#...#.........#
|
||||||
|
#.#####.#.#########.#.#.#######.#####.###.#.#.#.#####.#####.#.#####.#.###########.#.#.#.#.#.###.#####.###.#.#.#.#.#.#.###.#####.#.#.#########
|
||||||
|
#.#.....#...#...#...#...#.......#...#.#...#.#.#.....#...#...#...###.#.###.....#...#...#.#...#...#...#.#...#.#.#.#.#.#.....#...#.#...#...#...#
|
||||||
|
#.#.#######.#.#.#.#######.#######.#.#.#.###.#.#####.###.#.#####.###.#.###.###.#.#######.#####.###.#.#.#.###.#.#.#.#.#######.#.#.#####.#.#.#.#
|
||||||
|
#.#...#.....#.#.#.#.......#...#...#...#.....#.....#.....#.....#.#...#...#.#...#...#.....###...#...#...#.....#.#.#...#.......#.#.#...#.#.#.#.#
|
||||||
|
#.###.#.#####.#.#.#.#######.#.#.#################.###########.#.#.#####.#.#.#####.#.#######.###.#############.#.#####.#######.#.#.#.#.#.#.#.#
|
||||||
|
#.#...#.#.....#...#.........#...#...........#...#.........#...#.#.......#.#.#...#.#.#.......#...#...........#...#...#.....###...#.#...#.#.#.#
|
||||||
|
#.#.###.#.#######################.#########.#.#.#########.#.###.#########.#.#.#.#.#.#.#######.###.#########.#####.#.#####.#######.#####.#.#.#
|
||||||
|
#.#...#...#...#...#...#...#.....#.......###...#...........#.....#.....#...#.#.#.#...#.....#...#...#.......#.#.....#.....#.........#...#...#.#
|
||||||
|
#.###.#####.#.#.#.#.#.#.#.#.###.#######.#########################.###.#.###.#.#.#########.#.###.###.#####.#.#.#########.###########.#.#####.#
|
||||||
|
#.#...#.....#.#.#.#.#.#.#.#...#.......#.........#...#...#.....#...#...#.#...#.#...........#.###.....#...#.#.#.......###.........#...#.......#
|
||||||
|
#.#.###.#####.#.#.#.#.#.#.###.#######.#########.#.#.#.#.#.###.#.###.###.#.###.#############.#########.#.#.#.#######.###########.#.###########
|
||||||
|
#...###.....#...#...#...#...#.......#.........#...#...#.#...#.#...#.###.#...#.......#...#...#.....#...#...#.........#...#.....#.#.###...#...#
|
||||||
|
###########.###############.#######.#########.#########.###.#.###.#.###.###.#######.#.#.#.###.###.#.#################.#.#.###.#.#.###.#.#.#.#
|
||||||
|
#.....#...#...........#...#.......#.#.......#...#...#...#...#.#...#...#.#...###...#...#...###...#.#...................#.#.#...#...#...#...#.#
|
||||||
|
#.###.#.#.###########.#.#.#######.#.#.#####.###.#.#.#.###.###.#.#####.#.#.#####.#.#############.#.#####################.#.#.#######.#######.#
|
||||||
|
#...#.#.#.#...#...###...#.......#.#...#.....#...#.#...###...#.#...#...#.#...#...#...#...#...#...#...............#.....#...#.........#...#...#
|
||||||
|
###.#.#.#.#.#.#.#.#############.#.#####.#####.###.#########.#.###.#.###.###.#.#####.#.#.#.#.#.#################.#.###.###############.#.#.###
|
||||||
|
#...#...#...#...#.......#.......#.......#...#.....#.......#.#.#...#.....#...#...#...#.#.#.#.#.#...............#.#...#.....#.....#.....#.#...#
|
||||||
|
#.#####################.#.###############.#.#######.#####.#.#.#.#########.#####.#.###.#.#.#.#.#.#############.#.###.#####.#.###.#.#####.###.#
|
||||||
|
#.#.....#...#.......#...#.......#.........#...#...#...#...#.#.#...#.......#...#.#.#...#.#.#.#.#.#.............#...#.....#...###.#...###.....#
|
||||||
|
#.#.###.#.#.#.#####.#.#########.#.###########.#.#.###.#.###.#.###.#.#######.#.#.#.#.###.#.#.#.#.#.###############.#####.#######.###.#########
|
||||||
|
#.#.#...#.#...#...#.#.#.......#...#...........#.#.....#.#...#.....#.#...#...#...#.#...#.#.#.#...#...............#.......#.....#...#.........#
|
||||||
|
#.#.#.###.#####.#.#.#.#.#####.#####.###########.#######.#.#########.#.#.#.#######.###.#.#.#.###################.#########.###.###.#########.#
|
||||||
|
#...#.....#.....#...#.#...#...#...#.........#...#...#...#.........#.#.#.#.#...#...#...#...#.....#...#...#.....#...........#...###...#.......#
|
||||||
|
###########.#########.###.#.###.#.#########.#.###.#.#.###########.#.#.#.#.#.#.#.###.###########.#.#.#.#.#.###.#############.#######.#.#######
|
||||||
|
#...###...#.........#.#...#.....#...........#.#...#...###.......#.#...#.#...#.#...#...#.........#.#...#...###...........#...#...###...#...###
|
||||||
|
#.#.###.#.#########.#.#.#####################.#.#########.#####.#.#####.#####.###.###.#.#########.#####################.#.###.#.#######.#.###
|
||||||
|
#.#.....#.....#...#.#.#.....#.......#.......#.#.###.....#...#...#.....#...#...#...###.#.#.......#...#.................#...#...#.#.......#...#
|
||||||
|
#.###########.#.#.#.#.#####.#.#####.#.#####.#.#.###.###.###.#.#######.###.#.###.#####.#.#.#####.###.#.###############.#####.###.#.#########.#
|
||||||
|
#...#...#...#...#...#...###...###...#.#.....#.#...#...#.....#.#...###.#...#...#.#.....#.#.#.....###...###.............#...#.#...#...#.......#
|
||||||
|
###.#.#.#.#.###########.#########.###.#.#####.###.###.#######.#.#.###.#.#####.#.#.#####.#.#.#############.#############.#.#.#.#####.#.#######
|
||||||
|
#...#.#...#.....#.....#...###...#.....#...###...#...#.......#.#.#...#.#.#...#.#.#.....#...#.#...#...#...#...#...........#.#.#.#.....#.......#
|
||||||
|
#.###.#########.#.###.###.###.#.#########.#####.###.#######.#.#.###.#.#.#.#.#.#.#####.#####.#.#.#.#.#.#.###.#.###########.#.#.#.###########.#
|
||||||
|
#...#.#.....#...#.###...#.....#.........#.#...#.#...###...#.#.#...#.#.#.#.#.#.#...#...#.....#.#.#.#.#.#.....#.#.......#...#.#...#.....#...#.#
|
||||||
|
###.#.#.###.#.###.#####.###############.#.#.#.#.#.#####.#.#.#.###.#.#.#.#.#.#.###.#.###.#####.#.#.#.#.#######.#.#####.#.###.#####.###.#.#.#.#
|
||||||
|
#...#.#...#...#...#...#...#...#.......#...#.#.#.#.....#.#.#.#.....#...#.#.#.#.#...#...#.....#.#...#.#.........#.....#...###.#.....###...#...#
|
||||||
|
#.###.###.#####.###.#.###.#.#.#.#####.#####.#.#.#####.#.#.#.###########.#.#.#.#.#####.#####.#.#####.###############.#######.#.###############
|
||||||
|
#.#...#...#...#.#...#.....#.#.#.#.....#...#.#.#.#.....#.#.#.........#...#.#.#.#.#...#...#...#...#...#...#.......#...###.....#...............#
|
||||||
|
#.#.###.###.#.#.#.#########.#.#.#.#####.#.#.#.#.#.#####.#.#########.#.###.#.#.#.#.#.###.#.#####.#.###.#.#.#####.#.#####.###################.#
|
||||||
|
#.#.#...#...#...#.....#...#.#.#.#.#...#.#.#.#.#.#.#...#.#.#...#...#.#...#.#.#.#.#.#...#.#...#...#...#.#.#.....#...#.....#.....#.............#
|
||||||
|
#.#.#.###.###########.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.###.#.#.#.#.#.###.#.###.#.#####.#.#.#####.#####.#####.###.#.#############
|
||||||
|
#...#.....###.........#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#...#.#.#.#...#.#.#...#...#...#.#...#.....#...#...#...###...#...#...#.#.#...#...#...#
|
||||||
|
#############.#########.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#####.#.#.###.#.#.#########.###.#.#######.#######.#.#####.###.#.###.#.#.#.#.#.#.#.#.#
|
||||||
|
#.............#...#...#.#.#.#...#.#.#.#.#.#.#...#...#.#.....#.#.#.#...#.#.........#.#...#.#...#...###.....#.......#...#.....#.#...#...#...#.#
|
||||||
|
#.#############.#.#.#.#.#.#.#####.#.#.#.#.#.#########.#####.#.#.#.#.###.#########.#.#.###.#.#.#.#####.#############.#########.#############.#
|
||||||
|
#...#...#.....#.#...#.#.#...#.....#.#...#.#.........#...#...#.#.#.#.###...#...#...#.#.#...#.#...#...#.....#.......#.........#.#...#.......#.#
|
||||||
|
###.#.#.#.###.#.#####.#.#####.#####.#####.#########.###.#.###.#.#.#.#####.#.#.#.###.#.#.###.#####.#.#####.#.#####.#########.#.#.#.#.#####.#.#
|
||||||
|
#...#.#...#...#.#.....#.....#.....#...#...#...#.....#...#.#...#.#.#.....#.#.#.#...#.#.#...#.......#.#.....#.....#.#...#.....#...#.#...#...#.#
|
||||||
|
#.###.#####.###.#.#########.#####.###.#.###.#.#.#####.###.#.###.#.#####.#.#.#.###.#.#.###.#########.#.#########.#.#.#.#.#########.###.#.###.#
|
||||||
|
#...#.#...#...#.#.....#...#...###.#...#.....#.#.....#...#.#...#.#.....#.#...#...#.#.#.###...#...#...#.#...#.....#.#.#.#.........#.#...#...#.#
|
||||||
|
###.#.#.#.###.#.#####.#.#.###.###.#.#########.#####.###.#.###.#.#####.#.#######.#.#.#.#####.#.#.#.###.#.#.#.#####.#.#.#########.#.#.#####.#.#
|
||||||
|
#...#.#.#.....#.###...#.#...#.#...#.#.....#...#...#.###.#.#...#.....#.#.#...###.#.#.#.#.....#.#.#...#.#.#.#.#...#...#.#...#.....#.#...#...#.#
|
||||||
|
#.###.#.#######.###.###.###.#.#.###.#.###.#.###.#.#.###.#.#.#######.#.#.#.#.###.#.#.#.#.#####.#.###.#.#.#.#.#.#.#####.#.#.#.#####.###.#.###.#
|
||||||
|
#.#...#...#...#...#...#...#...#.....#...#...#...#.#.#...#.#.#...#...#.#.#.#.....#.#.#.#.#.....#.#...#.#.#.#...#.#.....#.#.#.....#.#...#.#...#
|
||||||
|
#.#.#####.#.#.###.###.###.#############.#####.###.#.#.###.#.#.#.#.###.#.#.#######.#.#.#.#.#####.#.###.#.#.#####.#.#####.#.#####.#.#.###.#.###
|
||||||
|
#...#...#...#...#...#.....#...###...###.#...#.###...#...#.#.#.#.#...#.#.#...#...#.#.#.#.#...#...#.###...#.#.....#.....#.#...#...#.#...#.#.###
|
||||||
|
#####.#.#######.###.#######.#.###.#.###.#.#.#.#########.#.#.#.#.###.#.#.###.#.#.#.#.#.#.###.#.###.#######.#.#########.#.###.#.###.###.#.#.###
|
||||||
|
#.....#.........#...###.....#.....#.....#.#.#...#.......#.#.#.#.#...#.#.#...#.#...#.#.#.....#.#...#.......#.........#.#.#...#...#...#.#.#...#
|
||||||
|
#.###############.#####.#################.#.###.#.#######.#.#.#.#.###.#.#.###.#####.#.#######.#.###.###############.#.#.#.#####.###.#.#.###.#
|
||||||
|
#.............#...#.....#...#...#...#...#.#...#.#...#...#.#...#.#...#.#.#...#.#.....#.....#...#...#.#.....#.....#...#.#.#.#...#...#...#.....#
|
||||||
|
#############.#.###.#####.#.#.#.#.#.#.#.#.###.#.###.#.#.#.#####.###.#.#.###.#.#.#########.#.#####.#.#.###.#.###.#.###.#.#.#.#.###.###########
|
||||||
|
#.............#.###.#...#.#.#.#.#.#.#.#.#...#.#...#...#.#...#...#...#.#.###...#...#...#...#.#...#.#...#...#...#.#...#...#.#.#...#...###...###
|
||||||
|
#.#############.###.#.#.#.#.#.#.#.#.#.#.###.#.###.#####.###.#.###.###.#.#########.#.#.#.###.#.#.#.#####.#####.#.###.#####.#.###.###.###.#.###
|
||||||
|
#.......#.....#.#...#.#...#.#.#.#.#.#.#.#...#.#...###...#...#...#...#.#.#.........#.#.#...#...#...#.....#...#.#...#...###.#.###...#.....#...#
|
||||||
|
#######.#.###.#.#.###.#####.#.#.#.#.#.#.#.###.#.#####.###.#####.###.#.#.#.#########.#.###.#########.#####.#.#.###.###.###.#.#####.#########.#
|
||||||
|
#.....#...#...#.#...#...###.#.#...#.#.#.#.#...#.....#...#...###.#...#...#...#.......#...#...#.......#...#.#...###.....#...#.....#.#...#...#.#
|
||||||
|
#.###.#####.###.###.###.###.#.#####.#.#.#.#.#######.###.###.###.#.#########.#.#########.###.#.#######.#.#.#############.#######.#.#.#.#.#.#.#
|
||||||
|
#...#.#...#...#.#...#...#...#...#...#.#.#.#.#...#...#...#...#...#.........#.#.#.........#...#.....#...#...#...#...#.....#...#...#.#.#.#.#.#.#
|
||||||
|
###.#.#.#.###.#.#.###.###.#####.#.###.#.#.#.#.#.#.###.###.###.###########.#.#.#.#########.#######.#.#######.#.#.#.#.#####.#.#.###.#.#.#.#.#.#
|
||||||
|
#...#...#.....#.#.....###...#...#.#...#.#.#.#.#...###...#...#.#...#...#...#...#...#.....#...#.....#.........#...#.#...#...#.#.###.#.#.#.#.#.#
|
||||||
|
#.#############.###########.#.###.#.###.#.#.#.#########.###.#.#.#.#.#.#.#########.#.###.###.#.###################.###.#.###.#.###.#.#.#.#.#.#
|
||||||
|
#.#...#.....#...#...........#.#...#...#.#.#.#.#.........#...#.#.#.#.#.#.........#.#.#...#...#.#.....#...#...#...#.#...#...#.#...#.#.#.#.#.#.#
|
||||||
|
#.#.#.#.###.#.###.###########.#.#####.#.#.#.#.#.#########.###.#.#.#.#.#########.#.#.#.###.###.#.###.#.#.#.#.#.#.#.#.#####.#.###.#.#.#.#.#.#.#
|
||||||
|
#...#...###...###.............#.......#...#...#...........###...#...#...........#...#.....###...###...#...#...#...#.......#.....#...#...#...#
|
||||||
|
#############################################################################################################################################
|
15
day20/example.txt
Normal file
15
day20/example.txt
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
###############
|
||||||
|
#...#...#.....#
|
||||||
|
#.#.#.#.#.###.#
|
||||||
|
#S#...#.#.#...#
|
||||||
|
#######.#.#.###
|
||||||
|
#######.#.#...#
|
||||||
|
#######.#.###.#
|
||||||
|
###..E#...#...#
|
||||||
|
###.#######.###
|
||||||
|
#...###...#...#
|
||||||
|
#.#####.#.###.#
|
||||||
|
#.#...#.#.#...#
|
||||||
|
#.#.#.#.#.#.###
|
||||||
|
#...#...#...###
|
||||||
|
###############
|
3
day20/go.mod
Normal file
3
day20/go.mod
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
module stevenlr.com/aoc2024/day20
|
||||||
|
|
||||||
|
go 1.23.3
|
111
day20/main.go
Normal file
111
day20/main.go
Normal 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
3
day21/go.mod
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
module stevenlr.com/aoc2024/day21
|
||||||
|
|
||||||
|
go 1.23.3
|
183
day21/main.go
Normal file
183
day21/main.go
Normal 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
1540
day22/data.txt
Normal file
File diff suppressed because it is too large
Load Diff
3
day22/go.mod
Normal file
3
day22/go.mod
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
module stevenlr.com/aoc2024/day22
|
||||||
|
|
||||||
|
go 1.23.3
|
80
day22/main.go
Normal file
80
day22/main.go
Normal 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
3380
day23/data.txt
Normal file
File diff suppressed because it is too large
Load Diff
32
day23/example.txt
Normal file
32
day23/example.txt
Normal 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
3
day23/go.mod
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
module stevenlr.com/aoc2024/day23
|
||||||
|
|
||||||
|
go 1.23.3
|
144
day23/main.go
Normal file
144
day23/main.go
Normal 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
313
day24/data-2.txt
Normal 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
313
day24/data.txt
Normal 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
47
day24/example.txt
Normal 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
10
day24/example_simple.txt
Normal 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
3
day24/go.mod
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
module stevenlr.com/aoc2024/day24
|
||||||
|
|
||||||
|
go 1.23.3
|
256
day24/main.go
Normal file
256
day24/main.go
Normal 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
3999
day25/data.txt
Normal file
File diff suppressed because it is too large
Load Diff
39
day25/example.txt
Normal file
39
day25/example.txt
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
#####
|
||||||
|
.####
|
||||||
|
.####
|
||||||
|
.####
|
||||||
|
.#.#.
|
||||||
|
.#...
|
||||||
|
.....
|
||||||
|
|
||||||
|
#####
|
||||||
|
##.##
|
||||||
|
.#.##
|
||||||
|
...##
|
||||||
|
...#.
|
||||||
|
...#.
|
||||||
|
.....
|
||||||
|
|
||||||
|
.....
|
||||||
|
#....
|
||||||
|
#....
|
||||||
|
#...#
|
||||||
|
#.#.#
|
||||||
|
#.###
|
||||||
|
#####
|
||||||
|
|
||||||
|
.....
|
||||||
|
.....
|
||||||
|
#.#..
|
||||||
|
###..
|
||||||
|
###.#
|
||||||
|
###.#
|
||||||
|
#####
|
||||||
|
|
||||||
|
.....
|
||||||
|
.....
|
||||||
|
.....
|
||||||
|
#....
|
||||||
|
#.#..
|
||||||
|
#.#.#
|
||||||
|
#####
|
3
day25/go.mod
Normal file
3
day25/go.mod
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
module stevenlr.com/aoc2024/day25
|
||||||
|
|
||||||
|
go 1.23.3
|
64
day25/main.go
Normal file
64
day25/main.go
Normal 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
|
||||||
|
}
|
Reference in New Issue
Block a user