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 {
|
||||
return queue.elements[i].Cnd.EstimateCost < queue.elements[i].Cnd.EstimateCost
|
||||
return queue.elements[i].Cnd.EstimateCost < queue.elements[j].Cnd.EstimateCost
|
||||
}
|
||||
|
||||
func (queue *CandidateQueue) Swap(i, j int) {
|
||||
|
141
day16/data.txt
Normal file
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