day 11
This commit is contained in:
parent
c9d3344d05
commit
68ee92a178
|
@ -14,6 +14,19 @@ version = "1.0.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "console"
|
||||||
|
version = "0.15.7"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c926e00cc70edefdc64d3a5ff31cc65bb97a3460097762bd23afb4d8145fccf8"
|
||||||
|
dependencies = [
|
||||||
|
"encode_unicode",
|
||||||
|
"lazy_static",
|
||||||
|
"libc",
|
||||||
|
"unicode-width",
|
||||||
|
"windows-sys",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "crossbeam-deque"
|
name = "crossbeam-deque"
|
||||||
version = "0.8.3"
|
version = "0.8.3"
|
||||||
|
@ -120,18 +133,106 @@ dependencies = [
|
||||||
"itertools",
|
"itertools",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "day-11"
|
||||||
|
version = "0.0.0"
|
||||||
|
dependencies = [
|
||||||
|
"indicatif",
|
||||||
|
"indoc",
|
||||||
|
"pathfinding",
|
||||||
|
"rayon",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "deprecate-until"
|
||||||
|
version = "0.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7a3767f826efbbe5a5ae093920b58b43b01734202be697e1354914e862e8e704"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"semver",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "either"
|
name = "either"
|
||||||
version = "1.9.0"
|
version = "1.9.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
|
checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "encode_unicode"
|
||||||
|
version = "0.3.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "equivalent"
|
||||||
|
version = "1.0.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "fixedbitset"
|
||||||
|
version = "0.4.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hashbrown"
|
||||||
|
version = "0.14.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "indexmap"
|
||||||
|
version = "2.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f"
|
||||||
|
dependencies = [
|
||||||
|
"equivalent",
|
||||||
|
"hashbrown",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "indicatif"
|
||||||
|
version = "0.17.7"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "fb28741c9db9a713d93deb3bb9515c20788cef5815265bee4980e87bde7e0f25"
|
||||||
|
dependencies = [
|
||||||
|
"console",
|
||||||
|
"instant",
|
||||||
|
"number_prefix",
|
||||||
|
"portable-atomic",
|
||||||
|
"rayon",
|
||||||
|
"unicode-width",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "indoc"
|
name = "indoc"
|
||||||
version = "2.0.4"
|
version = "2.0.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1e186cfbae8084e513daff4240b4797e342f988cecda4fb6c939150f96315fd8"
|
checksum = "1e186cfbae8084e513daff4240b4797e342f988cecda4fb6c939150f96315fd8"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "instant"
|
||||||
|
version = "0.1.12"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "integer-sqrt"
|
||||||
|
version = "0.1.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770"
|
||||||
|
dependencies = [
|
||||||
|
"num-traits",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "itertools"
|
name = "itertools"
|
||||||
version = "0.12.0"
|
version = "0.12.0"
|
||||||
|
@ -141,6 +242,18 @@ dependencies = [
|
||||||
"either",
|
"either",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "lazy_static"
|
||||||
|
version = "1.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libc"
|
||||||
|
version = "0.2.151"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "memchr"
|
name = "memchr"
|
||||||
version = "2.6.4"
|
version = "2.6.4"
|
||||||
|
@ -248,6 +361,51 @@ dependencies = [
|
||||||
"autocfg",
|
"autocfg",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "number_prefix"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pathfinding"
|
||||||
|
version = "4.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "752866d4511516a35883728309499db42696f388263586b70659a5461e641db5"
|
||||||
|
dependencies = [
|
||||||
|
"deprecate-until",
|
||||||
|
"fixedbitset",
|
||||||
|
"indexmap",
|
||||||
|
"integer-sqrt",
|
||||||
|
"num-traits",
|
||||||
|
"rustc-hash",
|
||||||
|
"thiserror",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "portable-atomic"
|
||||||
|
version = "1.6.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "proc-macro2"
|
||||||
|
version = "1.0.70"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b"
|
||||||
|
dependencies = [
|
||||||
|
"unicode-ident",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "quote"
|
||||||
|
version = "1.0.33"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ranges"
|
name = "ranges"
|
||||||
version = "0.3.3"
|
version = "0.3.3"
|
||||||
|
@ -274,8 +432,129 @@ dependencies = [
|
||||||
"crossbeam-utils",
|
"crossbeam-utils",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rustc-hash"
|
||||||
|
version = "1.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "scopeguard"
|
name = "scopeguard"
|
||||||
version = "1.2.0"
|
version = "1.2.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
|
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "semver"
|
||||||
|
version = "1.0.20"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "syn"
|
||||||
|
version = "2.0.40"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "13fa70a4ee923979ffb522cacce59d34421ebdea5625e1073c4326ef9d2dd42e"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"unicode-ident",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "thiserror"
|
||||||
|
version = "1.0.50"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2"
|
||||||
|
dependencies = [
|
||||||
|
"thiserror-impl",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "thiserror-impl"
|
||||||
|
version = "1.0.50"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-ident"
|
||||||
|
version = "1.0.12"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-width"
|
||||||
|
version = "0.1.11"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows-sys"
|
||||||
|
version = "0.45.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
|
||||||
|
dependencies = [
|
||||||
|
"windows-targets",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows-targets"
|
||||||
|
version = "0.42.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
|
||||||
|
dependencies = [
|
||||||
|
"windows_aarch64_gnullvm",
|
||||||
|
"windows_aarch64_msvc",
|
||||||
|
"windows_i686_gnu",
|
||||||
|
"windows_i686_msvc",
|
||||||
|
"windows_x86_64_gnu",
|
||||||
|
"windows_x86_64_gnullvm",
|
||||||
|
"windows_x86_64_msvc",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_aarch64_gnullvm"
|
||||||
|
version = "0.42.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_aarch64_msvc"
|
||||||
|
version = "0.42.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_i686_gnu"
|
||||||
|
version = "0.42.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_i686_msvc"
|
||||||
|
version = "0.42.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_x86_64_gnu"
|
||||||
|
version = "0.42.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_x86_64_gnullvm"
|
||||||
|
version = "0.42.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "windows_x86_64_msvc"
|
||||||
|
version = "0.42.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
|
||||||
|
|
|
@ -9,7 +9,8 @@ members = [
|
||||||
"day-07",
|
"day-07",
|
||||||
"day-08",
|
"day-08",
|
||||||
"day-09",
|
"day-09",
|
||||||
"day-10"
|
"day-10",
|
||||||
|
"day-11"
|
||||||
]
|
]
|
||||||
|
|
||||||
[workspace.dependencies]
|
[workspace.dependencies]
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
[package]
|
||||||
|
name = "day-11"
|
||||||
|
version = "0.0.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
indicatif = { version = "0.17.7", features = ["rayon"] }
|
||||||
|
pathfinding = "4.4.0"
|
||||||
|
rayon.workspace = true
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
indoc.workspace = true
|
|
@ -0,0 +1,140 @@
|
||||||
|
.....................................................................................#......#...............................................
|
||||||
|
..#.....#.................................................................#........................#........................................
|
||||||
|
...............................#...............................................................................#.....#......................
|
||||||
|
.................................................#.............#...............................#...................................#........
|
||||||
|
..............#......#.................#...............#............#.............#..........................................#..............
|
||||||
|
.........................................................................................#.................#...............................#
|
||||||
|
.#..........................................................................................................................................
|
||||||
|
..........................#......#............................................#......#.................................#....................
|
||||||
|
.................................................................................................#..........................................
|
||||||
|
.........................................#..........#..........#............................................................#...............
|
||||||
|
......#.....#......#..........................#........................#....................................................................
|
||||||
|
....................................#.........................................................................#..........................#..
|
||||||
|
..................................................................................#.........................................................
|
||||||
|
...................................................................................................................#........................
|
||||||
|
.................................................................#........................................#.................................
|
||||||
|
.............................#..............................#..........................#.......#............................................
|
||||||
|
..........................................#.....#.............................#.............................................................
|
||||||
|
#..................#..................................................................................................................#.....
|
||||||
|
....................................#...................#..........................#...........................#..............#.............
|
||||||
|
........#................#...................#.............................................................................................#
|
||||||
|
...............................#....................#...........................................#...........................................
|
||||||
|
.......................................#..............................................#.....................................................
|
||||||
|
........................................................................#........#...........................#..............................
|
||||||
|
..................................#........#...................#........................................#.........#.................#.......
|
||||||
|
#................#........................................................................................................#.................
|
||||||
|
.........#.......................................#...............................................#.............................#........#...
|
||||||
|
...............................................................................................................#............................
|
||||||
|
.........................................................................................#..................................................
|
||||||
|
...........................................................#..................................#..........#...........................#......
|
||||||
|
......#.........................#..........................................................................................#................
|
||||||
|
....................#.....................#.......#...............................#.................................#.......................
|
||||||
|
..........................#..............................................#..................................................................
|
||||||
|
..........#..........................#.......................#...................................#..............#..............#...........#
|
||||||
|
......................................................#.....................................................................................
|
||||||
|
............................................................................................................................................
|
||||||
|
#...............................................#................#............................#.............................................
|
||||||
|
..................#......................#............................#................................#................................#...
|
||||||
|
............................................................................................................................................
|
||||||
|
....................................................#....................................#.............................#....................
|
||||||
|
..............#...................#................................#..........#..............................#.............................#
|
||||||
|
............................#...............................................................................................#...............
|
||||||
|
....#.................#.....................................#..........#............................................................#.......
|
||||||
|
......................................................#.....................................................................................
|
||||||
|
...........#..............................#.................................................#..........#.................#..................
|
||||||
|
.................................#..............#................#..........#.......#.......................................................
|
||||||
|
...................................................................................................................#..............#.........
|
||||||
|
#...........................................................................................................#...............................
|
||||||
|
........#.......#............................................................................................................#..............
|
||||||
|
............................#.....................#..........#......................................#.....................................#.
|
||||||
|
.....................................#.................................................#........................#...........................
|
||||||
|
.........................................................................................................................#...........#......
|
||||||
|
.......................#.............................#........................#.............................................................
|
||||||
|
..............#...............................#.................#..................#........#...............................................
|
||||||
|
...#......................................................................#.................................#..............................#
|
||||||
|
...................#..................#.............................................................................#........#..............
|
||||||
|
............................................................................................................................................
|
||||||
|
.........................#.........................#........................................................................................
|
||||||
|
......#......#.............................................#.............................#............#.....................................
|
||||||
|
.................................#......................................#...................................................................
|
||||||
|
.........................................#........................#..............................#.................#..............#.........
|
||||||
|
............................................................................................................................................
|
||||||
|
......................................................#.................................................#..............#..................#.
|
||||||
|
......................#......#...............#...................................#............................#.............................
|
||||||
|
....#...........#.................#............................................................#...............................#............
|
||||||
|
..........................................................................#..........................#......................................
|
||||||
|
..........................................#................................................#...............................#............#...
|
||||||
|
................................................................................................................#...........................
|
||||||
|
..........#....................................#...................................................................................#........
|
||||||
|
................................#....................#..............................................................#.......................
|
||||||
|
......#.......................................................#...............................#.............................................
|
||||||
|
#.......................#.....................................................................................................#.............
|
||||||
|
.................#...................#...........................................#..........................#...............................
|
||||||
|
.....................................................................#....................#.................................................
|
||||||
|
..............................#.................#.......#.........................................#.........................................
|
||||||
|
..#........................................................................#....................................#.........#.................
|
||||||
|
...........#............................#..........................................#.............................................#..........
|
||||||
|
......#.............................................................................................................#.....................#.
|
||||||
|
........................................................................................................#...................................
|
||||||
|
..............#...................#.........#...............................................................................................
|
||||||
|
........................................................#.............#..........#.....#..........#............................#............
|
||||||
|
.........#......................................................#...........................#...............................................
|
||||||
|
.........................................#...................................#.................................#............................
|
||||||
|
............................................................................................................................................
|
||||||
|
................#...................................................................#.................#..................#..................
|
||||||
|
.................................#..........................#.............#....................#................................#..........#
|
||||||
|
...#........................#.........................................................................................................#.....
|
||||||
|
.................................................#......................................#.....................#......#......................
|
||||||
|
...........................................#.........................#........#.............................................................
|
||||||
|
........#......#...................................................................................................................#.....#..
|
||||||
|
.#..................#..................................#.........#..........................................................................
|
||||||
|
..................................#.....#.................................#.................................................................
|
||||||
|
...................................................#.................................#......................................................
|
||||||
|
............................................................#...............................................................................
|
||||||
|
.............................................#......................#..........#............#.........................#......#..............
|
||||||
|
................................#...................................................................#.......................................
|
||||||
|
.....................................................#..................#......................................#............................
|
||||||
|
...#......................#.....................................................................................................#...........
|
||||||
|
...........#...........................................................................#..............................................#.....
|
||||||
|
................#..................................................#..............................................#.........................
|
||||||
|
.......................#......................................................................#.............................................
|
||||||
|
................................#........#.........#.....................#.....#......................#.....................................
|
||||||
|
.#..........................................................................................................................................
|
||||||
|
........................................................#................................#...................#..................#...........
|
||||||
|
.....................................#........#.................................................#.......................................#...
|
||||||
|
.........#...........#......................................................................................................................
|
||||||
|
....................................................#.............................................................#.................#.......
|
||||||
|
.............#............#........................................#.............#.....................#...................#...............#
|
||||||
|
..................#....................#.................................#.............#....................................................
|
||||||
|
................................................#...........................................................................................
|
||||||
|
.......................#...............................................................................................#....................
|
||||||
|
....#..........................................................#.....#..............#...........................................#...........
|
||||||
|
...............................................................................................#..................#.......................#.
|
||||||
|
.........#...................#............................................#.................................................................
|
||||||
|
.............................................................................................................#..............#......#........
|
||||||
|
...........................................................................................#................................................
|
||||||
|
.#...........................................................#..............................................................................
|
||||||
|
..............#..............................#........................................#.............#.......................................
|
||||||
|
....................................#..............#..............#.........#.............................#.............#.............#.....
|
||||||
|
....................#............................................................................................#..........................
|
||||||
|
.........................................................................................#..................................................
|
||||||
|
...........#............................#................#....................................................................#.............
|
||||||
|
.....#......................................................................................................#...............................
|
||||||
|
..................................#................................................#........#.............................................#.
|
||||||
|
.#................#......#...........................................................................#......................................
|
||||||
|
..............................................#.......................#................#............................................#.......
|
||||||
|
.........#............................#........................#..........................................#.....#......#....................
|
||||||
|
..............................................................................................#.............................................
|
||||||
|
........................................................................................................................................#...
|
||||||
|
..........................#........................#...............#................................#............................#..........
|
||||||
|
..#........................................#............#............................................................#......................
|
||||||
|
...............................#.....#........................................#.......#......................................#..............
|
||||||
|
.......................................................................................................#....................................
|
||||||
|
.....................................................#..............................................................................#.......
|
||||||
|
........#......................................#...........................#.............................................#.................#
|
||||||
|
...................#.....#......................................#.............................#.............................................
|
||||||
|
............#.........................#......................................................................#.......#.................#....
|
||||||
|
..............................#...................................................#.........................................................
|
||||||
|
............................................#.........................................................#.....................................
|
||||||
|
.......#..........................#................#.....#.............#....................................................................
|
||||||
|
..................#.........................................................#.............#.......................................#.........
|
|
@ -0,0 +1,146 @@
|
||||||
|
use indicatif::ParallelProgressIterator;
|
||||||
|
use pathfinding::prelude::bfs;
|
||||||
|
use rayon::prelude::*;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
println!("{}", part1(include_str!("./input.txt")));
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part1(input: &str) -> usize {
|
||||||
|
let mut lines = input
|
||||||
|
.lines()
|
||||||
|
.flat_map(|l| {
|
||||||
|
let row = l
|
||||||
|
.chars()
|
||||||
|
.map(|c| Space::try_from(c).expect("invalid char"))
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
if row.iter().all(|s| *s == Space::Empty) {
|
||||||
|
vec![row.clone(), row]
|
||||||
|
} else {
|
||||||
|
vec![row]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
let height = lines.len();
|
||||||
|
let width = lines[0].len();
|
||||||
|
|
||||||
|
for i in (0..width).rev() {
|
||||||
|
if (0..height).all(|j| lines.get(j).unwrap().get(i).unwrap() == &Space::Empty) {
|
||||||
|
(0..height).for_each(|j| {
|
||||||
|
lines[j].insert(i, Space::Empty);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let height = lines.len();
|
||||||
|
let width = lines[0].len();
|
||||||
|
|
||||||
|
let galaxies = lines
|
||||||
|
.par_iter()
|
||||||
|
.enumerate()
|
||||||
|
.flat_map(|(y, l)| {
|
||||||
|
l.par_iter()
|
||||||
|
.enumerate()
|
||||||
|
.filter_map(move |(x, s)| (s == &Space::Galaxy).then_some((x, y)))
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
let pairs = galaxies
|
||||||
|
.par_iter()
|
||||||
|
.enumerate()
|
||||||
|
.flat_map(|(i, (x1, y1))| {
|
||||||
|
galaxies
|
||||||
|
.par_iter()
|
||||||
|
.enumerate()
|
||||||
|
.filter_map(move |(j, (x2, y2))| {
|
||||||
|
if j > i {
|
||||||
|
Some(((*x1, *y1), (*x2, *y2)))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
let distances = pairs
|
||||||
|
.into_par_iter()
|
||||||
|
.progress()
|
||||||
|
.filter_map(|(start, target)| {
|
||||||
|
bfs(
|
||||||
|
&start,
|
||||||
|
|coords| successors(coords, &target, width, height),
|
||||||
|
|cur| *cur == target,
|
||||||
|
)
|
||||||
|
.map(|path| path.len() - 1)
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
distances.iter().sum()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn successors(
|
||||||
|
(x, y): &(usize, usize),
|
||||||
|
(tx, ty): &(usize, usize),
|
||||||
|
width: usize,
|
||||||
|
height: usize,
|
||||||
|
) -> Vec<(usize, usize)> {
|
||||||
|
let mut neighbors = vec![];
|
||||||
|
if tx < x && *x > 0 {
|
||||||
|
neighbors.push((*x - 1, *y));
|
||||||
|
}
|
||||||
|
if tx > x && *x < width - 1 {
|
||||||
|
neighbors.push((*x + 1, *y));
|
||||||
|
}
|
||||||
|
if ty < y && *y > 0 {
|
||||||
|
neighbors.push((*x, *y - 1));
|
||||||
|
}
|
||||||
|
if ty > y && *y < height - 1 {
|
||||||
|
neighbors.push((*x, *y + 1));
|
||||||
|
}
|
||||||
|
neighbors
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
|
enum Space {
|
||||||
|
Empty,
|
||||||
|
Galaxy,
|
||||||
|
}
|
||||||
|
impl TryFrom<char> for Space {
|
||||||
|
type Error = ();
|
||||||
|
|
||||||
|
fn try_from(value: char) -> Result<Self, Self::Error> {
|
||||||
|
match value {
|
||||||
|
'.' => Ok(Self::Empty),
|
||||||
|
'#' => Ok(Self::Galaxy),
|
||||||
|
_ => Err(()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
use indoc::indoc;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_part1() {
|
||||||
|
assert_eq!(
|
||||||
|
part1(indoc!(
|
||||||
|
"
|
||||||
|
...#......
|
||||||
|
.......#..
|
||||||
|
#.........
|
||||||
|
..........
|
||||||
|
......#...
|
||||||
|
.#........
|
||||||
|
.........#
|
||||||
|
..........
|
||||||
|
.......#..
|
||||||
|
#...#.....
|
||||||
|
"
|
||||||
|
)),
|
||||||
|
374
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,164 @@
|
||||||
|
use indicatif::ParallelProgressIterator;
|
||||||
|
use pathfinding::prelude::bfs;
|
||||||
|
use rayon::prelude::*;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
println!("{}", part2(include_str!("./input.txt"), 1_000_000));
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part2(input: &str, factor: usize) -> usize {
|
||||||
|
let mut lines = input
|
||||||
|
.lines()
|
||||||
|
.map(|l| {
|
||||||
|
let row = l
|
||||||
|
.chars()
|
||||||
|
.map(|c| Space::try_from(c).expect("invalid char"))
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
if row.iter().all(|s| *s == Space::Empty) {
|
||||||
|
row.into_par_iter()
|
||||||
|
.map(|_| Space::ExpandedEmpty)
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
} else {
|
||||||
|
row
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
let height = lines.len();
|
||||||
|
let width = lines[0].len();
|
||||||
|
|
||||||
|
for i in (0..width).rev() {
|
||||||
|
if (0..height).all(|j| {
|
||||||
|
matches!(
|
||||||
|
lines.get(j).unwrap().get(i).unwrap(),
|
||||||
|
Space::Empty | Space::ExpandedEmpty
|
||||||
|
)
|
||||||
|
}) {
|
||||||
|
(0..height).for_each(|j| {
|
||||||
|
if let Some(s) = lines[j].get_mut(i) {
|
||||||
|
*s = Space::ExpandedEmpty;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let galaxies = lines
|
||||||
|
.par_iter()
|
||||||
|
.enumerate()
|
||||||
|
.flat_map(|(y, l)| {
|
||||||
|
l.par_iter()
|
||||||
|
.enumerate()
|
||||||
|
.filter_map(move |(x, s)| (s == &Space::Galaxy).then_some((x, y)))
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
let pairs = galaxies
|
||||||
|
.par_iter()
|
||||||
|
.enumerate()
|
||||||
|
.flat_map(|(i, (x1, y1))| {
|
||||||
|
galaxies
|
||||||
|
.par_iter()
|
||||||
|
.enumerate()
|
||||||
|
.filter_map(move |(j, (x2, y2))| {
|
||||||
|
if j > i {
|
||||||
|
Some(((*x1, *y1), (*x2, *y2)))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
let distances = pairs
|
||||||
|
.into_par_iter()
|
||||||
|
.progress()
|
||||||
|
.filter_map(|(start, target)| {
|
||||||
|
bfs(
|
||||||
|
&start,
|
||||||
|
|coords| successors(coords, &target, width, height),
|
||||||
|
|cur| *cur == target,
|
||||||
|
)
|
||||||
|
.map(|path| {
|
||||||
|
path.iter()
|
||||||
|
.map(|(x, y)| {
|
||||||
|
let space = lines.get(*y).unwrap().get(*x).unwrap();
|
||||||
|
if matches!(space, Space::ExpandedEmpty) {
|
||||||
|
factor
|
||||||
|
} else {
|
||||||
|
1
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.sum::<usize>()
|
||||||
|
- 1
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
distances.iter().sum()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn successors(
|
||||||
|
(x, y): &(usize, usize),
|
||||||
|
(tx, ty): &(usize, usize),
|
||||||
|
width: usize,
|
||||||
|
height: usize,
|
||||||
|
) -> Vec<(usize, usize)> {
|
||||||
|
let mut neighbors = vec![];
|
||||||
|
if tx < x && *x > 0 {
|
||||||
|
neighbors.push((*x - 1, *y));
|
||||||
|
}
|
||||||
|
if tx > x && *x < width - 1 {
|
||||||
|
neighbors.push((*x + 1, *y));
|
||||||
|
}
|
||||||
|
if ty < y && *y > 0 {
|
||||||
|
neighbors.push((*x, *y - 1));
|
||||||
|
}
|
||||||
|
if ty > y && *y < height - 1 {
|
||||||
|
neighbors.push((*x, *y + 1));
|
||||||
|
}
|
||||||
|
neighbors
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
|
enum Space {
|
||||||
|
Empty,
|
||||||
|
ExpandedEmpty,
|
||||||
|
Galaxy,
|
||||||
|
}
|
||||||
|
impl TryFrom<char> for Space {
|
||||||
|
type Error = ();
|
||||||
|
|
||||||
|
fn try_from(value: char) -> Result<Self, Self::Error> {
|
||||||
|
match value {
|
||||||
|
'.' => Ok(Self::Empty),
|
||||||
|
'#' => Ok(Self::Galaxy),
|
||||||
|
_ => Err(()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
use indoc::indoc;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_part2() {
|
||||||
|
const INPUT: &str = indoc!(
|
||||||
|
"
|
||||||
|
...#......
|
||||||
|
.......#..
|
||||||
|
#.........
|
||||||
|
..........
|
||||||
|
......#...
|
||||||
|
.#........
|
||||||
|
.........#
|
||||||
|
..........
|
||||||
|
.......#..
|
||||||
|
#...#.....
|
||||||
|
"
|
||||||
|
);
|
||||||
|
assert_eq!(part2(INPUT, 10), 1030);
|
||||||
|
assert_eq!(part2(INPUT, 100), 8410);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue