Add days 11, 12
This commit is contained in:
86
11-seating_system/Cargo.lock
generated
Normal file
86
11-seating_system/Cargo.lock
generated
Normal file
@@ -0,0 +1,86 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
[[package]]
|
||||
name = "anyhow"
|
||||
version = "1.0.38"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "afddf7f520a80dbf76e6f50a35bca42a2331ef227a28b3b6dc5c2e2338d114b1"
|
||||
|
||||
[[package]]
|
||||
name = "either"
|
||||
version = "1.6.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
|
||||
|
||||
[[package]]
|
||||
name = "itertools"
|
||||
version = "0.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "37d572918e350e82412fe766d24b15e6682fb2ed2bbe018280caa810397cb319"
|
||||
dependencies = [
|
||||
"either",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.24"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
|
||||
dependencies = [
|
||||
"unicode-xid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "991431c3519a3f36861882da93630ce66b52918dcf1b8e2fd66b397fc96f28df"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "seating_system"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"itertools",
|
||||
"thiserror",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "1.0.60"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c700597eca8a5a762beb35753ef6b94df201c81cca676604f547495a0d7f0081"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"unicode-xid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thiserror"
|
||||
version = "1.0.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "76cc616c6abf8c8928e2fdcc0dbfab37175edd8fb49a4641066ad1364fdab146"
|
||||
dependencies = [
|
||||
"thiserror-impl",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thiserror-impl"
|
||||
version = "1.0.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9be73a2caec27583d0046ef3796c3794f868a5bc813db689eed00c7631275cd1"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-xid"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
|
||||
@@ -7,3 +7,6 @@ edition = "2018"
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
anyhow = "1.0.37"
|
||||
itertools = "0.10.0"
|
||||
thiserror = "1.0.23"
|
||||
|
||||
98
11-seating_system/data/input.txt
Normal file
98
11-seating_system/data/input.txt
Normal file
@@ -0,0 +1,98 @@
|
||||
LLLLLLLL.LLLLLLLLL.LL.LLLLLLL.LLLLL.LLLLLLLL.LLLLL.LLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLL
|
||||
LLLLLLLL.LLLLLLLLLLLLLL.L.LLL..LLLL.LLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLL..LLLLLLLLLL
|
||||
LLLLLLLL.LLLLLLLLL.LLLL.LLLLL.LL.LL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.L.LLL.LLLL.L.LLLLLLL.LLLLLLL
|
||||
LLLLLLLL.LLLLLLL.L.LLLL.LLLLL.LLLLL.LLLLLLLLLLLLLLL..LLLLLL.LLLLLLLLL.LLLLLLLL..LLLLLLLLLLLLLL.L
|
||||
LLLLLLLL.LLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLL.LL.LLLLLLLL.LLLLLL.LLLLLL.LLL
|
||||
LLLLLLLL.LLLLLLLLL.LLLLLLLLLL.LLL.LLLLLLLLLL.L.LLL..LLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLL.LLLL.LLLLL
|
||||
LLLL.LLL.LLLLLL.LL.LLLLL..LLL.LLLL..LL.L.LLLLLLLLLLL.LLLLLLLL.LLLLLLL..LLLLLLL.LLL.LLLLLLLLLLLLL
|
||||
LLLLLLLL.LLLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLLLL
|
||||
LL...L......L.L.L......L....L.....LLLL..L.L.L.L................LL........L..L...L......L..L.LL..
|
||||
L.LLLLLLLLLLLLLL.L.LLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LL
|
||||
LLLLLLLL.L.LLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLL
|
||||
LLLLLLLL..L.LLLLLL.LLLL.LLLLLLLL.LLLLLL.LL.L.LLLLLL.LLLLLLLLLLLLLLLLL.L.LLLLL..LLLLLLLLLLLLLLLLL
|
||||
LLLLLLLL.LLLL.LLLL.LLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLL.LLLLLL.L.LLLLLLL.LL
|
||||
LLLLLLLL.LLLLLLLLL.LLLL.LLLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLL.LL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLL
|
||||
LLLLLLLL.LLLL.LLLL.LLLL.LLLLL.LLLLL.LL.LLLL..L.LLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLL..LLLLL.LLLL
|
||||
.L...L.....L.........L.L..L...LL.....L.L.L..L.L.....L..L.L.L........L...L..L.......L....L...LL.L
|
||||
LLLLLLLLLLL.LLL.LL.LLLL.LLL.L.LLLLLLLLLLLLL..LLLLLLLLLLLLLLLL.LL.LLLL.LLLLLLLLLLLLLLLLLLLLL.LLLL
|
||||
LLLLLLLL.LLLLLLLLLLLLLLLLLLL..LL.LLLLLLLLLLL.LLLLLL.LLLLLLLL..LLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLL
|
||||
LLLLLLLL.LLLLLLLLLLLLLL.LLLL..LLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.L.LLLLLL.LLLLLLLLLL
|
||||
LLLLLLLL...LLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLLL.L.LLLLLLLLLLL.LLLLLLL.LL..LLLLLLLLLLL.LLLLLLLLLL
|
||||
L...LL.L........L..LLL.L.LL..L..L.L.L..L..L.........L.....LLL.....LLL........LLL...LL..L.L...LL.
|
||||
LLLLLLLLLLLLLLLLLL.LLLL.LLLLL.LLLLL.L.LLLLL...LLL.L.L.LLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLLL
|
||||
LLL.LLLL.LLLLLLLLL.LLLLLLLLL..L.L.L.LLLLLLLL.LLLLLL.LLLLLLL.L.LLLLLLL.LLL.LLLLLLLLLLL.LLLLLLLLLL
|
||||
LLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLL.LLL.LLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.
|
||||
LLLLLLLL.LLLLLLLLL.LLLL.LLLLL..LLLL.LLLLLLLL.LLLLLL.LLLLLLLLL.LL.LLLL.LLLLLLLL.LLLLLL.LLLLLLLLLL
|
||||
...L.L.L..LL.......L.LL.L..LL........LLLL.....LL.LLL.L.LL...L.L.......LL....L..L..LL.L....L..LLL
|
||||
L...LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL.L.LLLL.LLLLL.LLL.LLLLLLL.LLLLLLLLLLLLLLL.LL.LLLLLLL
|
||||
LLLLLLLL.LLL.LLLLL.LLLLLLLLLL.LLLLL.LLLLLLLLLLL.LLL.LLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLL.LLLLLLLLLLL
|
||||
LLLLLLLL.L.LLLLLLL.LLLL.LLLLL.LLLLLLLLLLLLLL..LLLLL.LLLLLL.L..LLLLLLL.LL.L.LLL.LLLLLL.LLLLLLLLLL
|
||||
LLLLLLLL.LLLLLL.LL.LLLL.LLLLL.L.LLL.LLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLL.LLL.LLLLLL.LLLLLLLLLL
|
||||
LLLLLLLLLLLLLLLLLL.LL.L.LLLLL.LLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.L.LLLLLLLL.LLLLLL.LLLL.LLLLL
|
||||
..LL...LL..LLL.L...L....L.L...L.L.L...L.LL.L........L.L..L...L..L.L.LL.L.L..L..LLLL..L..L..L...L
|
||||
LL.LLLLL.LLLLLLL.LLLL.L.LLLLL.LLLLL.LLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLLL.L.LLLLLLLLLLLLL.LL.LLLLLLL
|
||||
LLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLL.LLL.L.LLLL
|
||||
LLLLLLLLLLLL.LLLLLLLLLL.LLLLL.LLLLL.LLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLL
|
||||
LLLL.LLL.LLLLLLLLL.LL...LLL.L.LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLLLL
|
||||
LLLLLLL.L.LLLLLLLL.LLLL.LLLL.LLLLLLLLLLLLLL...LLLLL.LLLLLLLLL.LLLLLLL.LLLL.LLLLLLLLLL.LLLLLLLLLL
|
||||
LLLLLLLLLLLLLLLLLL.LL.L.LLLLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLL.L.L.LLLLLLLL.LLLL.LLLLLLLLLL.L
|
||||
LLLLLLLL.LLLLLLLL..LLLL.LLLLLLLLLLLLLLLLLLLL.LLLLLL.LL.LLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.
|
||||
...L......L....L...LLLL.LLLLL.L..LL.L........LL...L.L.LLLLLLLLLL.LL.LLLL...L....L.....L....LL...
|
||||
LLLL.LLLLLLLLLLLLL..L.L.LLLLLLLLLLLLLLLLLL.L.LLLLLL.LLLLLLL.L.LLLLLLL.LL.LLLLL.LLLLLL.LLLLLLLLLL
|
||||
LLLLLLLL.LLLLL.LLL.LLLL.LLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLL.LL.LLLLLLLLLLLLLLLLL
|
||||
LLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.L.LLLLLLLL.LLLLLLLLLLLLLLLL..LLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLL
|
||||
LLLLLLLLL.LLLLLLLL.LLL..LLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLL.L.LLLLLLLL
|
||||
LLL.LLLL.LLLLL.LLL..LLL.LLLL..LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL...LLL.LLL.LLLLLL.LLLLLLLLLL
|
||||
LLLLLLLL.LLLLLLLLL.LLLL.LLLLL.LLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LL
|
||||
L.L.L.L.L.L....L.LL.L...LL......LL.LL...LLL....L..L..LL.LL.L.L..L..LL.L...LLL.....LLLL.....L....
|
||||
LLLLLL...LLLLLLLLL..LLL.LLLLL.LLL.LLLL.LLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLL.LLLLLLL.LL
|
||||
LLLLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLL.LLLLLLLL.LLLLL..LLLLLL.LL.LLLL..L.LLLLLLLL.LLLLL.LLLLLLLLLLL
|
||||
LLLLLLLL.LLLLLLLLL.LLLL.LLLLL.L.LLL.LLLLLLLL.LLLL.L.LLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLL
|
||||
LLLLLLLL.LLLLL.LL..LLLL.LLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LL.LLLL.LLLLL..L.L.LLLL.LLLLLL.LLL
|
||||
LLLLLLLL.LLL.LLLLL.LLLLLL.LLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL.L.LLLLL..LLLLLLLL
|
||||
LLLLLLLLLLLLLL.LLL..LLL.LLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.L.LLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLL
|
||||
L.LLLLLL.LLLLLLLLL.LLLL.LLLLLLLLLLL.LLL.LLLL.LLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLL..LLLLL.LLLL.LLLLL
|
||||
LLLL.L....L.L.LL.LLLL...LL....L.L..L....L...LLL..L..LLLL...L..L.L.L....L..L.LL.L.L...L...L....L.
|
||||
L.LLLLLL.LLLLLLLLL.LLL..LLLLL.LLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL
|
||||
LLLLLLLL.LLLLLLL.LLLLLL.LLLLL.LLLLL.LLLLLLLL.LL.LLLL.LLLLL.LL.L.LL.LL.LLLLLLLLLLLLLLL.LLLLLLLLLL
|
||||
LLLLLLLLLLLLLLLLLL..LLL.LLLLL.LLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLL
|
||||
LLLLLLLL.LLLLLLLLL.LLLL..LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LL.LLLL.LLLLLLLLLLL.LLLLLLLLL
|
||||
LLLLLLLL.LLLLLL.LL.LLLL.LLLLLL.L.LL.LLLLLLLL.LLLL.L.LLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLL
|
||||
LLLLLLLL.LLL.LLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLL.LLLLLLLLLLL.LLLLLLL.LLLLLLL..LLLLLLLLLLLLLLLLL
|
||||
.L.L..L....L...........L.LL....L.......L..L.LL..L.L........L..L.............L.L....LL.LLL..L.LL.
|
||||
LLLLLLLL.LLLLLL.LL.LLLL.LLLLL.LLLLL.LLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL
|
||||
LLLLLLLL.LLLLLLLLLLLLLL.LLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.L.LLL.LL.LLLLLLLLLL
|
||||
LLLLLLLLLLLL.LLLLL.LLLL.LLLLLLLLLLL.LLLLLLLLLLLLLL..LLLLL.LLL.LL.LLLL.LLLLLLLL.LLL.LLLLLLLLLLLLL
|
||||
LLLLLLLLLLLLLLLLLL.LLLL.LL.LLL..LLLLLLLLLLLL.LLLLLLLLLL.LLLLL.LLLLLLL.LLLLLLLL..LL.LL.LLL.LL.LLL
|
||||
........L...L....LL.....LL..L.....LL.LLLL.LL.LLL.....LLL.....LL.L..LLL.....LL.............L....L
|
||||
LLL.LLLL.LLLLLLLLLL.LLL.LLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLL...LLLLLL.L.L.LL..LLLLLLLLL
|
||||
LLLLLLLLLL.LL.LLLLLLLLL.L.LLL.LLLLL.LLLLLLLL..LLLLLLLLLLLLLLLLLLLLL...LLLLLLLL.LLLLLL.LLLLLLLLLL
|
||||
.LLLLLLL.LLLLLLLLL.LLLL.LLLLLLL.LLLL.LL..LLL.LLLLLLLLL.LLLLLL.LL.L.LL.LLLLLLLLLLLLLLLLLLLLLLLLLL
|
||||
LLLLLLLL.LLLLL.LLL.LLLLL.LLL.LLLLLL.LLLLL.LL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLL.LLL
|
||||
LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLL.LL.LLL.LLLLLLLL..LLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLLLL
|
||||
LLLL.LLL.LLLLLLLLLLLLLLLLLLL.LLLL.L.LLL..LLLL.L.LLL.LL.L.LL.L.LLLLLLL.LLLLLLLL.LLLL.L.L.LLLLLLLL
|
||||
LLLLLLLL.LLLLLLLLL.LLLLLLLLLL.LLLLL.LLLLLLLLLLLLL.L.LL.LLLLLL.L.LLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLL
|
||||
LLL.LLLL.LLLLLLL.L.LLLLLLLLLL.LLLLL..LLL.LL..LLLLLL.LL.LLLLLL.LLLLLLL.LL.LLLLLLLLLLLL.LLLLLLLLLL
|
||||
.L.....L...L.......L...L....L....L..L..LLL.....L............L..LL.L...L.L.L..LL...LLL..L.L.L....
|
||||
LLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLLLL
|
||||
.L.LLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLL..LLLLL.LLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLL
|
||||
LLLLLLLLLLLLLLLL.L.LLLLLLLLLL.LLLLLLLLL.LLLL.LLLLLL.LLLLLLL.L.LLLLLL.LLLLLL.LL.LLLLLL.LLLLLL.LLL
|
||||
LL.LLLLL.LLLLLLLLL..LLL.L.LLL.LLLLL.L.LLL.LL.LLLLLL.LLLLLLLLL.LLLLLL..LLL.LLLL.LLLLL.LLLLLLLLLLL
|
||||
.L...LLL.....L.....LLL....LLLL.L.LL....L...L...L.L.L....L.LLLL...L.L....L.....LL.L.....L..L.L...
|
||||
LLLLL.L...LLLLLLLL.LLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LL.LLLL.L.LLLLLL.LLLLLL.LLLL.LLLLL
|
||||
LLLL.LLL.LLLLLLLLLLLLLLLL.LLL.LLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLL.L.LLLLLL.LLLLLLLLLLLLLLLLL
|
||||
LLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLL.L.LLLLLLL.L.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL
|
||||
LLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLL.LL.LLLLLLLLL.
|
||||
..L..................LL..LL....L.....L..L..L.L...LLLL......L.L.L......L..L....LLLL.L...L....LL..
|
||||
LLLLLLLL.LLLLLLL..LLLLL.LLLL.LLLLLL.LLLLLLLL.LLLLLL.L.LLLLLLL.LLL.LLLLLLLLLLLL.LLLLLL.LLLLLLLLLL
|
||||
LLLLLLLL.LLLLLLLL.LLLLL.LLLLL.LLLLLLLLLLLL.L.LLLLLL..LLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLLLL
|
||||
LLLLLLLL.LLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLL.LLLLLLLLL.LLL.LLLLLL..LLLLLLL.L
|
||||
LLLLLLLLLLLLLLLLLL.LLLL.LLLLL.LL.LLLLLLLLLLL.LLLLLL..LLLLLL.LLLLLLLLL..LL.LLLL.LLLL.L.LLLLLLLLLL
|
||||
LLLLLLLL.LLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLL.LLL.LLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLL
|
||||
L.LLL.LL.LLLL.LLL..LLLL.LLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.L.LL.LLLL.LLLLLLL
|
||||
LLLLLLLL.LLLLLLLLL.LLLL.LLLLLL..LLL.LLLLL.LL.LLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLLL.LLLL.LLLLLLLLLL
|
||||
LLLLLLLL.LLLLLLLLL..LLLLL.LL..LLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL
|
||||
LLLLLLLLLLLLLLLLLL..LLL.LLLLL.LLLLL.LLLLLLLL.LLLLLL..L.LLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLL
|
||||
LLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLL.LLLLLLLL.LLLLLL.LLLLL.LLL.LLLLLLL.LLLLL.LL.LLLL.L.LLLLLLLLLL
|
||||
LLL.LLLL.LL.LLLLLLLLLLL.LLLLLLLLLL..LLLLLLLL.LL.LLLLL.LL.LLLLLLLLLLLLLLLLLLLLLLLLLLL..LLLLLLLLLL
|
||||
LLLLLLLL.LLLLLLLLL.LLLL.LLLL..LLLLL.LLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLLL
|
||||
@@ -1,3 +1,377 @@
|
||||
fn main() {
|
||||
println!("Hello, world!");
|
||||
use std::{fmt, iter::FromIterator, mem, vec};
|
||||
use anyhow::{anyhow, Result};
|
||||
use fmt::{Display};
|
||||
use itertools::Itertools;
|
||||
|
||||
#[derive(Clone, Copy, PartialEq)]
|
||||
enum TileType {
|
||||
Floor,
|
||||
Empty,
|
||||
Occupied,
|
||||
}
|
||||
|
||||
impl Default for TileType {
|
||||
fn default() -> Self {
|
||||
Self::Floor
|
||||
}
|
||||
}
|
||||
|
||||
impl Display for TileType {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
write!(f, "{}", match self {
|
||||
TileType::Floor => '.',
|
||||
TileType::Empty => 'L',
|
||||
TileType::Occupied => '#',
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Debug for TileType {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
write!(f, "{}", match self {
|
||||
TileType::Floor => ".",
|
||||
TileType::Empty => "L",
|
||||
TileType::Occupied => "#",
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl TileType {
|
||||
fn change<T>(&self, i: T) -> TileType where
|
||||
T: IntoIterator<Item = TileType> {
|
||||
match self {
|
||||
TileType::Empty => {
|
||||
if i.into_iter()
|
||||
.filter(|&x| x == TileType::Occupied)
|
||||
.count() == 0 {
|
||||
TileType::Occupied
|
||||
} else {
|
||||
*self
|
||||
}
|
||||
}
|
||||
TileType::Occupied => {
|
||||
if i.into_iter()
|
||||
.filter(|&x| x == TileType::Occupied)
|
||||
.count() >= 4 {
|
||||
TileType::Empty
|
||||
} else {
|
||||
*self
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
*self
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn change_step2<T>(&self, i: T) -> TileType where
|
||||
T: IntoIterator<Item = TileType> {
|
||||
match self {
|
||||
TileType::Empty => {
|
||||
if i.into_iter()
|
||||
.filter(|&x| x == TileType::Occupied)
|
||||
.count() == 0 {
|
||||
TileType::Occupied
|
||||
} else {
|
||||
*self
|
||||
}
|
||||
}
|
||||
TileType::Occupied => {
|
||||
if i.into_iter()
|
||||
.filter(|&x| x == TileType::Occupied)
|
||||
.count() >= 5 {
|
||||
TileType::Empty
|
||||
} else {
|
||||
*self
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
*self
|
||||
}
|
||||
}
|
||||
}}
|
||||
|
||||
impl From<char> for TileType {
|
||||
fn from(c: char) -> Self {
|
||||
match c {
|
||||
'.' => TileType::Floor,
|
||||
'L' => TileType::Empty,
|
||||
'#' => TileType::Occupied,
|
||||
_ => unreachable!()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq)]
|
||||
struct Vec2 {
|
||||
x: i64,
|
||||
y: i64,
|
||||
}
|
||||
|
||||
impl<T> From<(T, T)> for Vec2
|
||||
where T: Into<i64> {
|
||||
fn from((x, y): (T, T)) -> Self {
|
||||
Self {
|
||||
x: x.into(),
|
||||
y: y.into()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<T> From<Vec2> for (T, T)
|
||||
where T: From<i64> {
|
||||
fn from(v: Vec2) -> Self {
|
||||
(v.x.into(), v.y.into())
|
||||
}
|
||||
}
|
||||
|
||||
impl FromIterator<Vec2> for Vec<(i64, i64)> {
|
||||
fn from_iter<T: IntoIterator<Item = Vec2>>(iter: T) -> Self {
|
||||
iter
|
||||
.into_iter()
|
||||
.map(|v| (v.x, v.y))
|
||||
.collect()
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq)]
|
||||
struct Map {
|
||||
size: Vec2,
|
||||
tiles: Vec<TileType>,
|
||||
}
|
||||
|
||||
impl Display for Map {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
for i in 0..self.size.x {
|
||||
for j in 0..self.size.y {
|
||||
write!(f, "{}", self.get((i,j).into()).unwrap())?;
|
||||
}
|
||||
writeln!(f)?
|
||||
};
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
impl Map {
|
||||
fn new(size: Vec2) -> Self {
|
||||
let num_tiles = size.x * size.y;
|
||||
Self {
|
||||
size,
|
||||
tiles: vec![Default::default(); num_tiles as usize]
|
||||
}
|
||||
}
|
||||
|
||||
fn index(&self, pos: Vec2) -> Option<usize> {
|
||||
match (pos.x, pos.y) {
|
||||
(x, y) if (0..self.size.x).contains(&x) && (0..self.size.y).contains(&y) => Some((pos.x * self.size.y + pos.y) as usize),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
fn set(&mut self, pos: Vec2, val: TileType) -> Result<()> {
|
||||
if let Some(index) = self.index(pos) {
|
||||
self.tiles[index] = val;
|
||||
Ok(())
|
||||
} else {
|
||||
Err(anyhow!("Invalid pos {:?} in map of size {:?}", pos, self.size))
|
||||
}
|
||||
}
|
||||
|
||||
fn get(&self, pos: Vec2) -> Option<TileType> {
|
||||
Some(self.tiles[self.index(pos)?])
|
||||
}
|
||||
|
||||
fn neighbors(&self, pos: Vec2) -> impl Iterator<Item = Vec2> {
|
||||
(-1..=1)
|
||||
.cartesian_product(-1..=1)
|
||||
.filter(|v| v != &(0, 0))
|
||||
.map(move |(dx,dy)| Vec2{
|
||||
x: pos.x + dx,
|
||||
y: pos.y + dy
|
||||
})
|
||||
}
|
||||
|
||||
fn neighbors_step2(&self, pos: Vec2) -> impl Iterator<Item = Vec2> {
|
||||
let mut v: Vec<Vec2> = vec![];
|
||||
(-1..=1)
|
||||
.cartesian_product(-1..=1)
|
||||
.filter(|v| v != &(0, 0))
|
||||
.for_each(|(dx,dy)| {
|
||||
let mut ray = pos.clone();
|
||||
loop {
|
||||
ray.x += dx;
|
||||
ray.y += dy;
|
||||
if let Some(tile) = self.get(ray) {
|
||||
if tile == TileType::Empty || tile == TileType::Occupied {
|
||||
v.push(ray);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
v.into_iter()
|
||||
}
|
||||
|
||||
fn neighbor_tiles(&self, pos: Vec2) -> impl Iterator<Item = TileType> + '_ {
|
||||
self.neighbors(pos)
|
||||
.filter_map(move |v| self.get(v))
|
||||
}
|
||||
|
||||
fn neighbor_tiles_step2(&self, pos: Vec2)
|
||||
-> impl Iterator<Item = TileType> + '_ {
|
||||
self.neighbors_step2(pos)
|
||||
.filter_map(move |v| self.get(v))
|
||||
}
|
||||
|
||||
fn read(input: &str) -> Result<Self> {
|
||||
// Read map size
|
||||
let size = (
|
||||
input.lines().count() as i64,
|
||||
input.lines().next().ok_or_else(|| anyhow!("No lines in input !"))?.chars().count() as i64
|
||||
);
|
||||
let mut m = Self::new(size.into());
|
||||
input
|
||||
.chars()
|
||||
.filter(|&c| c != '\n')
|
||||
.zip(m.tiles.iter_mut())
|
||||
.for_each(|(x, y)| *y = x.into());
|
||||
Ok(m)
|
||||
}
|
||||
|
||||
fn update_to(&self, new: &mut Map) {
|
||||
for i in 0..self.size.x {
|
||||
for j in 0..self.size.y {
|
||||
let pos = (i,j).into();
|
||||
new.set(
|
||||
pos,
|
||||
self.get(pos)
|
||||
.unwrap()
|
||||
.change(
|
||||
self.neighbor_tiles(pos)
|
||||
)
|
||||
).unwrap();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn update_to_step2(&self, new: &mut Map) {
|
||||
for i in 0..self.size.x {
|
||||
for j in 0..self.size.y {
|
||||
let pos = (i,j).into();
|
||||
new.set(
|
||||
pos,
|
||||
self.get(pos)
|
||||
.unwrap()
|
||||
.change_step2(
|
||||
self.neighbor_tiles_step2(pos)
|
||||
)
|
||||
).unwrap();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn step1(input: &str) -> usize {
|
||||
let mut m = Map::read(input).unwrap();
|
||||
let mut n = m.clone();
|
||||
let mut i = 0;
|
||||
loop {
|
||||
i += 1;
|
||||
println!("Stage {}", i);
|
||||
mem::swap(&mut m,&mut n);
|
||||
m.update_to(&mut n);
|
||||
// println!("{}", &m);
|
||||
// println!("{}", &n);
|
||||
// Naive, as update_to could also report nb of changes
|
||||
if n == m {
|
||||
break;
|
||||
}
|
||||
};
|
||||
m.tiles.into_iter().filter(|&c| c == TileType::Occupied).count()
|
||||
|
||||
}
|
||||
|
||||
fn step2(input: &str) -> usize {
|
||||
let mut m = Map::read(input).unwrap();
|
||||
let mut n = m.clone();
|
||||
let mut i = 0;
|
||||
loop {
|
||||
i += 1;
|
||||
println!("Stage {}", i);
|
||||
mem::swap(&mut m,&mut n);
|
||||
m.update_to_step2(&mut n);
|
||||
// println!("{}", &m);
|
||||
// println!("{}", &n);
|
||||
// Naive, as update_to could also report nb of changes
|
||||
if n == m {
|
||||
break;
|
||||
}
|
||||
};
|
||||
m.tiles.into_iter().filter(|&c| c == TileType::Occupied).count()
|
||||
|
||||
}
|
||||
fn main() {
|
||||
let input = include_str!("../data/input.txt");
|
||||
dbg!(step1(input));
|
||||
dbg!(step2(input));
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_phase1() {
|
||||
let input = r"L.LL.LL.LL
|
||||
LLLLLLL.LL
|
||||
L.L.L..L..
|
||||
LLLL.LL.LL
|
||||
L.LL.LL.LL
|
||||
L.LLLLL.LL
|
||||
..L.L.....
|
||||
LLLLLLLLLL
|
||||
L.LLLLLL.L
|
||||
L.LLLLL.LL";
|
||||
assert_eq!(step1(input), 37)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_read() {
|
||||
let input = r"L.LL.LL.LL
|
||||
LLLLLLL.LL
|
||||
L.L.L..L..
|
||||
LLLL.LL.LL
|
||||
L.LL.LL.LL
|
||||
L.LLLLL.LL
|
||||
..L.L.....
|
||||
LLLLLLLLLL
|
||||
L.LLLLLL.L
|
||||
L.LLLLL.LL
|
||||
";
|
||||
let m = Map::read(input).unwrap();
|
||||
assert_eq!(m.index((0,1).into()).unwrap(), 1);
|
||||
assert_eq!(m.get((0,1).into()).unwrap(), TileType::Floor);
|
||||
assert_eq!(format!("{}",m), input);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_neighbors() {
|
||||
let m = Map::new(Vec2 { x: 5, y: 5 });
|
||||
let n = m.neighbors((1,1).into());
|
||||
assert_eq!(
|
||||
n.collect::<Vec<(_,_)>>(),
|
||||
vec![
|
||||
(0,0),
|
||||
(0,1),
|
||||
(0,2),
|
||||
(1,0),
|
||||
(1,2),
|
||||
(2,0),
|
||||
(2,1),
|
||||
(2,2),
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user