day 20
This commit is contained in:
parent
1458e923e6
commit
20a5361a64
|
|
@ -0,0 +1,141 @@
|
||||||
|
#############################################################################################################################################
|
||||||
|
#.....#.....#.......#.......#...#.....###...#######...#.........#...#...###...###.....#.....#...#...#...#...#...................#.......#...#
|
||||||
|
#.###.#.###.#.#####.#.#####.#.#.#.###.###.#.#######.#.#.#######.#.#.#.#.###.#.###.###.#.###.#.#.#.#.#.#.#.#.#.#################.#.#####.#.#.#
|
||||||
|
#...#.#...#.#.#.....#.....#.#.#.#.#...#...#...###...#.#.......#...#.#.#.....#...#...#.#.#...#.#.#.#...#.#.#.#.........#.........#.....#...#.#
|
||||||
|
###.#.###.#.#.#.#########.#.#.#.#.#.###.#####.###.###.#######.#####.#.#########.###.#.#.#.###.#.#.#####.#.#.#########.#.#############.#####.#
|
||||||
|
#...#.....#...#.....###...#.#.#...#...#.....#.#...#...#.......#...#.#...#.......#...#.#.#.###.#.#.#.....#.#.###...#...#.......#...###.#.....#
|
||||||
|
#.#################.###.###.#.#######.#####.#.#.###.###.#######.#.#.###.#.#######.###.#.#.###.#.#.#.#####.#.###.#.#.#########.#.#.###.#.#####
|
||||||
|
#.............#...#...#...#.#.#.......#...#.#.#.#...###.....#...#...#...#.#...#...#...#.#.....#.#.#.#...#.#.#...#.#.#.........#.#.....#.#...#
|
||||||
|
#############.#.#.###.###.#.#.#.#######.#.#.#.#.#.#########.#.#######.###.#.#.#.###.###.#######.#.#.#.#.#.#.#.###.#.#.#########.#######.#.#.#
|
||||||
|
###...###.....#.#...#...#.#.#.#.#.....#.#.#.#.#.#...###...#.#.......#...#.#.#.#.#...###.......#.#.#.#.#.#.#.#...#.#.#.#...#...#.......#...#.#
|
||||||
|
###.#.###.#####.###.###.#.#.#.#.#.###.#.#.#.#.#.###.###.#.#.#######.###.#.#.#.#.#.###########.#.#.#.#.#.#.#.###.#.#.#.#.#.#.#.#######.#####.#
|
||||||
|
#...#...#.......###...#...#...#...#...#.#...#.#...#.#...#.#.#.......#...#.#.#...#...#...#...#.#...#...#...#.#...#...#...#.#.#.#.....#...#...#
|
||||||
|
#.#####.#############.#############.###.#####.###.#.#.###.#.#.#######.###.#.#######.#.#.#.#.#.#############.#.###########.#.#.#.###.###.#.###
|
||||||
|
#.....#.#...#...#...#.....#.........###.#...#...#.#.#...#.#.#.###...#.#...#.#.......#.#.#.#.#.#...........#...#.....#.....#.#.#.#...#...#...#
|
||||||
|
#####.#.#.#.#.#.#.#.#####.#.###########.#.#.###.#.#.###.#.#.#.###.#.#.#.###.#.#######.#.#.#.#.#.#########.#####.###.#.#####.#.#.#.###.#####.#
|
||||||
|
#.....#...#...#...#.#...#.#.#...###...#...#...#...#...#.#...#...#.#.#.#...#.#...#...#.#.#.#.#...#...###...#.....###...#.....#.#.#.#...#.....#
|
||||||
|
#.#################.#.#.#.#.#.#.###.#.#######.#######.#.#######.#.#.#.###.#.###.#.#.#.#.#.#.#####.#.###.###.###########.#####.#.#.#.###.#####
|
||||||
|
#.................#.#.#.#.#.#.#...#.#.###...#.....#...#.....#...#.#...#...#.#...#.#.#.#.#.#.###...#...#.#...#...#.......#.....#.#.#.#...#...#
|
||||||
|
#################.#.#.#.#.#.#.###.#.#.###.#.#####.#.#######.#.###.#####.###.#.###.#.#.#.#.#.###.#####.#.#.###.#.#.#######.#####.#.#.#.###.#.#
|
||||||
|
#.......#...#.....#...#.#.#.#.#...#.#.#...#.###...#.###.....#...#...#...###.#.....#.#.#...#...#.....#.#.#.###.#...#...#...###...#.#.#.#...#.#
|
||||||
|
#.#####.#.#.#.#########.#.#.#.#.###.#.#.###.###.###.###.#######.###.#.#####.#######.#.#######.#####.#.#.#.###.#####.#.#.#####.###.#.#.#.###.#
|
||||||
|
#.#...#...#...#...#...#...#...#...#.#.#...#...#...#...#.....#...#...#.#...#.#.......#.....#...#...#.#...#.....#.....#...#...#...#.#.#...#...#
|
||||||
|
#.#.#.#########.#.#.#.###########.#.#.###.###.###.###.#####.#.###.###.#.#.#.#.###########.#.###.#.#.###########.#########.#.###.#.#.#####.###
|
||||||
|
#...#...........#...#...........#...#...#...#...#.#...#...#.#...#...#...#.#.#.###...###...#...#.#.#.....#.......###...#...#.....#...#...#...#
|
||||||
|
###############################.#######.###.###.#.#.###.#.#.###.###.#####.#.#.###.#.###.#####.#.#.#####.#.#########.#.#.#############.#.###.#
|
||||||
|
###.............###...#...###...#.......#...#...#.#.....#.#...#...#.#.....#.#.#...#.#...#...#.#.#.....#.#.#...#...#.#...#...#...#...#.#...#.#
|
||||||
|
###.###########.###.#.#.#.###.###.#######.###.###.#######.###.###.#.#.#####.#.#.###.#.###.#.#.#.#####.#.#.#.#.#.#.#.#####.#.#.#.#.#.#.###.#.#
|
||||||
|
#...#...#...#...#...#...#...#...#.......#...#...#.......#.....#...#.#.#...#.#.#.#...#.#...#.#.#.....#...#.#.#...#...#.....#.#.#...#...#...#.#
|
||||||
|
#.###.#.#.#.#.###.#########.###.#######.###.###.#######.#######.###.#.#.#.#.#.#.#.###.#.###.#.#####.#####.#.#########.#####.#.#########.###.#
|
||||||
|
#.....#...#.#.#...#.......#...#.#.......###.#...#.....#.......#.###.#...#.#.#...#...#...#...#...###.....#...#...#...#...###...#.......#...#.#
|
||||||
|
###########.#.#.###.#####.###.#.#.#########.#.###.###.#######.#.###.#####.#.#######.#####.#####.#######.#####.#.#.#.###.#######.#####.###.#.#
|
||||||
|
#...#...#...#...#...#...#.#...#.#...#...#...#...#...#.#...#...#...#.#.....#.......#...#...#.....#.....#.#.....#...#...#...#...#.#.....###...#
|
||||||
|
#.#.#.#.#.#######.###.#.#.#.###.###.#.#.#.#####.###.#.#.#.#.#####.#.#.###########.###.#.###.#####.###.#.#.###########.###.#.#.#.#.###########
|
||||||
|
#.#.#.#.#.........#...#...#.....#...#.#.#...#...###.#.#.#.#.....#.#.#.#...###...#.#...#...#.#...#...#.#.#...........#...#...#...#.......#...#
|
||||||
|
#.#.#.#.###########.#############.###.#.###.#.#####.#.#.#.#####.#.#.#.#.#.###.#.#.#.#####.#.#.#.###.#.#.###########.###.###############.#.#.#
|
||||||
|
#.#...#.#...#...###.#...........#.#...#...#.#...#...#...#.#...#.#.#.#.#.#...#.#.#.#.#.....#.#.#...#.#.#.#...#.......###.................#.#.#
|
||||||
|
#.#####.#.#.#.#.###.#.#########.#.#.#####.#.###.#.#######.#.#.#.#.#.#.#.###.#.#.#.#.#.#####.#.###.#.#.#.#.#.#.###########################.#.#
|
||||||
|
#.#...#...#...#.#...#.#.........#...#...#...#...#.....#...#.#...#.#.#.#...#...#...#.#...#...#.###...#.#.#.#...#.....#...#...#...#...#...#.#.#
|
||||||
|
#.#.#.#########.#.###.#.#############.#.#####.#######.#.###.#####.#.#.###.#########.###.#.###.#######.#.#.#####.###.#.#.#.#.#.#.#.#.#.#.#.#.#
|
||||||
|
#.#.#.........#.#.#...#.......#.......#.....#.#...#...#...#.....#.#.#.#...#.........#...#...#.#.......#.#.....#.#...#.#...#...#...#...#...#.#
|
||||||
|
#.#.#########.#.#.#.#########.#.###########.#.#.#.#.#####.#####.#.#.#.#.###.#########.#####.#.#.#######.#####.#.#.###.#####################.#
|
||||||
|
#...###...#...#...#.#.....#...#.#.........#.#...#.#.#####...#...#.#.#...###...#.....#.....#...#.........#...#.#.#.....#...#...#.............#
|
||||||
|
#######.#.#.#######.#.###.#.###.#.#######.#.#####.#.#######.#.###.#.#########.#.###.#####.###############.#.#.#.#######.#.#.#.#.#############
|
||||||
|
#.......#...#.....#.#...#.#.....#.......#.#.....#.#...#.....#.#...#.###.......#.#...#...#.###...#.........#...#.#.......#...#...#...###.....#
|
||||||
|
#.###########.###.#.###.#.#############.#.#####.#.###.#.#####.#.###.###.#######.#.###.#.#.###.#.#.#############.#.###############.#.###.###.#
|
||||||
|
#...........#...#.#.#...#.#.............#...#...#...#.#.#.....#...#...#...#...#.#...#.#.#.....#.#.............#.#...........#.....#...#...#.#
|
||||||
|
###########.###.#.#.#.###.#.###############.#.#####.#.#.#.#######.###.###.#.#.#.###.#.#.#######.#############.#.###########.#.#######.###.#.#
|
||||||
|
###...#.....#...#...#...#.#...#...........#...#...#...#.#.###.....#...###...#.#.#...#.#.#.....#.###...........#.#...........#.#.......#...#.#
|
||||||
|
###.#.#.#####.#########.#.###.#.#########.#####.#.#####.#.###.#####.#########.#.#.###.#.#.###.#.###.###########.#.###########.#.#######.###.#
|
||||||
|
#...#...#.....#...#.....#.....#.#.......#...###.#.....#.#.#...#...#.#.........#.#...#.#.#...#.#.#...#...........#...#...#...#.#...#...#.#...#
|
||||||
|
#.#######.#####.#.#.###########.#.#####.###.###.#####.#.#.#.###.#.#.#.#########.###.#.#.###.#.#.#.###.#############.#.#.#.#.#.###.#.#.#.#.###
|
||||||
|
#.......#.#.....#...#...#.....#.#...###.....#...#.....#...#.#...#.#.#.....#...#.#...#.#.#...#...#...#.#.........#...#.#...#.#.#...#.#...#...#
|
||||||
|
#######.#.#.#########.#.#.###.#.###.#########.###.#########.#.###.#.#####.#.#.#.#.###.#.#.#########.#.#.#######.#.###.#####.#.#.###.#######.#
|
||||||
|
#.......#.#.........#.#...###...###...........#...###...###...#...#...#...#.#...#...#.#.#.....#...#...#.......#.#.....#...#...#...#...#...#.#
|
||||||
|
#.#######.#########.#.#########################.#####.#.#######.#####.#.###.#######.#.#.#####.#.#.###########.#.#######.#.#######.###.#.#.#.#
|
||||||
|
#.......#.###...#...#...#...#...###...#...#...#.....#.#.......#.#...#.#...#.......#...#.#...#.#.#.............#...#.....#...#...#.....#.#.#.#
|
||||||
|
#######.#.###.#.#.#####.#.#.#.#.###.#.#.#.#.#.#####.#.#######.#.#.#.#.###.#######.#####.#.#.#.#.#################.#.#######.#.#.#######.#.#.#
|
||||||
|
#.....#.#.#...#.#.......#.#.#.#.....#...#...#.#...#...#.......#.#.#...###...#...#.#.....#.#...#.................#.#.#...###...#...#...#.#.#.#
|
||||||
|
#.###.#.#.#.###.#########.#.#.###############.#.#.#####.#######.#.#########.#.#.#.#.#####.#####################.#.#.#.#.#########.#.#.#.#.#.#
|
||||||
|
#...#.#...#...#...........#...#.....#.......#...#...#...#...###.#.....#.....#.#...#.......#...#.................#...#.#.#...#...#...#...#...#
|
||||||
|
###.#.#######.#################.###.#.#####.#######.#.###.#.###.#####.#.#####.#############.#.#.#####################.#.#.#.#.#.#############
|
||||||
|
#...#.###...#.............#...#.###...#...#.....#...#.....#...#...#...#.#...#...#...#.......#.#.................#.....#...#.#.#.............#
|
||||||
|
#.###.###.#.#############.#.#.#.#######.#.#####.#.###########.###.#.###.#.#.###.#.#.#.#######.#################.#.#########.#.#############.#
|
||||||
|
#...#.#...#.....#.........#.#...#.......#.......#.#...#...#...###.#...#.#.#...#...#.#...#...#.#.................#...#.......#.#.............#
|
||||||
|
###.#.#.#######.#.#########.#####.###############.#.#.#.#.#.#####.###.#.#.###.#####.###.#.#.#.#.###################.#.#######.#.#############
|
||||||
|
#...#.#.......#.#...........#...#.............###...#.#.#.#.....#...#.#.#.###.....#.###...#.#...#.....#.........#...#.........#...#.........#
|
||||||
|
#.###.#######.#.#############.#.#############.#######.#.#.#####.###.#.#.#.#######.#.#######.#####.###.#.#######.#.###############.#.#######.#
|
||||||
|
#...#.........#...#...........#.........#...#.......#...#.......#...#.#.#.#.......#.#...###.#...#.###...#.....#...#.....#...#...#...#...#...#
|
||||||
|
###.#############.#.###################.#.#.#######.#############.###.#.#.#.#######.#.#.###.#.#.#.#######.###.#####.###.#.#.#.#.#####.#.#.###
|
||||||
|
#...#...........#.#...................#...#.........#######S..###.....#...#.....#...#.#.....#.#.#.#.......###.....#...#...#...#.......#.#...#
|
||||||
|
#.###.#########.#.###################.#######################.#################.#.###.#######.#.#.#.#############.###.#################.###.#
|
||||||
|
#.....#.........#.....................#################.....#...#...#...#...###...###...#...#.#...#.......#.....#...#...#.........#...#...#.#
|
||||||
|
#######.###############################################.###.###.#.#.#.#.#.#.###########.#.#.#.###########.#.###.###.###.#.#######.#.#.###.#.#
|
||||||
|
###...#.............#..............E#################...###...#.#.#...#...#.#...........#.#...###.........#.#...###...#...#.....#...#.###...#
|
||||||
|
###.#.#############.#.###############################.#######.#.#.#########.#.###########.#######.#########.#.#######.#####.###.#####.#######
|
||||||
|
#...#...........###...#.........................#####.......#...#.....#...#.#.............###...#.....#.....#.#.....#.......###.....#.......#
|
||||||
|
#.#############.#######.#######################.###########.#########.#.#.#.#################.#.#####.#.#####.#.###.###############.#######.#
|
||||||
|
#...#.....#...#...#...#.......................#.#...#.....#...#.....#.#.#...#...........#.....#.....#...#.....#...#...........#...#.........#
|
||||||
|
###.#.###.#.#.###.#.#.#######################.#.#.#.#.###.###.#.###.#.#.#####.#########.#.#########.#####.#######.###########.#.#.###########
|
||||||
|
#...#.#...#.#...#.#.#...#.....#...#...........#.#.#...###.....#...#...#.#...#.........#.#.....#...#.......#.....#.#.........#...#...........#
|
||||||
|
#.###.#.###.###.#.#.###.#.###.#.#.#.###########.#.###############.#####.#.#.#########.#.#####.#.#.#########.###.#.#.#######.###############.#
|
||||||
|
#.....#.....###.#.#...#.#...#...#...#...#...#...#.#.......#...###.....#.#.#...#...#...#.#...#...#...........#...#.#.......#.#.....#.........#
|
||||||
|
###############.#.###.#.###.#########.#.#.#.#.###.#.#####.#.#.#######.#.#.###.#.#.#.###.#.#.#################.###.#######.#.#.###.#.#########
|
||||||
|
#.....#.....#...#.....#.....#.......#.#.#.#.#.....#.....#...#.#...###.#.#.#...#.#.#...#...#.###...#...#.....#.....#...#...#...###.#.......###
|
||||||
|
#.###.#.###.#.###############.#####.#.#.#.#.###########.#####.#.#.###.#.#.#.###.#.###.#####.###.#.#.#.#.###.#######.#.#.#########.#######.###
|
||||||
|
#...#.#...#...#.............#.....#...#...#...#.....###...#...#.#...#.#.#.#.#...#.###.....#...#.#...#.#...#...#.....#.#.....#...#.......#...#
|
||||||
|
###.#.###.#####.###########.#####.###########.#.###.#####.#.###.###.#.#.#.#.#.###.#######.###.#.#####.###.###.#.#####.#####.#.#.#######.###.#
|
||||||
|
#...#...#...#...#...........#.....#...........#.#...#...#.#...#.#...#.#.#.#...#...#...###...#...#...#...#...#.#...###.......#.#.......#.....#
|
||||||
|
#.#####.###.#.###.###########.#####.###########.#.###.#.#.###.#.#.###.#.#.#####.###.#.#####.#####.#.###.###.#.###.###########.#######.#######
|
||||||
|
#.....#.....#...#...#...#...#...###.#...#.......#...#.#.#...#.#.#.#...#.#.....#...#.#.....#.......#...#.....#...#...###...###.#.......#.....#
|
||||||
|
#####.#########.###.#.#.#.#.###.###.#.#.#.#########.#.#.###.#.#.#.#.###.#####.###.#.#####.###########.#########.###.###.#.###.#.#######.###.#
|
||||||
|
#.....#.....#...###...#...#...#.#...#.#...#.........#.#.....#...#...#...#.....#...#.#.....#.....#.....#.......#...#.....#.....#.......#.#...#
|
||||||
|
#.#####.###.#.###############.#.#.###.#####.#########.###############.###.#####.###.#.#####.###.#.#####.#####.###.###################.#.#.###
|
||||||
|
#.......#...#.#...#...........#.#.....#...#.#...#...#.......#.....#...###.....#...#.#.....#...#.#.......#.....###...#.................#.#...#
|
||||||
|
#########.###.#.#.#.###########.#######.#.#.#.#.#.#.#######.#.###.#.#########.###.#.#####.###.#.#########.#########.#.#################.###.#
|
||||||
|
#.........#...#.#.#.......#...#...#.....#.#...#...#.#.......#.#...#.###.....#.#...#.....#.#...#.....#...#...###...#.#...................#...#
|
||||||
|
#.#########.###.#.#######.#.#.###.#.#####.#########.#.#######.#.###.###.###.#.#.#######.#.#.#######.#.#.###.###.#.#.#####################.###
|
||||||
|
#...........#...#.......#...#.....#.....#.#...#...#.#.........#...#...#...#.#.#.....###.#...#.......#.#.....#...#.#...#.....#...#...#...#...#
|
||||||
|
#############.#########.###############.#.#.#.#.#.#.#############.###.###.#.#.#####.###.#####.#######.#######.###.###.#.###.#.#.#.#.#.#.###.#
|
||||||
|
#...........#.........#...#.....###.....#...#...#...#...###...###...#...#.#.#.....#...#.....#.###...#.........#...###...###...#...#...#...#.#
|
||||||
|
#.#########.#########.###.#.###.###.#################.#.###.#.#####.###.#.#.#####.###.#####.#.###.#.###########.#########################.#.#
|
||||||
|
#.#.....#...#...#...#.#...#...#.....#.....#...#...#...#.#...#.....#...#...#...###...#.#.....#...#.#.#...#.......#...#...#...........#.....#.#
|
||||||
|
#.#.###.#.###.#.#.#.#.#.#####.#######.###.#.#.#.#.#.###.#.#######.###.#######.#####.#.#.#######.#.#.#.#.#.#######.#.#.#.#.#########.#.#####.#
|
||||||
|
#...#...#.....#...#...#.......#.....#.#...#.#.#.#.#...#.#...#.....###.#.......#...#.#.#.....#...#.#.#.#.#.........#...#...#.........#.....#.#
|
||||||
|
#####.#########################.###.#.#.###.#.#.#.###.#.###.#.#######.#.#######.#.#.#.#####.#.###.#.#.#.###################.#############.#.#
|
||||||
|
#...#.................#...#...#...#.#.#...#.#.#.#.#...#.#...#.....#...#...#...#.#.#.#.#...#.#...#.#...#.#...#...#...#...#...#...........#.#.#
|
||||||
|
#.#.#################.#.#.#.#.###.#.#.###.#.#.#.#.#.###.#.#######.#.#####.#.#.#.#.#.#.#.#.#.###.#.#####.#.#.#.#.#.#.#.#.#.###.#########.#.#.#
|
||||||
|
#.#...................#.#...#.#...#.#.#...#.#...#...#...#.#...#...#.....#.#.#.#.#.#.#.#.#...#...#.....#.#.#...#...#.#.#...###.#.........#.#.#
|
||||||
|
#.#####################.#####.#.###.#.#.###.#########.###.#.#.#.#######.#.#.#.#.#.#.#.#.#####.#######.#.#.#########.#.#######.#.#########.#.#
|
||||||
|
#...#...#.......#.....#.###...#.#...#.#...#.........#...#.#.#...#.......#.#.#.#.#.#.#.#...#...#...#...#.#.....#.....#.......#.#.#...#...#...#
|
||||||
|
###.#.#.#.#####.#.###.#.###.###.#.###.###.#########.###.#.#.#####.#######.#.#.#.#.#.#.###.#.###.#.#.###.#####.#.###########.#.#.#.#.#.#.#####
|
||||||
|
#...#.#...#.....#.#...#.#...#...#...#.#...#...#...#.#...#.#.#...#...#.....#.#.#.#.#.#...#.#.#...#.#.###.#.....#.#.........#...#...#...#.....#
|
||||||
|
#.###.#####.#####.#.###.#.###.#####.#.#.###.#.#.#.#.#.###.#.#.#.###.#.#####.#.#.#.#.###.#.#.#.###.#.###.#.#####.#.#######.#################.#
|
||||||
|
#.#...#.....#...#.#.#...#...#.#...#...#.#...#.#.#.#.#...#.#...#.#...#...#...#.#.#.#.###.#.#.#.#...#...#.#.....#.#...#...#.....#...#.........#
|
||||||
|
#.#.###.#####.#.#.#.#.#####.#.#.#.#####.#.###.#.#.#.###.#.#####.#.#####.#.###.#.#.#.###.#.#.#.#.#####.#.#####.#.###.#.#.#####.#.#.#.#########
|
||||||
|
#.#...#.......#.#.#...#...#.#.#.#.###...#...#...#.#...#.#.#.....#...###...###.#.#.#...#.#.#.#.#...#...#.#.....#...#...#...###...#.#...#...###
|
||||||
|
#.###.#########.#.#####.#.#.#.#.#.###.#####.#####.###.#.#.#.#######.#########.#.#.###.#.#.#.#.###.#.###.#.#######.#######.#######.###.#.#.###
|
||||||
|
#.....#.........#.#.....#...#...#...#...#...#...#.....#.#.#...#...#.........#.#.#.#...#.#.#...###.#...#.#.......#...#...#.......#...#.#.#...#
|
||||||
|
#######.#########.#.###############.###.#.###.#.#######.#.###.#.#.#########.#.#.#.#.###.#.#######.###.#.#######.###.#.#.#######.###.#.#.###.#
|
||||||
|
###...#.......#...#.............#...#...#...#.#.........#...#.#.#.#...#.....#...#.#...#.#.#.......#...#.#.......###.#.#.#.......#...#...#...#
|
||||||
|
###.#.#######.#.###############.#.###.#####.#.#############.#.#.#.#.#.#.#########.###.#.#.#.#######.###.#.#########.#.#.#.#######.#######.###
|
||||||
|
#...#.........#.###.............#...#...#...#.#.......#.....#...#.#.#...#.......#.#...#.#.#.......#.###...###.......#.#.#.......#...#...#...#
|
||||||
|
#.#############.###.###############.###.#.###.#.#####.#.#########.#.#####.#####.#.#.###.#.#######.#.#########.#######.#.#######.###.#.#.###.#
|
||||||
|
#...#.........#.#...#...#...#...#...#...#...#...#...#.#.###...#...#.......#...#.#.#...#...#.......#.....#...#.....#...#.#.....#...#.#.#.#...#
|
||||||
|
###.#.#######.#.#.###.#.#.#.#.#.#.###.#####.#####.#.#.#.###.#.#.###########.#.#.#.###.#####.###########.#.#.#####.#.###.#.###.###.#.#.#.#.###
|
||||||
|
###.#.#.......#.#.#...#...#.#.#...###.#.....###...#...#...#.#...#...#...#...#...#...#.....#.#...#.....#...#...#...#.#...#...#...#.#.#.#.#...#
|
||||||
|
###.#.#.#######.#.#.#######.#.#######.#.#######.#########.#.#####.#.#.#.#.#########.#####.#.#.#.#.###.#######.#.###.#.#####.###.#.#.#.#.###.#
|
||||||
|
#...#.#.......#.#.#.....#...#.#.......#.......#.......#...#.....#.#.#.#.#.........#.#.....#...#.#.#...#.....#.#.#...#...#...###.#.#...#...#.#
|
||||||
|
#.###.#######.#.#.#####.#.###.#.#############.#######.#.#######.#.#.#.#.#########.#.#.#########.#.#.###.###.#.#.#.#####.#.#####.#.#######.#.#
|
||||||
|
#...#...#.....#.#.#.....#.#...#.#.....#.....#.###.....#.#.......#.#...#...#...#...#.#.......#...#.#...#...#.#.#.#.#.....#.....#...#.......#.#
|
||||||
|
###.###.#.#####.#.#.#####.#.###.#.###.#.###.#.###.#####.#.#######.#######.#.#.#.###.#######.#.###.###.###.#.#.#.#.#.#########.#####.#######.#
|
||||||
|
###.....#.....#.#...#.....#.###...#...#...#...#...#...#.#...#...#.......#...#.#.###.#...#...#.#...#...#...#...#.#.#...#.....#.....#.......#.#
|
||||||
|
#############.#.#####.#####.#######.#####.#####.###.#.#.###.#.#.#######.#####.#.###.#.#.#.###.#.###.###.#######.#.###.#.###.#####.#######.#.#
|
||||||
|
#.............#.###...#...#.#...###...#...#.....#...#.#.#...#.#.#...#...#...#.#...#...#...#...#...#...#.......#.#.###.#.#...#.....#...###.#.#
|
||||||
|
#.#############.###.###.#.#.#.#.#####.#.###.#####.###.#.#.###.#.#.#.#.###.#.#.###.#########.#####.###.#######.#.#.###.#.#.###.#####.#.###.#.#
|
||||||
|
#...#...#.....#.#...#...#.#.#.#.......#...#.#...#...#...#...#.#...#.#.....#.#...#.......#...#.....###...#.....#...#...#.#...#.......#...#.#.#
|
||||||
|
###.#.#.#.###.#.#.###.###.#.#.###########.#.#.#.###.#######.#.#####.#######.###.#######.#.###.#########.#.#########.###.###.###########.#.#.#
|
||||||
|
#...#.#.#.#...#.#...#.#...#.#.#...#.....#.#.#.#.#...#.......#.....#.#...#...#...#...#...#...#.....#.....#.........#.#...###...#.....#...#.#.#
|
||||||
|
#.###.#.#.#.###.###.#.#.###.#.#.#.#.###.#.#.#.#.#.###.###########.#.#.#.#.###.###.#.#.#####.#####.#.#############.#.#.#######.#.###.#.###.#.#
|
||||||
|
#.....#...#.....###...#.....#...#...###...#...#...###.............#...#...###.....#...#####.......#...............#...#######...###...###...#
|
||||||
|
#############################################################################################################################################
|
||||||
|
|
@ -0,0 +1,223 @@
|
||||||
|
#include "aoc.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
static const i32 DX[4] = {0, 1, 0, -1};
|
||||||
|
static const i32 DY[4] = {-1, 0, 1, 0};
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
i32 start_x, start_y;
|
||||||
|
i32 end_x, end_y;
|
||||||
|
} Cheat;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
i32 *dist;
|
||||||
|
i32 width, height;
|
||||||
|
} DistanceMap;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
i32 x, y;
|
||||||
|
} Vec2i;
|
||||||
|
|
||||||
|
static Vec2i
|
||||||
|
vec2i(i32 x, i32 y) {
|
||||||
|
Vec2i result = { .x = x, .y = y };
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
Vec2i *points;
|
||||||
|
i32 write, read;
|
||||||
|
isize size;
|
||||||
|
} Queue;
|
||||||
|
|
||||||
|
static inline i32
|
||||||
|
queue_next(Queue *queue, i32 index) {
|
||||||
|
return (index + 1) % queue->size;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
queue_push(Queue *queue, Vec2i pos) {
|
||||||
|
ASSERT(queue_next(queue, queue->write) != queue->read);
|
||||||
|
queue->points[queue->write] = pos;
|
||||||
|
queue->write = queue_next(queue, queue->write);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline Vec2i
|
||||||
|
queue_pop(Queue *queue) {
|
||||||
|
ASSERT(queue->read != queue->write);
|
||||||
|
Vec2i result = queue->points[queue->read];
|
||||||
|
queue->read = queue_next(queue, queue->read);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
queue_empty(Queue *queue) {
|
||||||
|
return queue->write == queue->read;
|
||||||
|
}
|
||||||
|
|
||||||
|
static DistanceMap
|
||||||
|
compute_distances(Arena *arena, Grid grid, i32 x, i32 y) {
|
||||||
|
DistanceMap map = {
|
||||||
|
.width = grid.width,
|
||||||
|
.height = grid.height,
|
||||||
|
.dist = ARENA_ALLOC_ARRAY(arena, i32, grid.width * grid.height)
|
||||||
|
};
|
||||||
|
for (i32 i = 0; i < grid.width * grid.height; i++) {
|
||||||
|
map.dist[i] = INT32_MAX;
|
||||||
|
}
|
||||||
|
map.dist[y * map.width + x] = 0;
|
||||||
|
Queue queue = {.size = 1024, .points = ARENA_ALLOC_ARRAY(arena, Vec2i, 1024) };
|
||||||
|
queue_push(&queue, vec2i(x, y));
|
||||||
|
while (!queue_empty(&queue)) {
|
||||||
|
Vec2i point = queue_pop(&queue);
|
||||||
|
i32 dist = map.dist[point.y * map.width + point.x];
|
||||||
|
for (i32 i = 0; i < 4; i++) {
|
||||||
|
i32 nx = point.x + DX[i];
|
||||||
|
i32 ny = point.y + DY[i];
|
||||||
|
if (nx >= 0 && ny >= 0 && nx < map.width && ny < map.height) {
|
||||||
|
u8 cell = grid.grid[ny * map.width + nx];
|
||||||
|
if (cell != '#') {
|
||||||
|
if (dist + 1 < map.dist[ny * map.width + nx]) {
|
||||||
|
map.dist[ny * map.width + nx] = dist + 1;
|
||||||
|
queue_push(&queue, vec2i(nx, ny));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
dump_distance_map(DistanceMap map) {
|
||||||
|
for (i32 y = 0; y < map.height; y++) {
|
||||||
|
for (i32 x = 0; x < map.width; x++) {
|
||||||
|
i32 dist = map.dist[y * map.width + x];
|
||||||
|
if (dist == INT32_MAX) {
|
||||||
|
printf("#");
|
||||||
|
} else {
|
||||||
|
printf("%d", dist % 10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef DYNAMIC_ARRAY(Cheat) Cheats;
|
||||||
|
|
||||||
|
static Cheats
|
||||||
|
enumerate_cheats(Arena *arena, Grid *grid, i32 length) {
|
||||||
|
Cheats cheats = {0};
|
||||||
|
i32 radius = length; // manhattan distance between start and end
|
||||||
|
for (i32 y = 0; y < grid->height; y++) {
|
||||||
|
for (i32 x = 0; x < grid->width; x++) {
|
||||||
|
/* printf("@ (%d, %d)\n", x, y); */
|
||||||
|
for (i32 dy = -radius; dy <= radius; dy++) {
|
||||||
|
// abs(dx) + abs(dy) <= radius
|
||||||
|
for (i32 dx = -radius; dx <= radius; dx++) {
|
||||||
|
i32 d = abs(dx) + abs(dy);
|
||||||
|
if (d == 0 || d > radius) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
i32 x_ = x + dx;
|
||||||
|
i32 y_ = y + dy;
|
||||||
|
|
||||||
|
if (x_ < 0 || y_ < 0 || x_ >= grid->width || y_ >= grid->height) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
i32 source_index = y * grid->width + x;
|
||||||
|
i32 target_index = y_ * grid->width + x_;
|
||||||
|
if (grid->grid[source_index] != '#' && grid->grid[target_index] != '#') {
|
||||||
|
*push(&cheats, arena) = (Cheat) { .start_x = x, .start_y = y, .end_x = x_, .end_y = y_ };
|
||||||
|
/* i32 len = abs(dx) + abs(dy); */
|
||||||
|
/* printf("Found cheat of length %d between (%d, %d) and (%d, %d)\n", len - 1, x, y, x_, y_); */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cheats;
|
||||||
|
}
|
||||||
|
|
||||||
|
static i32
|
||||||
|
count_savings(Arena *arena, Grid grid, i32 start_x, i32 start_y, i32 end_x, i32 end_y, DistanceMap dm_start, DistanceMap dm_end, i32 cheat_duration) {
|
||||||
|
Cheats cheats = enumerate_cheats(arena, &grid, cheat_duration);
|
||||||
|
/* printf("Found %ld possible cheats\n", cheats.len); */
|
||||||
|
|
||||||
|
i32 without_cheats = dm_end.dist[start_y * grid.width + start_x];
|
||||||
|
/* printf("without cheats: %d\n", without_cheats); */
|
||||||
|
|
||||||
|
i32 count = 0;
|
||||||
|
for (isize i = 0; i < cheats.len; i++) {
|
||||||
|
Cheat cheat = cheats.data[i];
|
||||||
|
ASSERT(grid.grid[cheat.start_y * grid.width + cheat.start_x] != '#');
|
||||||
|
ASSERT(grid.grid[cheat.end_y * grid.width + cheat.end_x] != '#');
|
||||||
|
i32 dx = cheat.end_x - cheat.start_x;
|
||||||
|
i32 dy = cheat.end_y - cheat.start_y;
|
||||||
|
i32 cheat_len = abs(dx) + abs(dy);
|
||||||
|
ASSERT(cheat_len <= cheat_duration);
|
||||||
|
ASSERT(cheat_len > 0);
|
||||||
|
|
||||||
|
i32 start_index = cheat.start_y * grid.width + cheat.start_x;
|
||||||
|
i32 end_index = cheat.end_y * grid.width + cheat.end_x;
|
||||||
|
|
||||||
|
i32 saved = without_cheats - (dm_start.dist[start_index] + cheat_len + dm_end.dist[end_index]);
|
||||||
|
bool bar = false;
|
||||||
|
if (saved > 0) {
|
||||||
|
#if 0
|
||||||
|
printf("From (%d, %d) [%d] via cheat (%d, %d) -> (%d, %d) [%d] to (%d, %d) [%d]\n",
|
||||||
|
start_x, start_y, dm_start.dist[start_index],
|
||||||
|
cheat.start_x, cheat.start_y, cheat.end_x, cheat.end_y, cheat_len,
|
||||||
|
end_x, end_y, dm_end.dist[end_index]);
|
||||||
|
#endif
|
||||||
|
#if 0
|
||||||
|
printf("Saved %d\n", saved);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
if (saved >= 100) count++;
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
Arena *arena = make_arena(Megabytes(256));
|
||||||
|
str input = read_file(arena, argv[1]);
|
||||||
|
Grid grid = parse_grid(input, arena);
|
||||||
|
|
||||||
|
i32 start_x = -1, start_y = -1;
|
||||||
|
i32 end_x = -1, end_y = -1;
|
||||||
|
|
||||||
|
for (i32 y = 0; y < grid.height; y++) {
|
||||||
|
for (i32 x = 0; x < grid.width; x++) {
|
||||||
|
if (grid_at(&grid, x, y) == 'S') {
|
||||||
|
start_x = x;
|
||||||
|
start_y = y;
|
||||||
|
}
|
||||||
|
else if (grid_at(&grid, x, y) == 'E') {
|
||||||
|
end_x = x;
|
||||||
|
end_y = y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ASSERT(start_x != -1 && start_y != -1);
|
||||||
|
ASSERT(end_x != -1 && end_y != -1);
|
||||||
|
|
||||||
|
grid.grid[start_y * grid.width + start_x] = '.';
|
||||||
|
|
||||||
|
DistanceMap dm_start = compute_distances(arena, grid, start_x, start_y);
|
||||||
|
/* dump_distance_map(dm_start); */
|
||||||
|
DistanceMap dm_end = compute_distances(arena, grid, end_x, end_y);
|
||||||
|
/* dump_distance_map(dm_end); */
|
||||||
|
ASSERT(dm_start.dist[1 * grid.width + 3] + dm_end.dist[1 * grid.width + 3] ==
|
||||||
|
dm_end.dist[start_y * grid.width + start_x]);
|
||||||
|
|
||||||
|
Arena watermark = *arena;
|
||||||
|
i32 part_1 = count_savings(arena, grid, start_x, start_y, end_x, end_y, dm_start, dm_end, 2);
|
||||||
|
printf("%d\n", part_1);
|
||||||
|
|
||||||
|
*arena = watermark;
|
||||||
|
i32 part_2 = count_savings(arena, grid, start_x, start_y, end_x, end_y, dm_start, dm_end, 20);
|
||||||
|
printf("%d\n", part_2);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
###############
|
||||||
|
#...#...#.....#
|
||||||
|
#.#.#.#.#.###.#
|
||||||
|
#S#...#.#.#...#
|
||||||
|
#######.#.#.###
|
||||||
|
#######.#.#...#
|
||||||
|
#######.#.###.#
|
||||||
|
###..E#...#...#
|
||||||
|
###.#######.###
|
||||||
|
#...###...#...#
|
||||||
|
#.#####.#.###.#
|
||||||
|
#.#...#.#.#...#
|
||||||
|
#.#.#.#.#.#.###
|
||||||
|
#...#...#...###
|
||||||
|
###############
|
||||||
Loading…
Reference in New Issue