day 23
This commit is contained in:
parent
9324bc2ccc
commit
067f31bf4e
7
day23/Cargo.lock
generated
Normal file
7
day23/Cargo.lock
generated
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "day23"
|
||||||
|
version = "0.1.0"
|
8
day23/Cargo.toml
Normal file
8
day23/Cargo.toml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
[package]
|
||||||
|
name = "day23"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
141
day23/input.txt
Normal file
141
day23/input.txt
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
#.###########################################################################################################################################
|
||||||
|
#.#.................#...#...#...###.....#####...#.....###...#...###...#.......#.....#...#...###...###...#...###...###...#...#.....#...#.....#
|
||||||
|
#.#.###############.#.#.#.#.#.#.###.###.#####.#.#.###.###.#.#.#.###.#.#.#####.#.###.#.#.#.#.###.#.###.#.#.#.###.#.###.#.#.#.#.###.#.#.#.###.#
|
||||||
|
#.#...#.............#.#...#.#.#...#.#...#.....#.#...#...#.#...#.#...#.#.....#...#...#.#.#.#.#...#.###.#.#.#.#...#.....#.#.#.#...#...#.#...#.#
|
||||||
|
#.###.#.#############.#####.#.###.#.#.###.#####.###.###.#.#####.#.###.#####.#####.###.#.#.#.#.###.###.#.#.#.#.#########.#.#.###.#####.###.#.#
|
||||||
|
#.#...#.....#...#...#...#...#.#...#.#...#.....#.#...#...#...#...#...#.#...#...#...###.#.#.#.#...#.#...#.#.#.#.#.........#.#.#...#.....#...#.#
|
||||||
|
#.#.#######.#.#.#.#.###.#.###.#.###.###.#####.#.#.###.#####.#.#####.#.#.#.###.#.#####.#.#.#.###.#.#.###.#.#.#.#.#########.#.#.###.#####.###.#
|
||||||
|
#.#.#.......#.#.#.#.#...#...#.#...#.#...#.....#.#...#.#...#.#...>.>.#...#.#...#.>.>.#.#.#.#.###.#.#.#...#.#.#.#.###.....#.#.#.#...#...#.#...#
|
||||||
|
#.#.#.#######.#.#.#.#.#####.#.###.#.#.###.#####.###.#.#.#.#.#####v#######.#.#####v#.#.#.#.#.###.#.#.#.###.#.#.#.###.###.#.#.#.#.###.#.#.#.###
|
||||||
|
#.#.#...#...#.#.#.#.#...#...#.#...#.#.###.....#...#.#.#.#.#.....#.......#.#...###.#.#.#.#.#...#.#...#...#.#.#.#.>.>.#...#.#.#.#.#...#.#.#...#
|
||||||
|
#.#.###v#.#.#.#.#.#.###.#.###.#.###.#.#######.###.#.#.#.#.#####.#######.#.###.###.#.#.#.#.###.#.#######.#.#.#.###v###.###.#.#.#.#.###.#.###.#
|
||||||
|
#...###.>.#.#.#.#.#.#...#...#.#.#...#...###...#...#.#.#.#.......#...#...#.....#...#...#.#...#.#.#.......#.#...#...#...#...#.#.#...#...#.#...#
|
||||||
|
#######v###.#.#.#.#.#.#####.#.#.#.#####.###.###.###.#.#.#########.#.#.#########.#######.###.#.#.#.#######.#####.###.###.###.#.#####.###.#.###
|
||||||
|
#.....#...#.#.#.#.#.#.....#.#.#.#...#...#...###...#.#...#...#.....#...###...#...###.....#...#...#.....#...#.....###...#...#.#.#.....#...#...#
|
||||||
|
#.###.###.#.#.#.#.#.#####.#.#.#.###.#.###.#######.#.#####.#.#.###########.#.#.#####.#####.###########.#.###.#########.###.#.#.#.#####.#####.#
|
||||||
|
#...#.....#...#.#.#...#...#.#.#.#...#.>.>.#...#...#.#...#.#.#.........###.#.#.....#.....#.........###.#.###.......#...#...#.#.#.....#.#.....#
|
||||||
|
###.###########.#.###.#.###.#.#.#.#####v###.#.#.###.#.#.#.#.#########.###.#.#####.#####.#########.###.#.#########.#.###.###.#.#####.#.#.#####
|
||||||
|
###.....#...###...###.#.#...#.#...#...#.....#.#.....#.#...#.....#...#.....#.#.....###...#...#.....#...#...###...#.#...#.#...#.#.....#.#.....#
|
||||||
|
#######.#.#.#########.#.#.###.#####.#.#######.#######.#########.#.#.#######.#.#######.###.#.#.#####.#####.###.#.#.###.#.#.###.#.#####.#####.#
|
||||||
|
#.......#.#.........#.#.#...#...#...#...#.....###.....#.......#...#...#.....#.......#.#...#.#.....#.#.....#...#.#...#.#.#...#.#.#...#.#.....#
|
||||||
|
#.#######.#########.#.#.###.###.#.#####.#.#######.#####.#####.#######.#.###########.#.#.###.#####.#.#.#####.###.###.#.#.###.#.#.#.#.#.#.#####
|
||||||
|
#.#.....#.#.........#.#.###.#...#.....#...###.....#.....#####.......#.#.#...........#...###.#.....#...###...###...#.#.#...#...#...#...#.....#
|
||||||
|
#.#.###.#.#.#########.#.###.#.#######.#######.#####.###############.#.#.#.#################.#.###########.#######.#.#.###.#################.#
|
||||||
|
#.#.#...#.#.........#.#.#...#.#.....#.......#.......#...............#...#.................#.#.#.....#.....#...###...#.....###...............#
|
||||||
|
#.#.#.###.#########.#.#.#.###.#.###.#######.#########.###################################.#.#.#.###.#.#####.#.###############.###############
|
||||||
|
#...#...#.#.......#.#...#.....#...#.........#.....#...#.................#.......#...#.....#...#...#.#...###.#...#...#...###...#.........#...#
|
||||||
|
#######.#.#.#####.#.#############.###########.###.#.###.###############.#.#####.#.#.#.###########.#.###.###.###.#.#.#.#.###.###.#######.#.#.#
|
||||||
|
#...###...#.....#...###...###...#.........#...#...#.....#####...#...#...#.#...#...#.#...#.........#...#.....#...#.#...#...#.....###...#...#.#
|
||||||
|
#.#.###########v#######.#.###.#.#########.#.###.#############.#.#.#.#.###.#.#.#####.###.#.###########.#######.###.#######.#########.#.#####.#
|
||||||
|
#.#...........#.>.###...#.#...#...........#...#...#...#...#...#...#...###...#.....#.....#.......#...#.......#.###.#.......#...#.....#.....#.#
|
||||||
|
#.###########.#v#.###.###.#.#################.###.#.#.#.#.#.#####################.#############.#.#.#######.#.###.#.#######.#.#.#########.#.#
|
||||||
|
#...........#...#.#...#...#...........###...#.#...#.#.#.#.#...#...#...###...#...#.#...#.....###...#.#...###...#...#...#...#.#.#.........#...#
|
||||||
|
###########.#####.#.###.#############.###.#.#.#.###.#.#.#.###.#.#.#.#.###.#.#.#.#.#.#.#.###.#######.#.#.#######.#####.#.#.#.#.#########.#####
|
||||||
|
#.........#.....#.#...#.#...###.......#...#...#.#...#.#.#.#...#.#.#.#...#.#...#...#.#.#...#.....###...#...#...#...#...#.#.#.#.#...#.....#...#
|
||||||
|
#.#######.#####.#.###.#.#.#.###.#######.#######.#.###.#.#.#.###.#.#.###.#.#########.#.###.#####.#########.#.#.###.#.###.#.#.#.#.#.#v#####.#.#
|
||||||
|
#.......#.#.....#.#...#.#.#...#...#...#.......#.#.#...#.#.#...#.#.#...#.#.....###...#...#.....#.#...#.....#.#...#.#...#.#.#.#...#.>.#...#.#.#
|
||||||
|
#######.#.#.#####.#.###.#.###.###v#.#.#######.#.#.#.###.#.###v#.#.###.#.#####v###.#####.#####.#.#.#.#.#####.###.#.###.#.#.#.#######v#.#.#.#.#
|
||||||
|
#.......#.#.....#.#.###...#...#.>.>.#...#...#.#.#.#.#...#...>.>.#...#.#...#.>.>.#...#...#...#.#.#.#.#...###...#...###.#.#.#.......#.#.#...#.#
|
||||||
|
#.#######.#####.#.#.#######.###.#v#####.#.#.#.#.#.#.#.#######v#####.#.###.#.#v#.###.#.###.#.#.#.#.#.###v#####.#######.#.#.#######.#.#.#####.#
|
||||||
|
#.......#.#.....#.#.......#.....#...#...#.#.#.#.#.#...#####...#####.#.###...#.#.#...#...#.#.#.#...#...>.>...#.......#...#.#...#...#.#.#.....#
|
||||||
|
#######.#.#.#####.#######.#########.#.###.#.#.#.#.#########.#######.#.#######.#.#.#####.#.#.#.#########v###.#######.#####.#.#.#.###.#.#.#####
|
||||||
|
#.......#...#...#.....#...###...#...#.#...#.#.#.#.....#.....#.....#.#.#.......#.#.....#...#.#.###...#...#...#.......#.....#.#.#.#...#.#.....#
|
||||||
|
#.###########.#.#####.#.#####.#.#.###.#.###.#.#.#####.#.#####.###.#.#.#.#######.#####.#####.#.###.#.#.###.###.#######.#####.#.#.#.###.#####.#
|
||||||
|
#.............#.....#...###...#...###...###...#.#.....#.......#...#...#.......#.#.....#.....#.#...#...###...#.......#.....#.#...#.....#.....#
|
||||||
|
###################.#######.###################.#.#############.#############.#.#.#####.#####.#.###########.#######.#####.#.###########.#####
|
||||||
|
#.........#.....#...###...#.....#.....#...#...#.#.#.......#...#.....#...#...#.#...#...#...#...#.....###...#.#.....#.....#...###...#...#.....#
|
||||||
|
#.#######.#.###.#.#####.#.#####.#.###.#.#.#.#.#.#.#.#####.#.#.#####.#.#.#.#.#.#####.#.###.#.#######.###.#.#.#.###.#####.#######.#.#.#.#####.#
|
||||||
|
#...#...#...###...#...#.#.#.....#.#...#.#...#.#...#.....#...#.......#.#.#.#.#.#...#.#.###.#.#...###.....#.#...###...#...#.......#...#.......#
|
||||||
|
###.#.#.###########.#.#.#.#.#####.#.###.#####.#########.#############.#.#.#.#.#.#.#.#.###.#.#.#.#########.#########.#.###.###################
|
||||||
|
#...#.#.#...#...###.#.#.#.#.......#...#.#.....#.....###.......#.....#.#...#.#...#...#...#.#.#.#.........#.........#.#.###...#...#...........#
|
||||||
|
#.###.#.#.#.#.#.###.#.#.#.###########.#.#.#####.###.#########.#.###.#.#####.###########.#.#.#.#########.#########.#.#.#####.#.#.#.#########.#
|
||||||
|
#.....#...#...#...#.#...#.#...#.......#.#...#...#...#...#.....#...#.#.....#.............#...#.#.....###...........#.#.#...#...#...#.........#
|
||||||
|
#################.#.#####.#.#.#.#######.###.#.###.###.#.#.#######.#.#####.###################.#.###.###############.#.#.#.#########.#########
|
||||||
|
#.......#.........#.#.....#.#.#.#...#...#...#...#...#.#.#...#...#.#.#...#.......#.....###...#...###.........#.....#...#.#.###.....#.#.....###
|
||||||
|
#.#####.#.#########.#.#####.#.#v#.#.#.###.#####.###.#.#.###.#.#.#.#.#.#.#######.#.###.###.#.###############.#.###.#####.#.###.###.#.#.###.###
|
||||||
|
#.....#.#.......#...#.#...#.#.>.>.#...#...#...#.#...#.#.###.#.#.#.#...#.#.......#.#...#...#.###.............#...#...#...#.#...#...#...###...#
|
||||||
|
#####.#.#######.#.###.#.#.#.###v#######.###.#.#.#.###.#.###v#.#.#.#####.#.#######.#.###.###.###.###############.###.#.###.#.###.###########.#
|
||||||
|
#...#.#.........#...#.#.#.#.###.......#...#.#.#.#...#.#.#.>.>.#.#.....#.#.......#.#...#...#...#.............#...#...#...#.#...#.#...#.......#
|
||||||
|
#.#.#.#############.#.#.#.#.#########.###.#.#.#.###.#.#.#.#v###.#####.#.#######.#.###.###.###.#############.#.###.#####.#.###.#.#.#.#.#######
|
||||||
|
#.#...#.....#...#...#...#...#.........###.#.#.#.###...#.#.#.###.#...#.#.#.......#.#...###.#...#...#.........#...#.#...#.#.###.#.#.#.#.....###
|
||||||
|
#.#####.###.#.#.#.###########.###########.#.#.#.#######.#.#.###.#.#.#.#.#.#######.#.#####.#.###.#.#v###########.#.#.#.#.#.###.#.#.#.#####.###
|
||||||
|
#.......###.#.#.#...........#...#.......#.#.#.#.......#.#.#...#.#.#.#.#.#.....###.#...#...#.#...#.>.>.#...#...#.#.#.#.#.#...#.#.#.#.#...#...#
|
||||||
|
###########v#.#.###########.###.#.#####.#.#.#.#######.#.#.###.#.#.#.#.#.#####v###.###.#.###.#.#####v#.#.#.#.#.#.#.#.#.#.###.#.#.#.#.#.#.###.#
|
||||||
|
#.........#.>.#.#...#.....#.#...#.#.....#...#...#...#.#.#.#...#...#...#...#.>.>...#...#...#...#.....#.#.#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#...#
|
||||||
|
#.#######.#v###.#.#.#.###.#.#.###.#.###########.#.#.#.#.#.#.#############.#.#v#####.#####.#####.#####.#.#.#.#.#.#.#.#.###.#.#.#.#.#.#.#.#v###
|
||||||
|
#.....#...#.#...#.#...###.#.#...#.#.......#####.#.#.#.#...#.....###...###.#.#...#...#...#.....#.#...#...#.#.#...#.#.#...#.#.#.#.#.#.#.#.>.###
|
||||||
|
#####.#.###.#.###.#######.#.###.#.#######.#####.#.#.#.#########.###.#.###.#.###.#.###.#.#####.#.#.#.#####.#.#####.#.###.#.#.#.#.#.#.#.###v###
|
||||||
|
#.....#.....#...#.......#...###...#.....#.....#...#.#.#.........#...#...#.#.#...#.....#.#.....#...#.#.....#.....#.#...#...#.#.#...#.#.#...###
|
||||||
|
#.#############.#######.###########.###.#####.#####.#.#.#########.#####.#.#.#.#########.#.#########.#.#########.#.###.#####.#.#####.#.#.#####
|
||||||
|
#.............#.#.....#.....###...#...#.......#...#...#...........#.....#...#...#.....#...#.........#...#...#...#.#...#.....#.....#...#.....#
|
||||||
|
#############.#.#.###.#####.###.#.###.#########.#.#################.###########.#.###.#####.###########.#.#.#.###.#.###.#########.#########.#
|
||||||
|
#.............#...###.....#.#...#.###.#.........#.....#.......#...#.....###.....#.#...#...#...........#...#.#.###.#...#.#...#.....###...#...#
|
||||||
|
#.#######################.#.#.###.###.#.#############.#.#####.#.#.#####.###.#####.#.###.#.###########.#####.#.###.###.#.#.#.#.#######.#.#.###
|
||||||
|
#.#...#...###.........###...#...#.....#.#.............#.....#...#.......#...#...#.#...#.#.....#.......#...#.#...#.#...#...#...###...#.#...###
|
||||||
|
#.#.#.#.#.###.#######.#########.#######.#.#################.#############.###.#.#.###.#.#####.#.#######.#.#.###.#.#.#############.#.#.#######
|
||||||
|
#...#...#.....#.....#...#.....#...#.....#.#.....#...#.....#.#...#...#...#...#.#.#.#...#.#.....#.#...###.#.#.#...#...#...#...#...#.#.#...#####
|
||||||
|
###############.###.###.#.###.###.#.#####.#.###.#.#.#.###.#.#.#.#.#.#.#.###.#.#.#.#.###.#.#####.#.#.###.#.#.#.#######.#.#.#.#.#.#.#.###.#####
|
||||||
|
###.........#...###.....#...#.....#.#.....#.#...#.#...#...#...#...#...#.#...#.#...#...#.#.....#...#...#.#.#...#...#...#.#.#.#.#.#.#.###.....#
|
||||||
|
###.#######.#.#############.#######.#.#####.#.###.#####.###############.#.###.#######.#.#####.#######.#.#.#####.#.#.###.#.#.#.#.#.#.#######.#
|
||||||
|
#...#.....#...###...###...#.........#.....#.#...#...#...#...#...###.....#.....#...###...#.....#...#...#.#.#...#.#.#...#.#.#.#.#.#.#.#...#...#
|
||||||
|
#.###.###.#######.#.###.#.###############.#.###.###.#.###.#.#.#.###v###########.#.#######.#####.#.#v###.#.#.#.#.#.###.#.#.#.#.#.#.#.#v#.#.###
|
||||||
|
#.....###.......#.#...#.#.#...#.....#.....#...#...#.#...#.#...#...>.>.#####...#.#.###...#.#...#.#.>.>...#...#.#.#.#...#.#.#.#.#.#.#.>.#...###
|
||||||
|
###############.#.###.#.#.#.#.#.###.#.#######.###.#.###.#.#########v#.#####.#.#.#.###.#.#v#.#.#.###v#########.#.#.#.###.#.#.#.#.#.###v#######
|
||||||
|
#.......#.......#.#...#.#...#...#...#.....###...#.#.#...#...#.......#...#...#.#.#.#...#.>.>.#.#.###...#.....#.#.#.#...#.#.#.#.#.#.###.......#
|
||||||
|
#.#####.#v#######.#.###.#########.#######.#####.#.#.#.#####.#.#########.#.###.#.#.#.#####v###.#.#####.#.###.#.#.#.###.#.#.#.#.#.#.#########.#
|
||||||
|
#.....#.#.>.#...#.#...#.........#...#...#.#.....#...#.......#.......###...###.#.#...#.....###...#...#.#.#...#...#.#...#...#.#.#...###...#...#
|
||||||
|
#####.#.#v#.#.#.#.###.#########.###.#.#.#.#.#######################.#########.#.#####.###########.#.#.#.#.#######.#.#######.#.#######.#.#.###
|
||||||
|
###...#...#.#.#.#...#.#...#...#.#...#.#.#.#.........###...#.......#.#...#...#...###...#...###.....#.#...#...#...#.#.......#...#...#...#...###
|
||||||
|
###.#######.#.#.###.#.#.#.#.#.#.#.###.#.#v#########.###.#.#.#####.#.#.#.#.#.#######.###.#.###.#####.#######.#.#.#.#######.#####.#.#.#########
|
||||||
|
#...#.....#...#...#.#.#.#.#.#.#.#...#.#.>.>.#...#...#...#.#.....#.#...#...#...#...#.....#.....#.....#...###...#.#.#.......#.....#...###.....#
|
||||||
|
#.###.###.#######.#.#.#.#.#.#.#.###.#.###v#.#.#.#.###.###.#####.#.###########.#.#.#############.#####.#.#######.#.#.#######.###########.###.#
|
||||||
|
#...#...#...#...#...#.#.#.#.#.#.#...#.#...#...#...###...#.#...#.#.#...#...#...#.#...#...#.......###...#.........#...#...###...#...#...#.#...#
|
||||||
|
###.###.###.#.#.#####.#.#.#.#.#.#.###.#.###############.#.#.#.#.#.#.#.#.#.#.###.###.#.#.#.#########.#################.#.#####.#.#.#.#.#.#.###
|
||||||
|
#...#...###...#.....#.#.#.#.#...#.#...#.......#.........#...#.#.#...#...#.#...#...#...#...#...#.....#.................#...#...#.#.#.#.#.#.###
|
||||||
|
#.###.#############.#.#.#.#.#####.#.#########.#.#############.#.#########.###.###.#########.#.#.#####.###################.#.###.#.#.#.#.#.###
|
||||||
|
#.#...#...........#.#...#...###...#...#.......#...#.....#.....#.....#.....#...#...#...#.....#.#.......#...###.............#...#.#...#...#...#
|
||||||
|
#.#.###.#########.#.###########.#####.#.#########.#.###.#.#########.#.#####.###.###.#.#.#####.#########.#.###.###############.#.###########.#
|
||||||
|
#.#.###.........#.#.#.....#...#.......#.......###...#...#.....#...#.#.#...#...#.....#...#.....#.........#.#...#.....#...#...#...#...#...#...#
|
||||||
|
#.#.###########.#.#.#.###.#.#.###############.#######.#######.#.#.#.#.#.#.###.###########.#####.#########.#.###.###.#.#.#.#.#####.#.#.#.#.###
|
||||||
|
#...#...........#...#.#...#.#.#...#...........#.....#.......#.#.#...#...#.#...###...#.....#...#.........#.#.....#...#.#.#.#.#.....#.#.#.#.###
|
||||||
|
#####.###############.#.###.#.#.#.#.###########.###.#######.#.#.#########.#.#####.#.#.#####.#.#########.#.#######.###.#.#.#.#.#####.#.#.#.###
|
||||||
|
#.....#.........#...#.#...#.#.#.#.#...........#...#.###.....#.#...#...###...#...#.#.#.......#.....#.....#...#.....###.#.#.#.#.....#...#...###
|
||||||
|
#.#####.#######.#.#.#.###.#.#.#.#.###########.###.#.###.#####.###.#.#.#######.#.#.#.#############.#.#######.#.#######.#.#.#.#####v###########
|
||||||
|
#.#.....#.......#.#.#.#...#.#.#.#.###.........#...#.....#...#.....#.#.#.....#.#.#.#...#.....#.....#.......#.#...###...#.#.#...#.>.###...#...#
|
||||||
|
#.#.#####.#######.#.#.#.###.#.#.#.###v#########.#########.#.#######.#.#.###.#.#.#.###.#.###.#.###########.#.###.###.###.#.###.#.#v###.#.#.#.#
|
||||||
|
#...#...#.#...###.#.#.#.#...#.#.#...>.>.......#.........#.#.###...#.#.#.#...#.#.#.#...#...#...#...###...#.#.#...#...###...#...#.#.#...#...#.#
|
||||||
|
#####.#.#.#.#v###.#.#.#.#.###.#.#####v#######.#########.#.#.###.#.#.#.#.#.###.#.#.#.#####v#####.#.###.#.#.#.#v###.#########.###.#.#.#######.#
|
||||||
|
###...#...#.#.>.#.#.#.#.#.###.#.#.....#.......#...#...#.#.#.....#...#.#.#.#...#.#.#.#...>.>.#...#.#...#.#.#.>.>.#...#.......#...#...#.......#
|
||||||
|
###.#######.#v#.#.#.#.#.#.###.#.#.#####.#######.#.#.#.#v#.###########.#.#.#.###.#.#.#.###v#.#.###.#.###.#.###v#.###.#.#######.#######.#######
|
||||||
|
#...#...#...#.#.#.#.#.#.#...#...#.....#...#...#.#.#.#.>.>.#...###.....#.#.#...#.#.#.#.#...#...###.#.#...#.#...#.#...#.....#...#.....#.......#
|
||||||
|
#.###.#.#.###.#.#.#.#.#.###.#########.###.#.#.#.#.#.###v###.#.###.#####.#.###.#.#.#.#.#.#########.#.#.###.#.###.#.#######.#.###.###.#######.#
|
||||||
|
#.....#...#...#...#.#.#...#...#.......###.#.#.#.#.#.###.#...#...#.....#.#.#...#...#...#.........#.#.#...#.#...#.#.....###...###...#.........#
|
||||||
|
###########.#######.#.###.###.#.#########.#.#.#.#.#.###.#.#####.#####.#.#.#.###################.#.#.###.#.###.#.#####.###########.###########
|
||||||
|
#...#.......#####...#.###.#...#.........#...#.#.#.#...#.#.#.....#...#...#...#...#.......#.......#...###...#...#...#...#...........#...#.....#
|
||||||
|
#.#.#.###########.###.###.#.###########.#####.#.#.###.#.#.#.#####.#.#########.#.#.#####.#.#################.#####.#.###.###########.#.#.###.#
|
||||||
|
#.#.#...........#.#...###...#...........#...#.#.#.#...#.#.#.......#.......#...#...#...#...#...#...###.......#...#...#...#.........#.#.#.#...#
|
||||||
|
#.#.###########.#.#.#########.###########.#.#.#.#.#.###.#.###############.#.#######.#.#####.#.#.#.###.#######.#.#####.###.#######.#.#.#.#.###
|
||||||
|
#.#.............#...###.......#.........#.#.#...#.#.###...###...#...#...#.#.........#.......#...#...#...#...#.#.....#.....#.......#.#...#...#
|
||||||
|
#.#####################.#######.#######.#.#.#####.#.#########.#.#.#.#.#.#.#########################.###.#.#.#.#####.#######.#######.#######.#
|
||||||
|
#...#.............#...#...#.....#.......#.#.###...#...#.......#...#...#.#...###...###...#.......#...###...#...#...#.......#.......#.#.......#
|
||||||
|
###.#.###########.#.#.###.#.#####.#######.#.###.#####.#.###############.###.###.#.###.#.#.#####.#.#############.#.#######.#######.#.#.#######
|
||||||
|
###...#...........#.#...#...#...#.........#...#.......#...............#.....#...#...#.#...#...#...#####...#...#.#.........###.....#.#.#...###
|
||||||
|
#######.###########.###.#####.#.#############.#######################.#######.#####.#.#####.#.#########.#.#.#.#.#############.#####.#.#.#.###
|
||||||
|
#.......#...#...###...#.#.....#.......#.......#...#...................###...#...#...#.......#...#...#...#.#.#.#.........#.....#.....#...#...#
|
||||||
|
#.#######.#.#.#.#####.#.#.###########.#.#######.#.#.#####################.#.###.#.#############.#.#.#.###.#.#.#########.#.#####.###########.#
|
||||||
|
#...#.....#...#...#...#.#...........#...#.....#.#.#.................#.....#.....#.#.............#.#.#.#...#.#...#.....#.#.......#...........#
|
||||||
|
###.#.###########.#.###.###########.#####.###.#.#.#################.#.###########.#.#############.#.#.#.###v###.#.###.#.#########.###########
|
||||||
|
#...#.#...........#...#.###.....###...###...#.#.#...#...#...#.......#...........#.#.......#...#...#...#.#.>.>.#...#...#.#.....###...........#
|
||||||
|
#.###.#.#############.#.###.###.#####.#####.#.#.###.#.#.#.#.#.#################.#.#######.#.#.#.#######.#.###.#####.###.#.###.#############.#
|
||||||
|
#...#.#...........#...#...#...#.#.....#...#.#.#.#...#.#.#.#.#.###...#.....#.....#...#...#.#.#.#.......#.#.#...#...#.....#...#...#####.......#
|
||||||
|
###.#.###########.#.#####.###.#.#.#####.#.#.#.#.#.###.#.#.#.#v###.#.#.###.#.#######.#.#.#.#.#.#######.#.#.#.###.#.#########.###.#####.#######
|
||||||
|
#...#.#...........#...#...###.#.#...#...#.#.#...#.#...#.#.#.>.>.#.#.#.#...#.....#...#.#.#.#.#.#...#...#...#...#.#...###...#...#...#...#...###
|
||||||
|
#.###.#.#############.#.#####.#.###.#.###.#.#####.#.###.#.#####.#.#.#.#.#######.#.###.#.#v#.#.#.#.#.#########.#.###.###.#.###.###.#.###.#.###
|
||||||
|
#.#...#.......###...#.#.#...#.#.###.#...#.#.....#.#.#...#.....#.#.#.#.#.....#...#.#...#.>.>.#.#.#.#.......###...###...#.#.#...#...#...#.#...#
|
||||||
|
#.#.#########.###.#.#.#.#.#.#.#.###v###.#.#####.#.#.#.#######.#.#.#.#.#####.#.###.#.#########.#.#.#######.###########.#.#.#.###.#####.#.###.#
|
||||||
|
#...#...#.....#...#.#.#.#.#.#.#.#.>.>.#.#.#...#.#.#.#.....#...#...#.#.#.....#.#...#...###.....#.#...#...#.#...........#.#.#.#...#...#...#...#
|
||||||
|
#####.#.#.#####.###.#.#.#.#.#.#.#.###.#.#.#.#.#.#.#.#####.#.#######.#.#.#####.#.#####.###.#####.###.#.#.#.#.###########.#.#.#.###.#.#####v###
|
||||||
|
#.....#...#...#.#...#.#.#.#.#.#.#.#...#.#.#.#.#.#.#.#.....#.......#.#.#...#...#.#...#...#.....#...#.#.#.#.#.#...#.....#.#.#.#...#.#...#.>.###
|
||||||
|
#.#########.#.#.#.###.#.#.#.#.#.#.#.###.#.#.#.#.#.#.#.###########.#.#.###.#.###.#.#.###.#####.###.#.#.#.#.#.#.#.#.###.#.#.#.###.#.###.#.#v###
|
||||||
|
#...........#...#.....#...#...#...#.....#...#...#...#.............#...###...###...#.....#####.....#...#...#...#...###...#...###...###...#...#
|
||||||
|
###########################################################################################################################################.#
|
281
day23/src/main.rs
Normal file
281
day23/src/main.rs
Normal file
@ -0,0 +1,281 @@
|
|||||||
|
use std::cmp;
|
||||||
|
use std::fs::read_to_string;
|
||||||
|
use std::time::Instant;
|
||||||
|
use std::collections::{HashMap, HashSet};
|
||||||
|
|
||||||
|
#[derive(Copy, Clone, PartialEq)]
|
||||||
|
#[repr(u8)]
|
||||||
|
enum Direction {
|
||||||
|
Left = 0,
|
||||||
|
Right = 1,
|
||||||
|
Up = 2,
|
||||||
|
Down = 3,
|
||||||
|
}
|
||||||
|
|
||||||
|
const ALL_DIRECTIONS: [Direction; 4] = [Direction::Left, Direction::Right, Direction::Up, Direction::Down];
|
||||||
|
const OPPOSITE_DIRECTION: [Direction; 4] = [Direction::Right, Direction::Left, Direction::Down, Direction::Up];
|
||||||
|
const DIRECTION_OFFSET: [(i32, i32); 4] = [(-1, 0), (1, 0), (0, -1), (0, 1)];
|
||||||
|
|
||||||
|
// Tries to find the longest path while parsing input on the fly, slow
|
||||||
|
fn find_longest_walk_naive(layout: &[&[u8]], slopes: bool) -> i32 {
|
||||||
|
let start_x = layout[0].iter().position(|&c| c == b'.').unwrap() as i32;
|
||||||
|
find_longest_walk_naive_inner(layout, slopes, (start_x, 0), Direction::Down, HashSet::new())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Inner recursive function for find_longest_walk_naive, takes a set of already visited junctions
|
||||||
|
fn find_longest_walk_naive_inner(layout: &[&[u8]], slopes: bool, mut pos: (i32, i32), mut dir: Direction,
|
||||||
|
mut visited_junctions: HashSet<(i32, i32)>) -> i32 {
|
||||||
|
let last_row = layout.len() - 1;
|
||||||
|
let mut steps = 0;
|
||||||
|
let mut longest_alternative = 0;
|
||||||
|
let mut options: Vec<((i32, i32), Direction)> = vec![];
|
||||||
|
loop {
|
||||||
|
if pos.1 == 0 {
|
||||||
|
pos.1 += 1;
|
||||||
|
dir = Direction::Down;
|
||||||
|
steps += 1;
|
||||||
|
} else if pos.1 == last_row as i32 {
|
||||||
|
return cmp::max(steps, longest_alternative);
|
||||||
|
} else {
|
||||||
|
if visited_junctions.contains(&pos) {
|
||||||
|
return longest_alternative;
|
||||||
|
}
|
||||||
|
let mut add_direction_option = |new_dir: Direction| {
|
||||||
|
let offset = DIRECTION_OFFSET[new_dir as usize];
|
||||||
|
let new_pos = (pos.0 + offset.0, pos.1 + offset.1);
|
||||||
|
if layout[new_pos.1 as usize][new_pos.0 as usize] == b'#' {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
options.push((new_pos, new_dir));
|
||||||
|
};
|
||||||
|
let mut add_all_options = || {
|
||||||
|
for new_dir in ALL_DIRECTIONS {
|
||||||
|
if new_dir == OPPOSITE_DIRECTION[dir as usize] {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
add_direction_option(new_dir);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if slopes {
|
||||||
|
match layout[pos.1 as usize][pos.0 as usize] {
|
||||||
|
b'<' => add_direction_option(Direction::Left),
|
||||||
|
b'>' => add_direction_option(Direction::Right),
|
||||||
|
b'^' => add_direction_option(Direction::Up),
|
||||||
|
b'v' => add_direction_option(Direction::Down),
|
||||||
|
_ => add_all_options()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
add_all_options();
|
||||||
|
}
|
||||||
|
|
||||||
|
if options.is_empty() {
|
||||||
|
// Dead end, doesn't happen but i put it for the sake of completeness
|
||||||
|
return longest_alternative;
|
||||||
|
}
|
||||||
|
if options.len() > 1 {
|
||||||
|
visited_junctions.insert(pos);
|
||||||
|
}
|
||||||
|
for (i, &(new_pos, new_dir)) in options.iter().enumerate() {
|
||||||
|
if i > 0 {
|
||||||
|
let alternative = find_longest_walk_naive_inner(
|
||||||
|
layout, slopes, new_pos, new_dir, visited_junctions.clone());
|
||||||
|
longest_alternative = cmp::max(longest_alternative, steps + alternative);
|
||||||
|
} else {
|
||||||
|
pos = new_pos;
|
||||||
|
dir = new_dir;
|
||||||
|
steps += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
options.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Each element is one node, which is an array of (neighbour index, distance)
|
||||||
|
type HikingGraph = Vec<Vec<(u32, u32)>>;
|
||||||
|
|
||||||
|
// Transforms the input map into a graph of junctions, with edges being distances
|
||||||
|
// First element is the start and last element is the end
|
||||||
|
fn get_hiking_graph(layout: &[&[u8]], slopes: bool) -> HikingGraph {
|
||||||
|
let start_x = layout[0].iter().position(|&c| c == b'.').unwrap() as i32;
|
||||||
|
let last_row = layout.len() - 1;
|
||||||
|
let mut options: Vec<((i32, i32), Direction)> = vec![];
|
||||||
|
let mut junction_node_mapping: HashMap<(i32, i32), u32> = HashMap::new();
|
||||||
|
let mut graph: HikingGraph = vec![];
|
||||||
|
graph.push(vec![]);
|
||||||
|
let mut edge_finding_stack: Vec<(u32, (i32, i32), Direction)> = vec![];
|
||||||
|
edge_finding_stack.push((0, (start_x, 1), Direction::Down));
|
||||||
|
let mut end_node: u32 = 0;
|
||||||
|
const DIR_SLOPES: [u8; 4] = [b'<', b'>', b'^', b'v'];
|
||||||
|
loop {
|
||||||
|
if let Some((id, mut pos, mut dir)) = edge_finding_stack.pop() {
|
||||||
|
let mut steps = 1;
|
||||||
|
let mut possible_forward = true;
|
||||||
|
let mut possible_backward = true;
|
||||||
|
loop {
|
||||||
|
if pos.1 == 0 {
|
||||||
|
pos.1 += 1;
|
||||||
|
dir = Direction::Down;
|
||||||
|
steps += 1;
|
||||||
|
} else if pos.1 == last_row as i32 {
|
||||||
|
let new_id = graph.len() as u32;
|
||||||
|
junction_node_mapping.insert(pos, new_id);
|
||||||
|
if possible_forward {
|
||||||
|
graph[id as usize].push((new_id, steps));
|
||||||
|
}
|
||||||
|
if possible_backward {
|
||||||
|
graph.push(vec![(id, steps)]);
|
||||||
|
} else {
|
||||||
|
graph.push(vec![]);
|
||||||
|
}
|
||||||
|
end_node = new_id;
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
match junction_node_mapping.get(&pos) {
|
||||||
|
None => {}
|
||||||
|
Some(&other_id) => {
|
||||||
|
if !graph[id as usize].iter().any(|(that_id, _)| *that_id == other_id) {
|
||||||
|
if possible_forward {
|
||||||
|
graph[id as usize].push((other_id, steps));
|
||||||
|
}
|
||||||
|
if possible_backward {
|
||||||
|
graph[other_id as usize].push((id, steps));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let mut add_direction_option = |new_dir: Direction| {
|
||||||
|
let offset = DIRECTION_OFFSET[new_dir as usize];
|
||||||
|
let new_pos = (pos.0 + offset.0, pos.1 + offset.1);
|
||||||
|
if layout[new_pos.1 as usize][new_pos.0 as usize] == b'#' {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
options.push((new_pos, new_dir));
|
||||||
|
};
|
||||||
|
let mut add_all_options = || {
|
||||||
|
for new_dir in ALL_DIRECTIONS {
|
||||||
|
if new_dir == OPPOSITE_DIRECTION[dir as usize] {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
add_direction_option(new_dir);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
add_all_options();
|
||||||
|
if options.is_empty() {
|
||||||
|
// Dead end, doesn't happen but i put it for the sake of completeness
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if options.len() == 1 {
|
||||||
|
let &(new_pos, new_dir) = &options[0];
|
||||||
|
if slopes {
|
||||||
|
if layout[pos.1 as usize][pos.0 as usize]
|
||||||
|
== DIR_SLOPES[dir as usize] {
|
||||||
|
possible_backward = false;
|
||||||
|
} else if layout[pos.1 as usize][pos.0 as usize]
|
||||||
|
== DIR_SLOPES[OPPOSITE_DIRECTION[dir as usize] as usize] {
|
||||||
|
possible_forward = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pos = new_pos;
|
||||||
|
dir = new_dir;
|
||||||
|
steps += 1;
|
||||||
|
options.clear();
|
||||||
|
} else {
|
||||||
|
let new_id = graph.len() as u32;
|
||||||
|
junction_node_mapping.insert(pos, new_id);
|
||||||
|
if possible_forward {
|
||||||
|
graph[id as usize].push((new_id, steps));
|
||||||
|
}
|
||||||
|
if possible_backward {
|
||||||
|
graph.push(vec![(id, steps)]);
|
||||||
|
} else {
|
||||||
|
graph.push(vec![]);
|
||||||
|
}
|
||||||
|
for &(new_pos, new_dir) in options.iter() {
|
||||||
|
edge_finding_stack.push((new_id, new_pos, new_dir));
|
||||||
|
}
|
||||||
|
options.clear();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Swaps the end node with the last in array node
|
||||||
|
let last_node = graph.len() as u32 - 1;
|
||||||
|
graph.swap(end_node as usize, last_node as usize);
|
||||||
|
for node in graph.iter_mut() {
|
||||||
|
node.iter_mut().for_each(|to_node|
|
||||||
|
if to_node.0 == end_node {
|
||||||
|
to_node.0 = last_node;
|
||||||
|
} else if to_node.0 == last_node {
|
||||||
|
to_node.0 = end_node;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
graph
|
||||||
|
}
|
||||||
|
|
||||||
|
// Finds the longest path in a graph in a general case
|
||||||
|
fn find_longest_walk_graph(graph: &HikingGraph, node_from: u32, node_to: u32) -> i32 {
|
||||||
|
let visited = vec![false; graph.len()];
|
||||||
|
find_longest_walk_graph_inner(graph, node_from, node_to, visited)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Recursive helper for find_longest_walk_graph, has a set (vec) of visited nodes
|
||||||
|
fn find_longest_walk_graph_inner(graph: &HikingGraph, mut node_from: u32, node_to: u32,
|
||||||
|
mut visited: Vec<bool>) -> i32 {
|
||||||
|
let mut length = 0;
|
||||||
|
let mut longest_alternative = -1;
|
||||||
|
loop {
|
||||||
|
if node_from == node_to {
|
||||||
|
return cmp::max(length, longest_alternative);
|
||||||
|
} else {
|
||||||
|
if visited[node_from as usize] {
|
||||||
|
return longest_alternative;
|
||||||
|
}
|
||||||
|
let connections = &graph[node_from as usize];
|
||||||
|
if connections.is_empty() {
|
||||||
|
// Dead end, doesn't happen but i put it for the sake of completeness
|
||||||
|
return longest_alternative;
|
||||||
|
}
|
||||||
|
visited[node_from as usize] = true;
|
||||||
|
let mut connections_iter = connections.iter();
|
||||||
|
let &(first_node, first_edge) = connections_iter.next().unwrap();
|
||||||
|
for &(new_node, edge) in connections_iter {
|
||||||
|
let new_length = length + edge as i32;
|
||||||
|
let alternative = find_longest_walk_graph_inner(
|
||||||
|
graph, new_node, node_to, visited.clone());
|
||||||
|
if alternative != -1 {
|
||||||
|
longest_alternative = cmp::max(longest_alternative, new_length + alternative);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
node_from = first_node;
|
||||||
|
length += first_edge as i32;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Finds the longest path with given input by building the graph of junctions and finding
|
||||||
|
// the longest path
|
||||||
|
fn find_longest_walk(layout: &[&[u8]], slopes: bool) -> i32 {
|
||||||
|
let graph = get_hiking_graph(layout, slopes);
|
||||||
|
find_longest_walk_graph(&graph, 0, graph.len() as u32 - 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let time_start = Instant::now();
|
||||||
|
let input_str = read_to_string("input.txt").unwrap();
|
||||||
|
let time_start_no_io = Instant::now();
|
||||||
|
let layout: Vec<&[u8]> = input_str.lines().map(|s| s.as_bytes()).collect();
|
||||||
|
let result1 = find_longest_walk(&layout, true);
|
||||||
|
let result2 = find_longest_walk(&layout, false);
|
||||||
|
let elapsed = time_start.elapsed().as_micros();
|
||||||
|
let elapsed_no_io = time_start_no_io.elapsed().as_micros();
|
||||||
|
println!("Time: {}us", elapsed);
|
||||||
|
println!("Time without file i/o: {}us", elapsed_no_io);
|
||||||
|
println!("Result1: {}", result1);
|
||||||
|
println!("Result2: {}", result2);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user