Add solution day 20
This commit is contained in:
parent
78df933581
commit
80547b5125
15
day_20/example.txt
Normal file
15
day_20/example.txt
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
###############
|
||||||
|
#...#...#.....#
|
||||||
|
#.#.#.#.#.###.#
|
||||||
|
#S#...#.#.#...#
|
||||||
|
#######.#.#.###
|
||||||
|
#######.#.#...#
|
||||||
|
#######.#.###.#
|
||||||
|
###..E#...#...#
|
||||||
|
###.#######.###
|
||||||
|
#...###...#...#
|
||||||
|
#.#####.#.###.#
|
||||||
|
#.#...#.#.#...#
|
||||||
|
#.#.#.#.#.#.###
|
||||||
|
#...#...#...###
|
||||||
|
###############
|
141
day_20/input.txt
Normal file
141
day_20/input.txt
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
#############################################################################################################################################
|
||||||
|
#...........#...#...#.....#.............#.........#...#...........#...#.......#...#...###.....#...#...#...###...#...#...#...#...#...###.....#
|
||||||
|
#.#########.#.#.#.#.#.###.#.###########.#.#######.#.#.#.#########.#.#.#.#####.#.#.#.#.###.###.#.#.#.#.#.#.###.#.#.#.#.#.#.#.#.#.#.#.###.###.#
|
||||||
|
#.......#...#.#.#.#.#...#.#...#.....#...#...#.....#.#.#.....#.....#.#.#...#...#.#.#.#...#...#...#...#.#.#...#.#.#.#.#.#.#.#.#.#...#...#.#...#
|
||||||
|
#######.#.###.#.#.#.###.#.###.#.###.#.#####.#.#####.#.#####.#.#####.#.###.#.###.#.#.###.###.#########.#.###.#.#.#.#.#.#.#.#.#.#######.#.#.###
|
||||||
|
###...#.#.....#...#.....#.###.#.###...#...#.#.#...#.#...#...#...#...#.....#.###.#.#.#...#...#.........#...#.#.#...#.#.#...#.#.#.......#.#...#
|
||||||
|
###.#.#.#################.###.#.#######.#.#.#.#.#.#.###.#.#####.#.#########.###.#.#.#.###.###.###########.#.#.#####.#.#####.#.#.#######.###.#
|
||||||
|
#...#.#...#...........#...#...#...#...#.#.#.#...#.#.#...#.....#.#.........#.#...#.#.#...#...#...#...###...#...#.....#...#...#.#.....###.#...#
|
||||||
|
#.###.###.#.#########.#.###.#####.#.#.#.#.#.#####.#.#.#######.#.#########.#.#.###.#.###.###.###.#.#.###.#######.#######.#.###.#####.###.#.###
|
||||||
|
#...#.###...#.........#...#.#.....#.#.#.#.#.#.....#.#.#...#...#.#...###...#.#.#...#...#...#...#...#...#.....#...#.....#.#...#.#.....#...#...#
|
||||||
|
###.#.#######.###########.#.#.#####.#.#.#.#.#.#####.#.#.#.#.###.#.#.###.###.#.#.#####.###.###.#######.#####.#.###.###.#.###.#.#.#####.#####.#
|
||||||
|
#...#...#.....#...#.....#.#.#.....#.#.#.#.#.#.#.....#.#.#.#...#...#...#...#.#.#.#...#.#...###.#.....#.#...#.#.###...#.#.#...#.#.#.....#...#.#
|
||||||
|
#.#####.#.#####.#.#.###.#.#.#####.#.#.#.#.#.#.#.#####.#.#.###.#######.###.#.#.#.#.#.#.#.#####.#.###.#.#.#.#.#.#####.#.#.#.###.#.#.#####.#.#.#
|
||||||
|
#.....#.#.......#...#...#...#...#.#.#...#...#.#.....#.#.#...#...#.....#...#.#.#...#.#.#.#...#.#...#...#.#.#.#...###.#...#...#.#...#.....#...#
|
||||||
|
#####.#.#############.#######.#.#.#.#########.#####.#.#.###.###.#.#####.###.#.#####.#.#.#.#.#.###.#####.#.#.###.###.#######.#.#####.#########
|
||||||
|
#.....#.#...#.......#.......#.#...#.....#.....#...#.#.#...#.#...#.#...#...#.#.....#.#.#.#.#.#.#...#...#.#.#...#...#...#.....#.#.....#...#...#
|
||||||
|
#.#####.#.#.#.#####.#######.#.#########.#.#####.#.#.#.###.#.#.###.#.#.###.#.#####.#.#.#.#.#.#.#.###.#.#.#.###.###.###.#.#####.#.#####.#.#.#.#
|
||||||
|
#.....#.#.#.#.....#.#...#...#...#...###.#.#...#.#.#.#.#...#...#...#.#...#.#...#...#.#.#...#...#...#.#...#...#...#.....#.#...#.#...###.#...#.#
|
||||||
|
#####.#.#.#.#####.#.#.#.#.#####.#.#.###.#.#.#.#.#.#.#.#.#######.###.###.#.###.#.###.#.###########.#.#######.###.#######.#.#.#.###.###.#####.#
|
||||||
|
#.....#...#.###...#...#.#.#.....#.#.#...#.#.#.#.#.#.#.#...#.....###.#...#...#.#...#.#.#...........#.#.......###.#.......#.#.#...#.....#.....#
|
||||||
|
#.#########.###.#######.#.#.#####.#.#.###.#.#.#.#.#.#.###.#.#######.#.#####.#.###.#.#.#.###########.#.#########.#.#######.#.###.#######.#####
|
||||||
|
#.........#...#.......#...#.#.....#.#...#.#.#...#.#.#.#...#.#...#...#.#.....#...#.#...#.#...........#.#.....#...#...#...#.#.#...#...#...#...#
|
||||||
|
#########.###.#######.#####.#.#####.###.#.#.#####.#.#.#.###.#.#.#.###.#.#######.#.#####.#.###########.#.###.#.#####.#.#.#.#.#.###.#.#.###.#.#
|
||||||
|
#...#...#.#...#.....#.....#.#.....#.#...#.#.#.....#.#.#...#...#.#...#.#.......#.#.....#...#...........#.#...#.#.....#.#.#.#.#.#...#...###.#.#
|
||||||
|
#.#.#.#.#.#.###.###.#####.#.#####.#.#.###.#.#.#####.#.###.#####.###.#.#######.#.#####.#####.###########.#.###.#.#####.#.#.#.#.#.#########.#.#
|
||||||
|
#.#.#.#...#...#...#.......#.#...#.#.#...#.#.#.#...#.#.....#.....#...#...#.....#...#...#...#...#...#...#.#.#...#...#...#.#.#...#.........#.#.#
|
||||||
|
#.#.#.#######.###.#########.#.#.#.#.###.#.#.#.#.#.#.#######.#####.#####.#.#######.#.###.#.###.#.#.#.#.#.#.#.#####.#.###.#.#############.#.#.#
|
||||||
|
#.#...#.....#...#.........#...#.#.#.#...#.#.#.#.#.#.......#.#...#.#.....#...#.....#.#...#.....#.#.#.#.#.#.#...#...#...#.#.#.............#.#.#
|
||||||
|
#.#####.###.###.#########.#####.#.#.#.###.#.#.#.#.#######.#.#.#.#.#.#######.#.#####.#.#########.#.#.#.#.#.###.#.#####.#.#.#.#############.#.#
|
||||||
|
#...#...###...#.......###.#.....#.#...#...#.#.#.#.....###.#...#...#...#...#.#...###.#.###...###.#.#.#.#.#...#.#...###.#.#.#.......#.....#.#.#
|
||||||
|
###.#.#######.#######.###.#.#####.#####.###.#.#.#####.###.###########.#.#.#.###.###.#.###.#.###.#.#.#.#.###.#.###.###.#.#.#######.#.###.#.#.#
|
||||||
|
#...#.#.....#.......#.....#...###.....#.#...#.#.....#.#...#...#.......#.#.#.#...#...#...#.#.#...#.#.#...#...#...#.#...#...#.......#.#...#.#.#
|
||||||
|
#.###.#.###.#######.#########.#######.#.#.###.#####.#.#.###.#.#.#######.#.#.#.###.#####.#.#.#.###.#.#####.#####.#.#.#######.#######.#.###.#.#
|
||||||
|
#.....#.#...###...#.........#.#...###.#.#.#...#...#.#.#...#.#...###...#.#.#.#.###...#...#.#.#...#.#...#...#...#.#.#.#.......#.......#...#.#.#
|
||||||
|
#######.#.#####.#.#########.#.#.#.###.#.#.#.###.#.#.#.###.#.#######.#.#.#.#.#.#####.#.###.#.###.#.###.#.###.#.#.#.#.#.#######.#########.#.#.#
|
||||||
|
#...#...#.#.....#.....#...#.#.#.#.#...#.#.#...#.#.#.#.#...#.#...#...#...#.#.#...#...#...#.#.#...#.#...#...#.#.#.#.#.#.#.....#.#.........#.#.#
|
||||||
|
#.#.#.###.#.#########.#.#.#.#.#.#.#.###.#.###.#.#.#.#.#.###.#.#.#.#######.#.###.#.#####.#.#.#.###.#.#####.#.#.#.#.#.#.#.###.#.#.#########.#.#
|
||||||
|
#.#.#...#.#.........#...#...#...#...###.#.#...#.#.#.#.#...#.#.#.#...#.....#...#.#...#...#.#.#.#...#...###...#...#.#.#...#...#.#.....###...#.#
|
||||||
|
#.#.###.#.#########.###################.#.#.###.#.#.#.###.#.#.#.###.#.#######.#.###.#.###.#.#.#.#####.###########.#.#####.###.#####.###.###.#
|
||||||
|
#.#.....#...#.......#.................#...#...#.#...#...#.#...#.#...#...#...#.#.#...#...#.#.#.#.#...#.#...........#.#.....#...#...#...#...#.#
|
||||||
|
#.#########.#.#######.###############.#######.#.#######.#.#####.#.#####.#.#.#.#.#.#####.#.#.#.#.#.#.#.#.###########.#.#####.###.#.###.###.#.#
|
||||||
|
#.......#...#.......#.#...............#...#...#...#...#.#.....#.#.....#.#.#.#.#.#...#...#.#.#.#.#.#...#.............#.###...#...#...#.....#.#
|
||||||
|
#######.#.#########.#.#.###############.#.#.#####.#.#.#.#####.#.#####.#.#.#.#.#.###.#.###.#.#.#.#.###################.###.###.#####.#######.#
|
||||||
|
#.......#...#.....#...#.................#.#.#...#...#.#.#...#.#.#...#.#.#.#.#.#.....#...#.#.#.#.#.#.....#...........#.....#...###...#.......#
|
||||||
|
#.#########.#.###.#######################.#.#.#.#####.#.#.#.#.#.#.#.#.#.#.#.#.#########.#.#.#.#.#.#.###.#.#########.#######.#####.###.#######
|
||||||
|
#.........#.#...#...#.....................#...#...#...#.#.#...#.#.#.#.#.#.#.#.###.......#.#...#...#...#.#.........#.#...#...#...#.....#...###
|
||||||
|
#########.#.###.###.#.###########################.#.###.#.#####.#.#.#.#.#.#.#.###.#######.###########.#.#########.#.#.#.#.###.#.#######.#.###
|
||||||
|
#.........#.....#...#.#.....................#...#.#...#.#...###.#.#...#.#.#.#...#...#...#.#######S..#.#.#.....#...#.#.#...###.#.#...#...#...#
|
||||||
|
#.###############.###.#.###################.#.#.#.###.#.###.###.#.#####.#.#.###.###.#.#.#.#########.#.#.#.###.#.###.#.#######.#.#.#.#.#####.#
|
||||||
|
#.......#...#...#...#...#...#...#.....#...#...#.#.....#...#...#.#.....#.#.#...#.#...#.#.#.#########...#...###...###.#.........#...#...#...#.#
|
||||||
|
#######.#.#.#.#.###.#####.#.#.#.#.###.#.#.#####.#########.###.#.#####.#.#.###.#.#.###.#.#.#########################.###################.#.#.#
|
||||||
|
#.......#.#...#...#...#...#...#.#...#...#.......#.......#.....#.#...#.#.#...#.#.#...#.#.#.#####...............#...#.........#...#.....#.#...#
|
||||||
|
#.#######.#######.###.#.#######.###.#############.#####.#######.#.#.#.#.###.#.#.###.#.#.#.#####.#############.#.#.#########.#.#.#.###.#.#####
|
||||||
|
#.........#...###...#.#...#.....###.###...#...###.#...#.......#...#.#.#...#.#.#.###...#...#####...#.........#.#.#...#...###...#.#.#...#...###
|
||||||
|
###########.#.#####.#.###.#.#######.###.#.#.#.###.#.#.#######.#####.#.###.#.#.#.#################.#.#######.#.#.###.#.#.#######.#.#.#####.###
|
||||||
|
#...........#...#...#.....#...#...#...#.#...#.....#.#.......#.....#.#...#...#...###############...#.......#...#.#...#.#.#...###...#.....#...#
|
||||||
|
#.#############.#.###########.#.#.###.#.###########.#######.#####.#.###.#######################.#########.#####.#.###.#.#.#.###########.###.#
|
||||||
|
#.....#...#...#...#...#.....#...#.....#...#...#...#.......#.......#.#...#.......#####.....#...#.#...#...#.......#.....#...#...#.....###...#.#
|
||||||
|
#####.#.#.#.#.#####.#.#.###.#############.#.#.#.#.#######.#########.#.###.#####.#####.###.#.#.#.#.#.#.#.#####################.#.###.#####.#.#
|
||||||
|
#.....#.#.#.#.#.....#.#...#...#...........#.#.#.#.#...#...#...#...#...#...#...#..E###...#...#...#.#.#.#...........#...........#.#...#...#...#
|
||||||
|
#.#####.#.#.#.#.#####.###.###.#.###########.#.#.#.#.#.#.###.#.#.#.#####.###.#.#########.#########.#.#.###########.#.###########.#.###.#.#####
|
||||||
|
#.......#...#...#.....#...###...#.........#.#...#...#.#.....#...#...###.....#...#.......#.........#...#.........#.#.............#.....#.....#
|
||||||
|
#################.#####.#########.#######.#.#########.#############.###########.#.#######.#############.#######.#.#########################.#
|
||||||
|
#...#.....#...#...#...#...#.....#.......#.#.........#.#...#...#...#...###...###...#.....#...............#.......#...#...#...#.....#.........#
|
||||||
|
#.#.#.###.#.#.#.###.#.###.#.###.#######.#.#########.#.#.#.#.#.#.#.###.###.#.#######.###.#################.#########.#.#.#.#.#.###.#.#########
|
||||||
|
#.#.#...#...#...#...#.#...#...#.......#.#.#.........#.#.#.#.#.#.#...#.#...#.......#...#.#...#...#.......#.#...#...#...#...#...###...#...#...#
|
||||||
|
#.#.###.#########.###.#.#####.#######.#.#.#.#########.#.#.#.#.#.###.#.#.#########.###.#.#.#.#.#.#.#####.#.#.#.#.#.###################.#.#.#.#
|
||||||
|
#.#.....#...#...#.#...#.#...#...#...#...#.#.........#...#...#.#.#...#.#...#.......#...#...#...#.#.....#.#...#...#...#...###...###.....#...#.#
|
||||||
|
#.#######.#.#.#.#.#.###.#.#.###.#.#.#####.#########.#########.#.#.###.###.#.#######.###########.#####.#.###########.#.#.###.#.###.#########.#
|
||||||
|
#...#.....#...#.#.#...#.#.#...#...#.....#.#...#.....#...#...#...#.....#...#.....#...#.....#...#.......#...........#...#.....#.....#.....#...#
|
||||||
|
###.#.#########.#.###.#.#.###.#########.#.#.#.#.#####.#.#.#.###########.#######.#.###.###.#.#.###################.#################.###.#.###
|
||||||
|
#...#.#.........#.###.#.#...#...###.....#.#.#.#...###.#.#.#...#...###...#.....#...#...###...#.....#...#.........#...#...#.....#...#...#.#...#
|
||||||
|
#.###.#.#########.###.#.###.###.###.#####.#.#.###.###.#.#.###.#.#.###.###.###.#####.#############.#.#.#.#######.###.#.#.#.###.#.#.###.#.###.#
|
||||||
|
#...#.#.........#.#...#.###...#.#...#...#...#...#...#.#.#.#...#.#.#...#...###...#...#...........#...#.#.#.......#...#.#.#...#.#.#.#...#...#.#
|
||||||
|
###.#.#########.#.#.###.#####.#.#.###.#.#######.###.#.#.#.#.###.#.#.###.#######.#.###.#########.#####.#.#.#######.###.#.###.#.#.#.#.#####.#.#
|
||||||
|
#...#.#.........#.#.#...#...#.#.#...#.#.###...#...#.#.#...#...#.#.#.#...#.....#...###.......#...#...#...#...#...#.....#.#...#.#.#.#...#...#.#
|
||||||
|
#.###.#.#########.#.#.###.#.#.#.###.#.#.###.#.###.#.#.#######.#.#.#.#.###.###.#############.#.###.#.#######.#.#.#######.#.###.#.#.###.#.###.#
|
||||||
|
#...#.#...........#...#...#...#.....#.#...#.#.###...#.#.......#.#.#...###...#.#...#...#.....#.....#.....#...#.#.....#...#...#.#.#.#...#.#...#
|
||||||
|
###.#.#################.#############.###.#.#.#######.#.#######.#.#########.#.#.#.#.#.#.###############.#.###.#####.#.#####.#.#.#.#.###.#.###
|
||||||
|
###...###...........#...#...#...#.....#...#.#...#...#.#.....###.#.#...###...#...#...#.#.....#...#.....#...#...#.....#...#...#.#.#.#...#...###
|
||||||
|
#########.#########.#.###.#.#.#.#.#####.###.###.#.#.#.#####.###.#.#.#.###.###########.#####.#.#.#.###.#####.###.#######.#.###.#.#.###.#######
|
||||||
|
#.......#.....#...#.#.....#...#...#...#...#.#...#.#.#.#.....#...#...#...#.....#.......#...#...#...###.......#...#...###...###.#.#.....#.....#
|
||||||
|
#.#####.#####.#.#.#.###############.#.###.#.#.###.#.#.#.#####.#########.#####.#.#######.#.###################.###.#.#########.#.#######.###.#
|
||||||
|
#.....#.#...#...#.#.#...###...#.....#.....#.#.#...#...#...###...#.......#.....#.###...#.#...#.......#.........###.#.#...#...#...#.......#...#
|
||||||
|
#####.#.#.#.#####.#.#.#.###.#.#.###########.#.#.#########.#####.#.#######.#####.###.#.#.###.#.#####.#.###########.#.#.#.#.#.#####.#######.###
|
||||||
|
#.....#...#.......#...#.....#.#.#...###...#.#.#...#.......#...#.#.###...#.....#...#.#.#.#...#.....#.#.............#.#.#.#.#.....#...#.....###
|
||||||
|
#.###########################.#.#.#.###.#.#.#.###.#.#######.#.#.#.###.#.#####.###.#.#.#.#.#######.#.###############.#.#.#.#####.###.#.#######
|
||||||
|
#.#...#.....................#.#...#.....#...#.....#.......#.#...#...#.#.#...#...#.#.#.#.#.........#.....#...........#.#...#...#.....#...#...#
|
||||||
|
#.#.#.#.###################.#.###########################.#.#######.#.#.#.#.###.#.#.#.#.###############.#.###########.#####.#.#########.#.#.#
|
||||||
|
#.#.#...#.....#.......#.....#...#...................#.....#.....#...#.#.#.#.....#...#.#...............#...#...........#.....#...........#.#.#
|
||||||
|
#.#.#####.###.#.#####.#.#######.#.#################.#.#########.#.###.#.#.###########.###############.#####.###########.#################.#.#
|
||||||
|
#...#...#...#.#.#...#.#.....#...#.................#...#...#...#.#.#...#.#.#...#.....#.#.........###...#.....#...........#...###...#.......#.#
|
||||||
|
#####.#.###.#.#.#.#.#.#####.#.###################.#####.#.#.#.#.#.#.###.#.#.#.#.###.#.#.#######.###.###.#####.###########.#.###.#.#.#######.#
|
||||||
|
###...#.....#...#.#.#.......#...............#.....###...#.#.#.#.#.#...#.#...#.#.###...#.......#.....#...#...#...........#.#...#.#.#.#.......#
|
||||||
|
###.#############.#.#######################.#.#######.###.#.#.#.#.###.#.#####.#.#############.#######.###.#.###########.#.###.#.#.#.#.#######
|
||||||
|
#...#...#...#...#.#...#.....#...#.........#.#.......#...#...#...#.#...#.....#.#...........###.......#.#...#.............#.#...#.#.#.#.###...#
|
||||||
|
#.###.#.#.#.#.#.#.###.#.###.#.#.#.#######.#.#######.###.#########.#.#######.#.###########.#########.#.#.#################.#.###.#.#.#.###.#.#
|
||||||
|
#...#.#...#...#.#.#...#.#...#.#.#.#...#...#.......#.###...#.......#.......#...#.....#.....#.......#...#...#...............#.....#...#...#.#.#
|
||||||
|
###.#.#########.#.#.###.#.###.#.#.#.#.#.#########.#.#####.#.#############.#####.###.#.#####.#####.#######.#.###########################.#.#.#
|
||||||
|
#...#.###...#...#.#...#.#.#...#...#.#...#.......#...#...#.#.......#.......#.....###...#...#...#...###...#...#.....#.....#...#.....#...#...#.#
|
||||||
|
#.###.###.#.#.###.###.#.#.#.#######.#####.#####.#####.#.#.#######.#.#######.###########.#.###.#.#####.#.#####.###.#.###.#.#.#.###.#.#.#####.#
|
||||||
|
#.#...#...#...#...###...#...#.......#...#.....#...#...#.#.#.......#.......#...#...#...#.#.#...#.....#.#.#...#...#.#...#.#.#.#.###.#.#.....#.#
|
||||||
|
#.#.###.#######.#############.#######.#.#####.###.#.###.#.#.#############.###.#.#.#.#.#.#.#.#######.#.#.#.#.###.#.###.#.#.#.#.###.#.#####.#.#
|
||||||
|
#.#.#...#.......#.....#.......#.....#.#.#...#...#.#...#.#.#.#...###...###.#...#.#.#.#.#.#.#.....#...#.#.#.#.....#...#.#...#.#...#.#.#...#...#
|
||||||
|
#.#.#.###.#######.###.#.#######.###.#.#.#.#.###.#.###.#.#.#.#.#.###.#.###.#.###.#.#.#.#.#.#####.#.###.#.#.#########.#.#####.###.#.#.#.#.#####
|
||||||
|
#...#.....#...###...#.#...#...#.#...#.#.#.#.#...#...#.#.#.#.#.#.#...#...#.#...#.#...#.#.#.....#.#.#...#.#.........#.#.....#...#.#.#...#...###
|
||||||
|
###########.#.#####.#.###.#.#.#.#.###.#.#.#.#.#####.#.#.#.#.#.#.#.#####.#.###.#.#####.#.#####.#.#.#.###.#########.#.#####.###.#.#.#######.###
|
||||||
|
#...........#.....#.#.###...#...#.#...#...#.#...#...#.#.#.#.#.#...###...#.#...#.....#...#.....#.#.#.###.#...#...#.#.#.....###.#.#...#...#...#
|
||||||
|
#.###############.#.#.###########.#.#######.###.#.###.#.#.#.#.#######.###.#.#######.#####.#####.#.#.###.#.#.#.#.#.#.#.#######.#.###.#.#.###.#
|
||||||
|
#...........#...#...#.#...#...#...#...#.....#...#.#...#.#.#.#.......#.#...#.....#...#.....#...#.#...#...#.#.#.#...#.#.......#...###...#...#.#
|
||||||
|
###########.#.#.#####.#.#.#.#.#.#####.#.#####.###.#.###.#.#.#######.#.#.#######.#.###.#####.#.#.#####.###.#.#.#####.#######.#############.#.#
|
||||||
|
#...........#.#.#...#...#...#...#...#.#.#...#.###.#.###...#...#...#.#.#.....#...#.#...#...#.#.#.#.....#...#...###...#...#...#.......#.....#.#
|
||||||
|
#.###########.#.#.#.#############.#.#.#.#.#.#.###.#.#########.#.#.#.#.#####.#.###.#.###.#.#.#.#.#.#####.#########.###.#.#.###.#####.#.#####.#
|
||||||
|
#...........#.#.#.#...#.........#.#.#.#...#.#.#...#.....#...#.#.#.#.#.#.....#...#.#...#.#.#.#...#.#...#.#...#...#...#.#.#...#.#.....#.....#.#
|
||||||
|
###########.#.#.#.###.#.#######.#.#.#.#####.#.#.#######.#.#.#.#.#.#.#.#.#######.#.###.#.#.#.#####.#.#.#.#.#.#.#.###.#.#.###.#.#.#########.#.#
|
||||||
|
#...........#.#...###...#.......#.#.#.#...#.#.#.#.....#.#.#...#.#.#.#.#.....#...#...#.#.#.#...#...#.#.#...#...#...#.#.#...#.#.#.#...#...#.#.#
|
||||||
|
#.###########.###########.#######.#.#.#.#.#.#.#.#.###.#.#.#####.#.#.#.#####.#.#####.#.#.#.###.#.###.#.###########.#.#.###.#.#.#.#.#.#.#.#.#.#
|
||||||
|
#.#...........#...###...#.....#...#.#.#.#...#.#.#...#.#.#...#...#.#.#.#...#.#.#...#.#.#.#.#...#.#...#.#...#...#...#.#.#...#...#...#...#.#.#.#
|
||||||
|
#.#.###########.#.###.#.#####.#.###.#.#.#####.#.###.#.#.###.#.###.#.#.#.#.#.#.#.#.#.#.#.#.#.###.#.###.#.#.#.#.#.###.#.#.###############.#.#.#
|
||||||
|
#...###.........#.....#.......#.###...#.....#.#.#...#.#.###.#...#.#.#.#.#.#.#.#.#.#.#...#.#.###...###.#.#...#.#...#.#.#.....#.....#.....#...#
|
||||||
|
#######.#######################.###########.#.#.#.###.#.###.###.#.#.#.#.#.#.#.#.#.#.#####.#.#########.#.#####.###.#.#.#####.#.###.#.#########
|
||||||
|
#.....#...#...#...........#...#.......#.....#.#.#...#...#...#...#.#.#...#.#.#.#.#...#.....#.#.........#.#...#.....#...###...#...#.#...#...###
|
||||||
|
#.###.###.#.#.#.#########.#.#.#######.#.#####.#.###.#####.###.###.#.#####.#.#.#.#####.#####.#.#########.#.#.#############.#####.#.###.#.#.###
|
||||||
|
#...#...#...#.#.#.........#.#...#...#.#...#...#.#...#.....#...#...#.....#.#.#...###...#.....#.#...#...#...#.....#...#...#.#...#.#...#...#...#
|
||||||
|
###.###.#####.#.#.#########.###.#.#.#.###.#.###.#.###.#####.###.#######.#.#.#######.###.#####.#.#.#.#.#########.#.#.#.#.#.#.#.#.###.#######.#
|
||||||
|
###.#...#.....#.#.........#.###.#.#.#.#...#.#...#...#.#...#...#...#...#.#.#.#.......#...#.....#.#.#.#.#...#...#...#...#.#...#.#...#...#.....#
|
||||||
|
###.#.###.#####.#########.#.###.#.#.#.#.###.#.#####.#.#.#.###.###.#.#.#.#.#.#.#######.###.#####.#.#.#.#.#.#.#.#########.#####.###.###.#.#####
|
||||||
|
#...#.....#.....#...#.....#...#.#.#.#.#.#...#...#...#.#.#.....#...#.#.#.#.#.#.#.....#.###...#...#...#.#.#.#.#.#...#...#.....#.....#...#.....#
|
||||||
|
#.#########.#####.#.#.#######.#.#.#.#.#.#.#####.#.###.#.#######.###.#.#.#.#.#.#.###.#.#####.#.#######.#.#.#.#.#.#.#.#.#####.#######.#######.#
|
||||||
|
#...#.....#.#.....#...#.....#.#.#.#.#.#.#...#...#...#.#...#...#.....#...#.#.#.#...#.#.#.....#.....#...#.#.#.#.#.#.#.#.#...#...#...#...#...#.#
|
||||||
|
###.#.###.#.#.#########.###.#.#.#.#.#.#.###.#.#####.#.###.#.#.###########.#.#.###.#.#.#.#########.#.###.#.#.#.#.#.#.#.#.#.###.#.#.###.#.#.#.#
|
||||||
|
#...#.#...#.#.....#...#.###.#.#...#.#.#...#.#.....#.#.#...#.#...#...#.....#.#.#...#...#.#.....#...#...#.#.#.#.#.#...#.#.#...#...#...#.#.#.#.#
|
||||||
|
#.###.#.###.#####.#.#.#.###.#.#####.#.###.#.#####.#.#.#.###.###.#.#.#.#####.#.#.#######.#.###.#.#####.#.#.#.#.#.#####.#.###.#######.#.#.#.#.#
|
||||||
|
#.....#...#.#.....#.#.#...#.#.###...#...#.#.#.....#.#.#.....#...#.#...#...#.#.#.......#...###.#.#...#...#.#.#.#.....#.#.###.#.......#.#.#.#.#
|
||||||
|
#########.#.#.#####.#.###.#.#.###.#####.#.#.#.#####.#.#######.###.#####.#.#.#.#######.#######.#.#.#.#####.#.#.#####.#.#.###.#.#######.#.#.#.#
|
||||||
|
###...###...#...#...#...#.#.#...#...#...#.#.#.....#.#...#...#.#...#...#.#.#.#.#.....#.###.....#...#...#...#.#...#...#...#...#.......#...#.#.#
|
||||||
|
###.#.#########.#.#####.#.#.###.###.#.###.#.#####.#.###.#.#.#.#.###.#.#.#.#.#.#.###.#.###.###########.#.###.###.#.#######.#########.#####.#.#
|
||||||
|
#...#...........#.....#.#.#...#...#.#...#.#.#.....#...#.#.#.#.#.#...#.#.#.#.#.#.#...#.#...#.....#...#.#...#.#...#.......#.#.....#...#.....#.#
|
||||||
|
#.###################.#.#.###.###.#.###.#.#.#.#######.#.#.#.#.#.#.###.#.#.#.#.#.#.###.#.###.###.#.#.#.###.#.#.#########.#.#.###.#.###.#####.#
|
||||||
|
#.....................#...###.....#.....#...#.........#...#...#...###...#...#...#.....#.....###...#...###...#...........#...###...###.......#
|
||||||
|
#############################################################################################################################################
|
66
day_20/solve_1.test.ts
Normal file
66
day_20/solve_1.test.ts
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
import { assertEquals } from "jsr:@std/assert";
|
||||||
|
import { parseMap, toMapString } from "./solve_1.ts";
|
||||||
|
import { printPrettyMapStep } from "./solve_1.ts";
|
||||||
|
import { calculateNeedsSteps } from "./solve_1.ts";
|
||||||
|
|
||||||
|
Deno.test("parseMap", () => {
|
||||||
|
const input = `..#\n#..`;
|
||||||
|
const expected = [[".", ".", "#"], ["#", ".", "."]];
|
||||||
|
assertEquals(parseMap(input), expected);
|
||||||
|
});
|
||||||
|
|
||||||
|
Deno.test("toMapString", () => {
|
||||||
|
const input = [[".", ".", "#"], ["#", ".", "."]];
|
||||||
|
const expected = `..#\n#..`;
|
||||||
|
assertEquals(toMapString(input), expected);
|
||||||
|
});
|
||||||
|
|
||||||
|
const ExampleMap = `###############
|
||||||
|
#...#...#.....#
|
||||||
|
#.#.#.#.#.###.#
|
||||||
|
#S#...#.#.#...#
|
||||||
|
#######.#.#.###
|
||||||
|
#######.#.#...#
|
||||||
|
#######.#.###.#
|
||||||
|
###..E#...#...#
|
||||||
|
###.#######.###
|
||||||
|
#...###...#...#
|
||||||
|
#.#####.#.###.#
|
||||||
|
#.#...#.#.#...#
|
||||||
|
#.#.#.#.#.#.###
|
||||||
|
#...#...#...###
|
||||||
|
###############`;
|
||||||
|
|
||||||
|
Deno.test("printPrettyMapStep", ()=>{
|
||||||
|
const map = parseMap(`...\n...\n...`);
|
||||||
|
const actual = printPrettyMapStep(map, [
|
||||||
|
[1,2,3],
|
||||||
|
[4,5,6],
|
||||||
|
[7,8,9]
|
||||||
|
]);
|
||||||
|
const expected = `123
|
||||||
|
456
|
||||||
|
789`;
|
||||||
|
assertEquals(actual, expected);
|
||||||
|
})
|
||||||
|
|
||||||
|
Deno.test("calculateNeedsSteps", () => {
|
||||||
|
const map = parseMap(ExampleMap);
|
||||||
|
const needsSteps = calculateNeedsSteps(map, [5, 7]);
|
||||||
|
const expected = `###############
|
||||||
|
#210#432#87654#
|
||||||
|
#3#9#5#1#9###3#
|
||||||
|
#4#876#0#0#012#
|
||||||
|
#######9#1#9###
|
||||||
|
#######8#2#876#
|
||||||
|
#######7#3###5#
|
||||||
|
###210#654#234#
|
||||||
|
###3#######1###
|
||||||
|
#654###456#098#
|
||||||
|
#7#####3#7###7#
|
||||||
|
#8#456#2#8#456#
|
||||||
|
#9#3#7#1#9#3###
|
||||||
|
#012#890#012###
|
||||||
|
###############`;
|
||||||
|
assertEquals(printPrettyMapStep(map, needsSteps), expected);
|
||||||
|
})
|
205
day_20/solve_1.ts
Normal file
205
day_20/solve_1.ts
Normal file
@ -0,0 +1,205 @@
|
|||||||
|
import { associateBy } from "jsr:@std/collections/"
|
||||||
|
|
||||||
|
export type Map = string[][];
|
||||||
|
|
||||||
|
export type Pos = [number, number];
|
||||||
|
|
||||||
|
export function parseMap(input: string): Map {
|
||||||
|
return input.replaceAll("\r", "").split("\n").map((line) => line.split(""));
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function readMap(filename: string): Promise<Map> {
|
||||||
|
return parseMap(await Deno.readTextFile(filename));
|
||||||
|
}
|
||||||
|
|
||||||
|
export function toMapString(map: Map): string {
|
||||||
|
return map.map((line) => line.join("")).join("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
export function* availableNextStep(
|
||||||
|
map: Map,
|
||||||
|
pos: Pos,
|
||||||
|
): Generator<Pos> {
|
||||||
|
const [width, height] = [map[0].length, map.length];
|
||||||
|
const [x, y] = pos;
|
||||||
|
for (const [dx, dy] of [[-1, 0], [1, 0], [0, -1], [0, 1]]) {
|
||||||
|
const nx = x + dx;
|
||||||
|
const ny = y + dy;
|
||||||
|
if (nx < 0 || nx >= width || ny < 0 || ny >= height) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (map[ny][nx] === "#") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
yield [nx, ny] as Pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function calculateNeedsSteps(map: Map, startPos: Pos): number[][] {
|
||||||
|
const needsSteps = map.map((line) => line.map(() => -1));
|
||||||
|
const [x, y] = startPos;
|
||||||
|
const queue: Pos[] = [startPos];
|
||||||
|
needsSteps[y][x] = 0;
|
||||||
|
while (queue.length > 0) {
|
||||||
|
const [x, y] = queue.shift()!;
|
||||||
|
const steps = needsSteps[y][x];
|
||||||
|
for (const [nx, ny] of availableNextStep(map, [x, y])) {
|
||||||
|
// already visited and shorter path
|
||||||
|
if (needsSteps[ny][nx] >= 0 && needsSteps[ny][nx] <= steps + 1) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (steps < 0) {
|
||||||
|
throw new Error("steps < 0");
|
||||||
|
}
|
||||||
|
needsSteps[ny][nx] = steps + 1;
|
||||||
|
queue.push([nx, ny]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return needsSteps;
|
||||||
|
}
|
||||||
|
export function printPrettyMapStep(
|
||||||
|
map: Map,
|
||||||
|
needsSteps: number[][],
|
||||||
|
): string {
|
||||||
|
const result = map.map((line, y) =>
|
||||||
|
line.map((char, x) => {
|
||||||
|
if (char === "#") {
|
||||||
|
return "#";
|
||||||
|
}
|
||||||
|
const steps = needsSteps[y][x];
|
||||||
|
if (steps === -1) {
|
||||||
|
return " ";
|
||||||
|
}
|
||||||
|
return steps.toString()[steps.toString().length - 1]; // last digit
|
||||||
|
}).join("")
|
||||||
|
).join("\n");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function findOnMap(
|
||||||
|
map: Map,
|
||||||
|
condition: (pos: Pos, char: string) => boolean,
|
||||||
|
): Pos[] {
|
||||||
|
const result: Pos[] = [];
|
||||||
|
map.forEach((line, y) => {
|
||||||
|
line.forEach((char, x) => {
|
||||||
|
if (condition([x, y], char)) {
|
||||||
|
result.push([x, y]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function solve(map: Map) {
|
||||||
|
const [startPos] = findOnMap(map, (_pos, char) => char === "S");
|
||||||
|
const [endPos] = findOnMap(map, (_pos, char) => char === "E");
|
||||||
|
const needsSteps = calculateNeedsSteps(map, endPos);
|
||||||
|
|
||||||
|
function* jumpAvailPos(
|
||||||
|
pos: Pos,
|
||||||
|
) {
|
||||||
|
const [x, y] = pos;
|
||||||
|
const jumps = [
|
||||||
|
[-2, 0],
|
||||||
|
[2, 0],
|
||||||
|
[0, -2],
|
||||||
|
[0, 2],
|
||||||
|
];
|
||||||
|
for (const [dx, dy] of jumps) {
|
||||||
|
const nx = x + dx;
|
||||||
|
const ny = y + dy;
|
||||||
|
if (nx < 0 || nx >= map[0].length || ny < 0 || ny >= map.length) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (map[ny][nx] === "#") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
yield [nx, ny] as Pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function* availableJump(
|
||||||
|
pos: Pos,
|
||||||
|
steps: number,
|
||||||
|
): Generator<{
|
||||||
|
from: Pos;
|
||||||
|
to: Pos;
|
||||||
|
savedSteps: number;
|
||||||
|
}> {
|
||||||
|
const [x, y] = pos;
|
||||||
|
for (const [jx, jy] of jumpAvailPos(pos)) {
|
||||||
|
const originalSteps = needsSteps[y][x];
|
||||||
|
const cheatedSteps = needsSteps[jy][jx] + 2;
|
||||||
|
if (cheatedSteps < originalSteps) {
|
||||||
|
yield {
|
||||||
|
from: pos,
|
||||||
|
to: [jx, jy],
|
||||||
|
savedSteps: originalSteps - cheatedSteps,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const queue = [{
|
||||||
|
pos: startPos,
|
||||||
|
steps: 0,
|
||||||
|
}];
|
||||||
|
const visited = new Set<string>();
|
||||||
|
visited.add(startPos.toString());
|
||||||
|
const ret: {
|
||||||
|
from: Pos;
|
||||||
|
to: Pos;
|
||||||
|
savedSteps: number;
|
||||||
|
}[] = [];
|
||||||
|
while (queue.length > 0) {
|
||||||
|
const n = queue.shift()!;
|
||||||
|
const {
|
||||||
|
pos: [x, y],
|
||||||
|
steps,
|
||||||
|
} = n;
|
||||||
|
if (x === endPos[0] && y === endPos[1]) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// find jump
|
||||||
|
for (const jump of availableJump([x, y], steps)) {
|
||||||
|
console.log(jump);
|
||||||
|
ret.push(jump);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const nextPos of availableNextStep(map, [x, y])) {
|
||||||
|
const key = nextPos.toString();
|
||||||
|
if (visited.has(key)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
visited.add(key);
|
||||||
|
queue.push({
|
||||||
|
pos: nextPos,
|
||||||
|
steps: steps + 1,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const jumpMap = new Map< number, { from: Pos, to: Pos, savedSteps: number }[]>();
|
||||||
|
for (const jump of ret) {
|
||||||
|
const key = jump.savedSteps;
|
||||||
|
if (!jumpMap.has(key)) {
|
||||||
|
jumpMap.set(key, []);
|
||||||
|
}
|
||||||
|
jumpMap.get(key)!.push(jump);
|
||||||
|
}
|
||||||
|
return jumpMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (import.meta.main) {
|
||||||
|
const map = await readMap("input.txt");
|
||||||
|
console.log(toMapString(map));
|
||||||
|
const [endPos] = findOnMap(map, (_pos, char) => char === "E");
|
||||||
|
const needsSteps = calculateNeedsSteps(map, endPos);
|
||||||
|
console.log(printPrettyMapStep(map, needsSteps));
|
||||||
|
const jpm = solve(map);
|
||||||
|
const keys = Array.from(jpm.keys()).sort((a, b) => a - b).filter((key) => key >= 100);
|
||||||
|
const count = keys.reduce((acc, key) => acc + jpm.get(key)!.length, 0);
|
||||||
|
console.log(count);
|
||||||
|
}
|
127
day_20/solve_2.ts
Normal file
127
day_20/solve_2.ts
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
import type { Map, Pos } from "./solve_1.ts";
|
||||||
|
import {
|
||||||
|
availableNextStep,
|
||||||
|
calculateNeedsSteps,
|
||||||
|
findOnMap,
|
||||||
|
printPrettyMapStep,
|
||||||
|
readMap,
|
||||||
|
toMapString,
|
||||||
|
} from "./solve_1.ts";
|
||||||
|
|
||||||
|
function solve(map: Map) {
|
||||||
|
const [startPos] = findOnMap(map, (_pos, char) => char === "S");
|
||||||
|
const [endPos] = findOnMap(map, (_pos, char) => char === "E");
|
||||||
|
const needsSteps = calculateNeedsSteps(map, endPos);
|
||||||
|
function* jumpAvailPos(
|
||||||
|
pos: Pos,
|
||||||
|
) {
|
||||||
|
const [x, y] = pos;
|
||||||
|
for (let dx = -20; dx <= 20; dx += 1) {
|
||||||
|
const maxDy = 20 - Math.abs(dx);
|
||||||
|
for (let dy = -maxDy; dy <= maxDy; dy += 1) {
|
||||||
|
const nx = x + dx;
|
||||||
|
const ny = y + dy;
|
||||||
|
if (
|
||||||
|
nx < 0 || nx >= map[0].length || ny < 0 || ny >= map.length
|
||||||
|
) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (map[ny][nx] === "#") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const jumpLength = Math.abs(dx) + Math.abs(dy);
|
||||||
|
yield [nx, ny, jumpLength] as [number, number, number];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function* availableJump(
|
||||||
|
pos: Pos,
|
||||||
|
): Generator<{
|
||||||
|
from: Pos;
|
||||||
|
to: Pos;
|
||||||
|
savedSteps: number;
|
||||||
|
}> {
|
||||||
|
const [x, y] = pos;
|
||||||
|
for (const [jx, jy, steps] of jumpAvailPos(pos)) {
|
||||||
|
const originalSteps = needsSteps[y][x];
|
||||||
|
const cheatedSteps = needsSteps[jy][jx] + steps;
|
||||||
|
if (cheatedSteps < originalSteps) {
|
||||||
|
yield {
|
||||||
|
from: pos,
|
||||||
|
to: [jx, jy],
|
||||||
|
savedSteps: originalSteps - cheatedSteps,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const queue = [{
|
||||||
|
pos: startPos,
|
||||||
|
steps: 0,
|
||||||
|
}];
|
||||||
|
const visited = new Set<string>();
|
||||||
|
visited.add(startPos.toString());
|
||||||
|
const ret: {
|
||||||
|
from: Pos;
|
||||||
|
to: Pos;
|
||||||
|
savedSteps: number;
|
||||||
|
}[] = [];
|
||||||
|
while (queue.length > 0) {
|
||||||
|
const n = queue.shift()!;
|
||||||
|
const {
|
||||||
|
pos: [x, y],
|
||||||
|
steps,
|
||||||
|
} = n;
|
||||||
|
if (x === endPos[0] && y === endPos[1]) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// find jump
|
||||||
|
for (const jump of availableJump([x, y])) {
|
||||||
|
ret.push(jump);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const nextPos of availableNextStep(map, [x, y])) {
|
||||||
|
const key = nextPos.toString();
|
||||||
|
if (visited.has(key)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
visited.add(key);
|
||||||
|
queue.push({
|
||||||
|
pos: nextPos,
|
||||||
|
steps: steps + 1,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const jumpMap = new Map<
|
||||||
|
number,
|
||||||
|
{ from: Pos; to: Pos; savedSteps: number }[]
|
||||||
|
>();
|
||||||
|
for (const jump of ret) {
|
||||||
|
const key = jump.savedSteps;
|
||||||
|
if (!jumpMap.has(key)) {
|
||||||
|
jumpMap.set(key, []);
|
||||||
|
}
|
||||||
|
jumpMap.get(key)!.push(jump);
|
||||||
|
}
|
||||||
|
return jumpMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (import.meta.main) {
|
||||||
|
const map = await readMap("input.txt");
|
||||||
|
console.log(toMapString(map));
|
||||||
|
const [endPos] = findOnMap(map, (_pos, char) => char === "E");
|
||||||
|
const needsSteps = calculateNeedsSteps(map, endPos);
|
||||||
|
console.log(printPrettyMapStep(map, needsSteps));
|
||||||
|
const jpm = solve(map);
|
||||||
|
const keys = Array.from(jpm.keys()).sort((a, b) => a - b).filter((key) =>
|
||||||
|
key >= 100
|
||||||
|
);
|
||||||
|
for (const key of keys) {
|
||||||
|
console.log(`key: ${key} (${jpm.get(key)!.length})`);
|
||||||
|
}
|
||||||
|
const count = keys.reduce((acc, key) => acc + jpm.get(key)!.length, 0);
|
||||||
|
console.log(count);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user