From 4c86a3ddae3c5da7e747ebf009d22dab0f1985bd Mon Sep 17 00:00:00 2001 From: Ashhhleyyy Date: Sun, 18 Dec 2022 22:28:47 +0000 Subject: [PATCH] feat: day 18 --- .aoc-cache/18.txt | 2176 +++++++++++++++++++++++++++++++++++++++++ Cargo.lock | 106 ++ Cargo.toml | 1 + src/bin/day_18.rs | 129 +++ test_cases/day_18.txt | 13 + 5 files changed, 2425 insertions(+) create mode 100644 .aoc-cache/18.txt create mode 100644 src/bin/day_18.rs create mode 100644 test_cases/day_18.txt diff --git a/.aoc-cache/18.txt b/.aoc-cache/18.txt new file mode 100644 index 0000000..5694411 --- /dev/null +++ b/.aoc-cache/18.txt @@ -0,0 +1,2176 @@ +10,16,14 +16,8,8 +6,15,11 +7,15,3 +3,11,9 +6,7,15 +14,7,16 +11,13,2 +3,5,12 +17,12,8 +3,14,13 +17,5,9 +15,15,11 +2,9,11 +9,3,15 +6,7,2 +15,11,5 +13,9,15 +6,15,15 +14,9,3 +3,11,5 +16,13,13 +17,8,9 +13,3,11 +6,7,18 +6,15,12 +11,16,13 +6,6,17 +11,6,16 +10,4,16 +9,18,8 +2,13,5 +7,3,13 +10,6,2 +16,8,11 +12,10,17 +4,4,11 +10,3,15 +8,1,12 +4,5,11 +5,12,16 +14,14,13 +12,4,9 +12,15,15 +5,2,12 +14,15,5 +15,3,11 +5,14,5 +15,4,7 +9,18,10 +7,16,5 +15,15,8 +9,6,3 +2,10,9 +7,15,4 +13,6,17 +13,11,4 +14,2,7 +11,1,7 +7,14,4 +9,15,5 +4,5,6 +9,15,3 +12,16,8 +14,10,16 +8,9,2 +2,9,10 +11,16,14 +3,13,10 +10,10,17 +17,11,13 +4,2,10 +8,2,10 +7,9,17 +7,16,9 +11,11,2 +8,3,13 +14,11,12 +4,11,4 +17,9,13 +5,15,13 +5,7,5 +17,13,10 +9,15,15 +11,16,12 +3,6,11 +14,14,14 +13,16,11 +10,8,17 +14,12,4 +8,15,15 +15,14,11 +9,11,16 +3,11,4 +2,10,7 +13,6,4 +10,15,13 +4,16,8 +11,12,16 +12,8,3 +17,11,10 +5,8,3 +2,9,13 +6,6,2 +14,4,7 +15,16,12 +17,12,10 +13,13,14 +4,8,12 +15,11,4 +14,13,15 +15,16,8 +14,12,14 +13,4,13 +13,14,4 +11,17,12 +16,12,5 +8,17,8 +12,9,1 +6,16,11 +2,10,13 +4,14,14 +16,10,6 +13,13,15 +16,11,14 +7,4,5 +9,5,15 +16,8,5 +5,15,15 +3,14,8 +6,9,3 +10,16,10 +4,7,16 +14,17,8 +17,8,12 +16,14,8 +5,14,10 +17,5,11 +7,11,2 +4,12,3 +9,12,15 +8,5,15 +6,11,16 +2,8,11 +5,3,12 +15,15,10 +16,6,7 +6,12,3 +5,6,15 +13,4,7 +2,10,8 +2,8,13 +16,9,12 +4,12,15 +17,14,13 +5,14,17 +15,7,14 +17,12,6 +16,14,11 +15,10,15 +14,13,4 +16,13,8 +11,2,7 +5,9,2 +3,6,12 +0,10,12 +8,12,16 +14,3,10 +14,14,4 +4,6,13 +11,17,11 +2,6,12 +13,18,10 +5,16,13 +15,14,8 +6,4,6 +8,11,2 +17,10,11 +8,15,4 +3,14,12 +8,6,2 +12,2,11 +15,11,17 +3,6,7 +4,13,9 +12,10,16 +14,3,8 +3,8,14 +7,6,2 +6,7,16 +15,4,5 +14,4,15 +12,14,3 +8,13,17 +12,3,7 +4,6,4 +9,14,3 +11,9,1 +16,9,14 +9,2,7 +14,16,9 +18,9,12 +11,6,3 +8,13,16 +13,12,4 +2,11,6 +11,14,16 +11,12,17 +6,9,4 +10,15,16 +5,15,12 +14,5,8 +13,3,6 +13,14,6 +17,6,13 +16,4,13 +12,3,8 +11,3,15 +17,11,7 +6,15,13 +10,5,17 +17,6,8 +9,7,3 +6,18,11 +9,5,16 +6,12,16 +12,5,13 +13,13,4 +9,3,6 +15,6,12 +3,12,11 +11,3,11 +3,12,13 +11,14,4 +13,4,12 +9,2,6 +16,10,10 +12,16,6 +7,18,8 +12,3,13 +15,6,4 +11,12,5 +10,11,2 +5,9,16 +18,11,8 +15,14,12 +15,13,13 +5,10,13 +12,4,13 +15,9,16 +6,3,5 +12,15,14 +3,13,8 +11,16,8 +12,15,7 +13,8,16 +12,11,3 +1,8,8 +11,10,2 +12,5,17 +14,15,11 +7,14,16 +12,5,15 +4,15,7 +7,12,2 +4,12,5 +17,8,11 +5,3,7 +11,2,8 +16,7,5 +9,8,16 +13,9,2 +4,15,5 +6,13,16 +16,13,7 +3,10,9 +8,11,3 +7,5,12 +16,12,8 +11,18,9 +6,14,4 +12,16,4 +7,13,2 +16,5,6 +12,1,12 +14,6,16 +16,13,10 +10,12,1 +16,6,11 +7,17,7 +4,13,4 +16,11,6 +10,16,5 +4,9,5 +8,4,13 +5,4,15 +5,8,14 +5,12,3 +4,13,11 +15,12,7 +8,4,14 +14,15,12 +4,9,3 +2,7,10 +10,8,18 +5,11,3 +10,3,16 +9,4,3 +13,6,3 +14,13,8 +11,4,13 +2,12,10 +14,13,5 +14,12,5 +2,10,10 +12,6,2 +16,5,8 +2,12,8 +14,8,15 +16,15,9 +7,7,2 +4,10,15 +17,11,6 +8,17,12 +8,4,15 +16,11,13 +16,6,6 +5,6,14 +9,13,2 +15,7,16 +15,6,6 +7,4,7 +12,15,12 +10,4,6 +16,14,10 +6,3,15 +16,4,10 +7,17,8 +11,17,9 +4,9,13 +11,12,2 +6,3,9 +9,7,1 +6,4,5 +10,1,8 +16,8,7 +10,17,10 +6,16,5 +5,12,9 +2,7,12 +2,8,10 +10,3,9 +8,16,4 +7,2,9 +15,5,15 +5,8,4 +6,3,12 +6,6,4 +7,11,3 +14,15,13 +2,11,12 +8,16,5 +3,7,6 +6,3,7 +4,8,15 +8,4,4 +5,11,5 +3,15,7 +2,12,7 +5,6,6 +11,17,6 +6,5,6 +5,13,6 +17,6,9 +4,6,8 +6,2,8 +17,11,9 +3,14,7 +7,5,7 +5,12,17 +11,4,4 +13,15,6 +16,7,8 +8,16,14 +10,19,8 +4,5,9 +5,4,14 +13,3,10 +4,14,5 +17,12,13 +3,5,8 +16,8,6 +6,17,11 +10,17,7 +3,11,12 +10,3,13 +3,13,6 +7,13,15 +9,16,9 +16,13,6 +13,14,13 +6,16,13 +11,18,7 +16,6,8 +10,5,4 +8,4,7 +15,15,9 +16,11,7 +17,12,5 +8,18,7 +8,13,3 +3,11,6 +5,5,6 +6,14,14 +17,14,11 +7,11,17 +15,4,6 +8,8,2 +6,3,13 +8,11,17 +5,4,12 +4,6,15 +13,13,17 +10,17,11 +9,9,2 +16,8,9 +13,3,14 +3,9,4 +16,6,4 +4,6,14 +12,4,5 +9,17,11 +17,9,7 +6,6,13 +13,6,16 +8,7,17 +15,3,8 +10,2,12 +10,14,16 +9,15,14 +8,9,1 +8,8,17 +10,11,15 +4,13,15 +1,6,8 +10,6,16 +11,12,4 +5,8,6 +13,9,17 +4,13,13 +3,13,11 +4,14,11 +17,13,11 +3,12,9 +9,17,15 +16,5,12 +6,11,17 +13,16,6 +18,12,10 +10,14,3 +15,4,11 +5,12,14 +4,12,4 +6,12,2 +17,9,11 +7,17,9 +10,8,2 +3,11,14 +6,10,3 +8,10,2 +12,3,11 +14,5,10 +10,4,14 +17,4,10 +2,11,7 +1,13,7 +6,15,4 +14,4,6 +11,16,15 +5,5,4 +5,7,3 +15,11,14 +10,3,5 +10,4,4 +7,15,5 +8,17,10 +14,7,7 +17,6,12 +5,2,8 +10,3,8 +13,6,5 +6,12,17 +9,1,13 +2,10,12 +2,5,6 +7,16,4 +17,8,8 +16,14,12 +11,1,12 +9,3,7 +5,6,5 +5,5,5 +9,13,3 +17,13,7 +18,9,10 +9,4,14 +7,17,6 +14,15,10 +9,3,13 +3,8,5 +3,4,12 +13,3,9 +7,16,13 +15,7,15 +8,17,9 +6,6,16 +5,11,16 +6,12,15 +15,6,5 +2,6,7 +15,12,14 +13,3,8 +7,10,2 +10,17,12 +11,7,17 +10,4,5 +4,10,14 +6,5,4 +17,8,6 +16,8,12 +9,15,12 +3,6,8 +16,15,10 +17,12,14 +17,10,13 +5,3,9 +12,5,16 +7,6,15 +6,16,4 +14,15,9 +15,13,8 +14,14,12 +17,13,9 +10,15,7 +8,6,15 +3,10,15 +7,10,1 +8,17,5 +8,16,9 +11,3,12 +8,2,11 +6,11,2 +9,5,17 +11,4,5 +12,14,4 +7,1,9 +9,3,14 +16,12,4 +11,10,17 +7,2,12 +5,14,4 +10,16,4 +4,12,17 +12,15,4 +16,8,15 +10,11,18 +11,15,5 +9,4,4 +3,13,7 +10,12,3 +3,11,13 +5,18,11 +15,10,13 +10,13,4 +13,7,15 +4,11,15 +14,9,15 +8,10,17 +8,12,18 +1,8,9 +5,16,8 +16,7,12 +15,14,13 +9,2,13 +6,8,17 +4,5,8 +15,9,7 +14,3,7 +7,5,4 +16,15,11 +1,10,8 +9,8,17 +4,7,14 +15,9,3 +7,4,15 +4,7,3 +16,15,8 +2,14,8 +13,3,5 +6,16,9 +1,13,8 +13,11,2 +13,15,5 +9,17,13 +13,15,12 +16,9,6 +15,12,16 +12,14,2 +11,2,10 +14,16,14 +2,9,8 +14,9,17 +7,18,11 +8,1,7 +10,7,3 +11,3,13 +4,3,11 +16,8,13 +16,9,7 +9,2,4 +10,2,11 +15,16,10 +11,3,9 +4,10,4 +13,16,12 +15,5,14 +10,7,18 +14,16,8 +11,4,16 +14,4,9 +6,17,13 +6,2,10 +4,7,4 +13,13,3 +9,6,17 +8,14,3 +9,5,2 +5,16,7 +10,2,13 +18,12,8 +12,7,17 +11,4,15 +14,13,14 +5,9,17 +15,16,11 +11,3,8 +16,7,7 +17,9,6 +13,14,15 +9,7,17 +16,5,10 +10,4,15 +8,2,9 +3,6,10 +14,11,3 +17,12,9 +16,6,5 +6,5,15 +6,14,3 +8,6,1 +7,16,11 +11,16,5 +10,12,17 +3,13,13 +2,9,6 +18,8,12 +14,4,14 +6,10,17 +12,16,14 +17,7,11 +8,3,14 +15,8,4 +13,5,4 +5,13,14 +16,9,5 +11,15,3 +2,7,13 +12,11,4 +17,7,12 +7,6,17 +9,10,17 +10,3,7 +4,3,9 +3,7,7 +6,3,6 +12,12,18 +12,10,4 +2,13,10 +16,11,8 +8,5,5 +11,9,2 +15,13,11 +9,6,16 +17,7,6 +15,6,11 +14,7,15 +7,17,5 +15,6,9 +8,2,6 +8,18,10 +13,17,7 +10,7,15 +17,11,5 +4,5,5 +4,8,14 +11,10,18 +12,15,6 +14,14,15 +14,12,3 +4,7,11 +3,9,5 +18,11,10 +7,5,15 +5,13,3 +12,5,4 +11,13,14 +5,13,2 +8,11,18 +7,15,12 +7,3,6 +9,10,2 +13,10,3 +2,6,6 +6,8,3 +13,9,5 +16,6,9 +15,8,16 +5,10,17 +7,15,15 +13,2,7 +17,9,8 +16,13,11 +10,6,17 +16,12,10 +15,12,8 +10,17,5 +15,5,9 +14,5,15 +3,14,10 +6,16,7 +11,16,16 +14,16,10 +5,7,16 +14,10,14 +15,9,5 +6,5,8 +15,7,12 +14,15,15 +3,13,12 +5,14,7 +14,14,11 +10,17,6 +3,11,11 +5,10,4 +12,3,10 +12,16,11 +13,16,10 +13,17,8 +2,14,10 +2,12,12 +13,7,16 +14,12,15 +6,6,15 +9,2,12 +1,11,11 +6,6,14 +12,13,15 +7,7,16 +7,2,11 +12,9,16 +12,2,8 +10,18,13 +17,9,10 +3,9,6 +13,9,4 +10,16,13 +9,16,15 +9,5,3 +14,2,8 +13,9,3 +16,15,12 +10,1,9 +8,18,11 +11,12,1 +8,3,7 +5,16,9 +9,13,17 +14,3,11 +14,13,6 +2,7,11 +12,7,3 +11,7,2 +7,8,3 +2,5,8 +7,4,12 +9,3,11 +13,3,7 +7,16,7 +2,8,14 +17,14,10 +12,13,17 +2,9,16 +11,5,17 +8,16,8 +16,6,12 +13,7,17 +8,16,6 +8,17,11 +10,16,7 +8,3,12 +15,15,7 +8,1,10 +10,5,16 +6,4,7 +9,3,5 +6,14,2 +12,4,3 +4,6,5 +13,4,15 +8,13,2 +14,6,6 +12,3,15 +15,4,9 +10,3,4 +7,2,8 +15,13,7 +5,16,12 +17,12,11 +13,2,9 +9,2,10 +14,6,4 +6,16,10 +5,7,15 +12,3,5 +15,3,10 +14,9,16 +5,11,17 +15,5,7 +13,12,5 +12,17,8 +9,17,9 +16,10,12 +1,11,9 +6,18,8 +7,9,16 +18,10,10 +15,13,6 +9,12,0 +14,3,13 +9,14,15 +9,9,1 +3,7,8 +16,14,14 +2,7,8 +5,6,4 +8,3,11 +14,16,11 +10,18,7 +11,1,6 +8,17,13 +12,8,17 +5,15,6 +10,13,1 +16,7,10 +2,10,6 +18,8,11 +17,9,9 +13,8,14 +9,17,14 +6,5,5 +13,8,1 +8,12,17 +5,5,8 +7,16,14 +10,2,8 +16,11,4 +12,17,11 +6,3,10 +12,10,1 +9,16,11 +6,16,12 +9,3,12 +12,12,17 +9,11,2 +15,15,12 +11,12,15 +12,9,2 +8,7,2 +12,10,18 +8,12,1 +6,17,10 +12,16,7 +12,14,7 +17,10,6 +6,1,10 +15,13,12 +13,16,13 +14,7,17 +15,15,13 +5,10,16 +12,8,16 +5,13,12 +11,6,4 +13,4,14 +9,11,18 +16,5,11 +12,8,2 +9,12,4 +6,14,10 +14,7,12 +10,15,4 +3,8,4 +4,4,13 +10,12,18 +14,11,15 +13,5,16 +1,12,11 +18,10,9 +5,10,2 +6,17,12 +14,10,17 +12,14,15 +5,9,3 +16,9,11 +8,3,15 +3,9,8 +5,14,13 +13,14,3 +9,15,4 +13,15,4 +13,6,14 +6,13,15 +6,17,8 +10,2,7 +9,9,17 +3,7,10 +15,9,17 +4,5,13 +13,8,15 +3,5,7 +8,2,7 +8,3,4 +12,12,2 +2,11,14 +10,9,18 +8,16,10 +8,15,7 +14,15,3 +3,8,6 +10,15,5 +3,8,8 +1,10,10 +13,17,12 +1,9,7 +2,8,6 +15,13,5 +2,14,11 +11,15,4 +4,14,13 +18,8,9 +7,5,3 +11,15,15 +11,18,12 +6,4,13 +4,13,6 +11,8,2 +3,15,11 +13,2,6 +10,10,2 +17,6,10 +7,12,18 +16,6,13 +8,4,6 +10,7,1 +4,3,10 +11,10,1 +6,3,8 +15,13,4 +13,15,14 +6,14,7 +5,6,16 +6,9,2 +8,17,14 +13,4,5 +14,9,2 +15,7,6 +9,2,11 +2,13,8 +9,13,15 +6,3,11 +15,6,14 +13,3,13 +4,16,12 +15,7,7 +9,17,10 +7,2,6 +14,4,4 +11,7,3 +11,13,3 +3,3,10 +11,8,0 +10,2,9 +12,17,13 +3,6,14 +3,10,5 +14,4,8 +8,4,11 +6,15,14 +15,3,9 +7,3,15 +10,13,2 +3,8,15 +12,17,7 +10,15,14 +9,16,13 +10,13,16 +8,18,12 +15,12,3 +9,2,8 +7,8,4 +15,12,15 +9,6,14 +15,10,17 +4,4,12 +6,8,15 +5,2,10 +4,15,8 +11,13,17 +14,4,12 +1,10,6 +9,5,13 +8,5,16 +9,5,4 +3,10,7 +5,3,10 +4,3,7 +9,6,15 +1,13,11 +6,13,3 +3,7,5 +15,5,13 +9,1,7 +6,17,7 +10,15,6 +5,4,7 +12,15,5 +16,7,11 +11,2,14 +14,5,6 +14,3,4 +11,5,16 +12,16,12 +13,8,2 +3,15,9 +8,2,13 +5,14,16 +4,9,14 +18,7,9 +13,5,15 +5,16,14 +5,15,10 +7,3,9 +13,10,2 +15,8,15 +13,3,4 +4,9,2 +18,9,9 +8,16,13 +11,2,13 +4,11,5 +4,7,13 +11,3,3 +13,7,3 +3,12,7 +5,13,15 +7,15,14 +7,15,6 +3,15,8 +15,10,4 +4,10,16 +1,11,10 +5,6,13 +3,8,9 +9,12,17 +9,12,1 +2,7,15 +9,1,10 +6,6,3 +4,12,7 +1,10,9 +2,8,8 +14,4,11 +10,18,12 +2,9,7 +8,8,3 +11,14,13 +17,12,12 +13,16,7 +6,2,7 +7,2,10 +10,6,5 +3,15,12 +10,7,2 +13,5,3 +6,1,6 +7,2,13 +5,5,13 +3,12,8 +7,4,6 +12,2,10 +2,13,9 +16,5,7 +8,15,14 +16,6,14 +10,3,11 +11,7,16 +13,11,17 +14,13,13 +8,1,9 +12,3,12 +10,11,3 +16,12,14 +18,10,12 +14,17,10 +15,10,16 +15,6,16 +4,14,10 +2,13,11 +11,1,9 +7,16,6 +11,4,12 +5,3,11 +13,18,14 +16,16,9 +15,12,5 +11,16,10 +3,9,10 +16,7,14 +4,9,4 +15,10,14 +8,7,16 +5,7,4 +1,9,11 +3,6,9 +3,5,6 +15,13,15 +4,11,8 +4,15,12 +5,10,14 +4,13,5 +15,5,5 +11,15,14 +2,12,9 +14,5,13 +11,17,10 +15,17,13 +2,10,11 +6,4,8 +13,7,2 +10,19,11 +7,3,7 +4,4,14 +3,14,9 +11,2,9 +12,11,16 +12,6,3 +12,3,4 +5,7,17 +17,9,12 +10,12,16 +13,11,5 +11,14,17 +2,11,9 +10,16,8 +9,7,2 +4,6,9 +11,1,8 +10,9,2 +11,11,17 +11,16,4 +7,3,16 +1,12,10 +9,16,6 +11,15,16 +15,14,7 +6,6,5 +7,14,15 +9,17,7 +4,16,9 +13,6,2 +6,8,16 +5,14,14 +12,5,10 +1,9,9 +12,2,9 +17,7,10 +12,17,10 +5,17,8 +4,13,3 +10,16,12 +15,9,4 +6,11,4 +3,9,14 +5,11,2 +9,10,1 +9,0,8 +16,12,7 +7,13,16 +3,11,15 +14,3,5 +14,2,10 +1,11,6 +12,6,5 +14,6,8 +15,5,6 +10,11,1 +11,2,11 +3,6,13 +10,13,19 +10,14,15 +14,15,8 +6,13,13 +2,8,5 +13,3,12 +4,15,13 +6,2,13 +16,12,13 +9,13,4 +15,13,3 +14,7,14 +15,6,7 +16,14,9 +4,7,6 +1,8,7 +6,4,16 +15,10,6 +4,14,6 +1,12,9 +15,12,4 +14,4,13 +16,9,13 +6,7,17 +9,9,18 +11,7,4 +14,7,3 +4,4,6 +14,13,12 +15,10,3 +6,14,15 +10,4,3 +6,8,4 +16,3,9 +6,13,4 +5,3,6 +6,6,6 +10,15,10 +13,17,11 +13,4,11 +9,17,12 +10,15,15 +16,14,7 +7,4,13 +16,12,12 +9,4,15 +5,10,6 +3,10,14 +6,4,11 +11,2,12 +8,17,6 +13,4,4 +3,5,11 +2,11,11 +12,14,16 +4,10,6 +6,16,6 +10,6,1 +11,1,10 +5,2,9 +16,10,15 +3,15,10 +8,2,12 +4,13,12 +7,10,16 +15,4,8 +11,12,3 +18,8,7 +8,12,3 +6,13,14 +12,6,17 +6,2,14 +4,7,5 +8,4,5 +3,5,10 +15,4,12 +6,15,9 +5,14,8 +9,17,8 +4,13,14 +1,9,8 +15,8,14 +9,3,4 +4,11,16 +11,5,15 +11,15,9 +16,10,14 +14,5,14 +13,8,3 +11,5,2 +16,12,6 +12,9,17 +11,4,11 +5,2,7 +8,14,16 +12,6,16 +16,12,11 +12,12,3 +15,13,14 +13,14,9 +12,15,3 +12,9,4 +12,12,15 +11,3,10 +10,3,14 +11,18,8 +7,3,11 +2,10,5 +16,10,8 +3,10,13 +6,16,14 +10,10,16 +11,14,14 +12,5,5 +11,16,11 +6,4,4 +9,4,13 +16,9,9 +6,2,12 +5,10,3 +14,3,6 +15,5,8 +16,14,6 +4,16,11 +11,17,5 +6,5,16 +9,3,16 +4,16,10 +7,6,3 +2,7,5 +1,8,11 +14,8,3 +9,4,6 +10,16,11 +3,4,9 +8,15,3 +17,7,9 +5,4,13 +16,11,12 +10,17,14 +14,10,15 +13,11,3 +15,7,5 +14,15,6 +12,17,9 +13,14,16 +13,8,17 +10,3,6 +3,11,7 +6,9,18 +5,14,9 +15,5,10 +13,2,12 +11,13,15 +3,7,9 +7,14,2 +7,12,17 +13,10,16 +11,14,3 +8,3,5 +15,4,10 +17,10,8 +6,14,13 +13,14,11 +11,3,5 +11,4,3 +8,6,17 +2,11,10 +16,3,7 +5,8,16 +15,17,11 +11,3,14 +7,17,12 +8,15,16 +9,12,2 +13,13,6 +3,4,11 +5,17,10 +3,10,11 +12,3,16 +9,7,16 +6,9,1 +3,16,13 +7,10,3 +10,16,6 +14,6,5 +4,14,15 +11,9,17 +2,8,9 +9,16,7 +9,14,14 +15,14,14 +9,15,16 +3,15,6 +16,10,9 +16,10,16 +7,3,12 +16,7,15 +14,2,11 +10,3,10 +15,9,12 +7,13,4 +14,6,7 +10,4,11 +17,6,11 +7,9,2 +12,9,3 +16,13,9 +15,9,15 +4,14,12 +11,2,5 +14,13,9 +13,1,9 +8,10,1 +15,11,15 +4,11,11 +10,13,3 +9,16,14 +7,11,4 +9,13,16 +5,12,15 +12,11,18 +4,5,14 +16,7,13 +18,9,11 +17,10,10 +13,8,4 +17,13,12 +15,11,6 +3,9,9 +6,11,15 +5,15,14 +3,4,7 +9,11,1 +3,8,16 +12,12,16 +9,2,5 +4,14,7 +16,10,7 +9,11,17 +3,7,14 +6,7,4 +2,6,11 +17,4,11 +18,9,8 +6,7,3 +7,6,4 +4,3,8 +16,5,13 +14,3,12 +2,12,6 +11,6,14 +6,10,2 +10,7,4 +5,5,15 +10,6,14 +4,15,9 +9,8,4 +6,5,13 +7,3,8 +9,8,2 +5,9,4 +12,18,8 +17,8,7 +13,1,8 +12,7,16 +17,11,11 +2,8,12 +5,3,8 +12,3,9 +11,8,16 +4,17,8 +14,13,7 +16,7,6 +7,14,3 +8,9,18 +12,14,14 +4,9,16 +12,2,7 +12,13,2 +9,16,5 +10,9,3 +12,11,17 +12,11,2 +5,12,4 +3,9,3 +9,6,2 +8,8,16 +4,5,3 +11,15,6 +12,1,11 +8,11,1 +4,4,10 +15,9,6 +4,4,9 +11,18,10 +5,16,6 +11,6,2 +11,11,16 +5,17,7 +14,7,4 +14,13,3 +8,15,13 +10,8,16 +9,13,18 +13,13,16 +11,8,1 +5,14,3 +16,4,9 +11,13,16 +16,15,7 +18,7,10 +10,3,12 +9,6,4 +10,5,3 +12,17,6 +10,12,15 +12,15,16 +13,15,13 +13,9,16 +12,12,4 +9,5,14 +5,8,2 +10,1,12 +7,9,3 +12,4,4 +13,14,14 +17,12,7 +2,6,10 +3,10,12 +5,13,17 +8,15,6 +9,16,8 +9,16,4 +13,15,15 +10,1,11 +4,8,4 +8,10,3 +3,9,12 +9,1,11 +13,5,14 +3,8,12 +11,6,15 +1,11,8 +14,15,4 +14,14,16 +3,6,5 +11,11,18 +14,11,4 +13,2,13 +6,4,10 +12,7,15 +14,12,13 +6,9,16 +3,4,10 +9,2,9 +12,13,3 +13,10,17 +13,4,6 +13,14,10 +5,4,10 +16,5,9 +14,16,12 +11,14,5 +14,9,5 +4,12,16 +5,8,15 +8,2,8 +8,15,5 +12,13,16 +5,5,14 +8,18,9 +16,7,16 +12,16,10 +4,7,15 +12,8,15 +9,8,3 +18,7,8 +7,5,14 +8,14,2 +7,9,18 +16,10,4 +1,10,12 +14,15,7 +2,14,12 +12,15,9 +13,17,10 +5,14,11 +10,1,10 +6,10,16 +5,3,5 +9,7,15 +3,5,4 +12,10,3 +11,3,6 +15,14,4 +3,12,5 +3,6,6 +7,13,17 +1,9,10 +14,14,3 +9,6,1 +5,14,12 +7,14,14 +7,17,10 +2,11,8 +8,6,16 +17,11,12 +16,7,9 +4,16,5 +16,9,10 +11,14,15 +7,6,16 +3,14,11 +8,10,19 +7,17,14 +15,16,9 +11,4,6 +17,8,14 +7,4,3 +3,8,11 +5,14,6 +9,9,0 +8,13,14 +6,4,12 +16,10,13 +8,16,11 +7,8,16 +8,1,11 +1,9,14 +4,12,14 +9,15,10 +11,9,18 +15,17,6 +13,16,5 +6,15,16 +15,11,10 +6,12,5 +14,17,7 +10,17,13 +17,8,13 +14,13,16 +7,10,17 +6,5,7 +7,2,7 +3,12,10 +7,5,16 +5,9,15 +17,5,10 +5,5,12 +3,6,15 +14,4,5 +10,7,17 +14,10,3 +13,4,10 +16,9,4 +10,7,16 +1,12,8 +15,3,7 +7,16,15 +2,8,4 +18,9,6 +8,16,7 +10,18,5 +10,9,17 +17,10,4 +15,6,13 +6,14,6 +8,9,5 +4,4,8 +7,8,17 +3,12,6 +15,4,13 +12,2,5 +8,5,2 +17,9,15 +4,11,14 +9,3,10 +13,12,3 +4,9,15 +13,16,14 +4,8,3 +15,14,6 +4,7,7 +15,6,10 +6,14,9 +16,13,14 +2,13,7 +10,11,17 +13,2,8 +10,5,7 +11,14,2 +11,8,15 +2,5,9 +14,16,7 +6,5,12 +6,15,3 +6,11,3 +4,15,6 +15,14,5 +3,3,8 +17,10,7 +18,10,8 +9,4,5 +9,11,3 +10,5,18 +15,14,3 +6,15,5 +5,7,13 +9,14,6 +5,14,15 +17,10,12 +7,15,8 +9,15,9 +7,12,3 +11,5,3 +4,12,9 +5,12,6 +15,11,16 +7,14,9 +16,10,5 +15,15,6 +4,12,13 +15,14,9 +12,2,12 +11,5,5 +14,14,6 +16,5,5 +2,6,13 +3,13,5 +12,18,10 +10,18,6 +17,5,8 +2,13,12 +14,7,6 +5,3,15 +6,4,14 +6,2,6 +17,7,7 +15,7,13 +6,17,5 +2,12,13 +15,6,15 +18,6,8 +17,7,8 +7,11,16 +10,12,4 +7,7,14 +15,8,13 +10,0,10 +5,13,4 +8,6,3 +2,15,10 +10,10,18 +8,7,3 +12,5,3 +11,5,4 +16,10,11 +12,3,6 +8,4,16 +6,17,9 +18,8,8 +17,10,9 +7,5,5 +15,16,13 +8,14,15 +8,9,17 +17,10,14 +12,14,13 +16,3,11 +6,9,17 +17,10,5 +4,15,11 +14,5,11 +16,13,12 +5,16,10 +15,14,10 +16,13,5 +13,4,8 +8,10,18 +15,12,13 +6,15,10 +4,13,16 +11,17,13 +12,7,14 +5,16,11 +19,7,9 +14,17,9 +12,11,15 +10,15,2 +5,4,8 +9,12,16 +5,4,5 +13,13,11 +1,11,12 +11,16,6 +3,7,16 +7,15,16 +10,5,15 +10,9,16 +7,1,11 +17,13,13 +13,1,10 +2,9,5 +16,11,9 +18,6,9 +7,14,12 +10,14,17 +7,5,17 +6,4,15 +8,7,18 +3,9,15 +5,4,6 +1,13,10 +6,10,15 +12,14,17 +4,8,5 +12,17,14 +15,8,3 +4,13,10 +4,6,12 +14,14,8 +14,9,4 +12,16,5 +5,8,5 +8,17,15 +17,8,10 +2,7,6 +3,9,13 +2,6,8 +12,18,11 +10,14,4 +9,10,19 +14,10,4 +18,11,9 +13,6,15 +3,12,14 +13,2,11 +17,13,8 +0,11,11 +9,10,16 +11,1,11 +16,11,5 +3,10,6 +8,4,17 +5,15,5 +7,7,18 +9,13,6 +10,17,8 +7,7,4 +4,16,7 +13,11,16 +9,12,18 +14,5,7 +15,7,4 +9,3,9 +6,5,14 +8,13,15 +5,12,2 +5,3,14 +5,15,11 +5,6,8 +7,3,14 +6,15,7 +11,13,4 +16,4,8 +13,7,5 +7,17,11 +5,11,15 +14,3,9 +4,14,9 +8,14,17 +18,9,13 +11,8,3 +1,8,13 +4,3,13 +2,9,9 +13,10,4 +7,17,13 +16,4,12 +15,11,3 +13,4,9 +12,17,12 +4,9,6 +17,11,8 +3,14,14 +15,3,6 +3,10,4 +11,9,16 +2,15,9 +2,4,11 +16,2,8 +13,12,15 +2,11,5 +10,1,14 +8,3,6 +12,18,9 +7,7,3 +15,5,11 +15,11,2 +12,16,15 +14,6,3 +7,12,16 +9,14,16 +6,15,6 +1,7,10 +7,3,5 +1,7,11 +4,8,6 +16,6,10 +4,5,15 +5,7,7 +14,5,16 +8,8,18 +5,15,8 +2,14,13 +8,12,2 +4,15,10 +16,15,6 +11,2,15 +11,13,1 +5,11,4 +14,14,5 +5,5,10 +3,3,6 +12,4,14 +13,12,2 +1,12,12 +10,12,2 +13,16,8 +10,18,10 +14,7,5 +16,11,15 +2,12,11 +6,12,4 +7,14,5 +4,6,7 +18,7,7 +11,5,14 +3,9,7 +5,5,7 +12,1,8 +5,6,3 +14,6,10 +2,7,7 +15,7,10 +12,2,14 +7,18,10 +7,3,4 +12,2,13 +4,8,7 +3,7,11 +11,18,11 +17,7,13 +4,4,5 +14,4,10 +18,11,11 +5,12,13 +9,4,17 +2,14,7 +6,14,16 +7,15,13 +18,13,8 +2,8,7 +12,13,4 +9,11,4 +6,13,5 +5,3,13 +2,5,7 +4,5,10 +8,0,12 +13,12,16 +14,17,11 +14,17,6 +6,7,1 +5,15,9 +8,15,10 +4,11,3 +2,4,10 +8,18,6 +16,9,15 +9,18,11 +15,7,11 +8,5,4 +12,4,12 +12,14,5 +2,14,9 +9,14,2 +14,8,7 +4,4,7 +14,16,6 +14,14,7 +7,8,2 +3,11,8 +4,13,8 +8,16,16 +10,18,11 +9,16,12 +11,8,18 +3,7,13 +5,5,16 +3,5,13 +11,6,1 +3,8,7 +3,7,12 +12,10,2 +5,4,9 +4,8,13 +5,15,7 +12,15,13 +15,10,8 +6,12,14 +10,6,4 +1,8,6 +14,10,5 +8,14,4 +14,15,14 +1,7,9 +4,11,7 +17,13,6 +9,17,5 +11,7,15 +14,13,10 +5,9,5 +13,17,9 +14,9,14 +14,5,5 +17,15,9 +16,13,15 +13,10,15 +12,7,1 +14,10,2 +7,4,9 +16,4,11 +12,7,18 +6,8,2 +4,10,7 +8,14,14 +3,4,8 +17,8,5 +5,7,14 +11,8,5 +4,11,13 +4,10,3 +17,6,7 +12,16,13 +12,7,2 +7,9,1 +9,18,9 +15,3,13 +7,4,14 +7,7,5 +7,4,4 +11,3,7 +4,10,9 +6,16,8 +2,10,14 +10,6,18 +9,9,16 +13,16,9 +8,2,14 +12,6,4 +11,6,5 +8,13,6 +11,17,7 +3,11,10 +8,10,16 +7,10,18 +11,7,18 +12,3,14 +9,0,10 +16,12,9 +11,3,16 +11,14,6 +6,3,14 +5,12,7 +4,7,12 +11,11,3 +12,4,7 +1,9,5 +3,13,9 +9,12,3 +14,12,16 +15,15,14 +13,7,4 +8,11,16 +10,16,15 +8,16,15 +1,7,8 +18,12,7 +5,6,12 +2,11,13 +6,14,5 +13,7,14 +18,12,9 +14,14,10 +15,12,6 +10,17,9 +6,2,11 +10,18,8 +11,15,11 +15,9,14 +4,6,3 +9,15,8 +6,5,3 +11,6,17 +8,13,4 +10,5,5 +7,18,13 +12,2,6 +17,14,9 +14,8,5 +13,10,1 +5,10,15 +8,12,14 +2,7,9 +14,16,13 +4,11,6 +16,3,10 +13,15,8 +10,18,9 +12,4,6 +9,1,8 +3,8,13 +9,16,3 +4,9,8 +3,10,8 +2,5,12 +13,7,13 +1,13,12 +11,11,1 +18,8,10 +6,2,9 +14,6,12 +16,7,4 +11,16,7 +10,14,2 +8,6,13 +17,8,4 +9,8,18 +11,4,7 +10,2,14 +12,4,8 +13,2,10 +17,10,15 +12,17,5 +4,12,6 +15,4,15 +9,4,16 +9,10,18 +6,13,17 +6,11,14 +9,13,1 +3,10,16 +9,1,9 +13,15,3 +15,17,7 +15,11,13 diff --git a/Cargo.lock b/Cargo.lock index 69ac3ed..b9a59a5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -35,6 +35,7 @@ dependencies = [ "lru-cache", "peg", "petgraph", + "rayon", "regex", "time", "ureq", @@ -135,6 +136,55 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-channel" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01a9af1f4c2ef74bb8aa1f7e19706bc72d03598c8a570bb5de72243c7a9d9d5a" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "either" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" + [[package]] name = "eyre" version = "0.6.8" @@ -182,6 +232,15 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + [[package]] name = "idna" version = "0.3.0" @@ -259,6 +318,15 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + [[package]] name = "miniz_oxide" version = "0.5.4" @@ -277,6 +345,16 @@ dependencies = [ "adler", ] +[[package]] +name = "num_cpus" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5" +dependencies = [ + "hermit-abi", + "libc", +] + [[package]] name = "object" version = "0.29.0" @@ -365,6 +443,28 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rayon" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db3a213adf02b3bcfd2d3846bb41cb22857d131789e01df434fb7e7bc0759b7" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cac410af5d00ab6884528b4ab69d1e8e146e8d471201800fa1b4524126de6ad3" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "num_cpus", +] + [[package]] name = "regex" version = "1.7.0" @@ -415,6 +515,12 @@ dependencies = [ "webpki", ] +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + [[package]] name = "sct" version = "0.7.0" diff --git a/Cargo.toml b/Cargo.toml index a3ff1bb..5f9e7ac 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,3 +20,4 @@ regex = "1.7.0" petgraph = "0.6.2" peg = "0.8.1" lru-cache = "0.1.2" +rayon = "1.6.1" diff --git a/src/bin/day_18.rs b/src/bin/day_18.rs new file mode 100644 index 0000000..badbe58 --- /dev/null +++ b/src/bin/day_18.rs @@ -0,0 +1,129 @@ +use std::{collections::{HashSet, HashMap}, ops::RangeInclusive}; + +use aoc_2022::prelude::*; +use rayon::prelude::*; + +type Coord = (isize, isize, isize); + +type Input = Vec; + +fn parse(s: &str) -> Result { + let mut coords = vec![]; + for line in s.lines() { + let coord = ints(line); + let coord = (coord[0], coord[1], coord[2]); + coords.push(coord); + } + Ok(coords) +} + +#[derive(Clone, Copy, Eq, Hash, PartialEq)] +enum Face { + X, + Y, + Z, +} + +#[aoc(day = 18, parse = parse, test_cases = ["day_18.txt"])] +fn day_18(input: Input) -> Result<()> { + // Part 1 + let mut faces = HashSet::<(Face, Coord)>::new(); + for cube in &input { + let cube_faces = [ + (Face::X, *cube), + (Face::X, (cube.0 + 1, cube.1, cube.2)), + (Face::Y, *cube), + (Face::Y, (cube.0, cube.1 + 1, cube.2)), + (Face::Z, *cube), + (Face::Z, (cube.0, cube.1, cube.2 + 1)), + ]; + for face in cube_faces { + if faces.contains(&face) { + faces.remove(&face); + } else { + faces.insert(face); + } + } + } + println!("Part one: {}", faces.len()); + + // Part 2 + let (x_range, y_range, z_range) = { + let min_x = input.iter().map(|c| c.0).min().unwrap(); + let min_y = input.iter().map(|c| c.1).min().unwrap(); + let min_z = input.iter().map(|c| c.2).min().unwrap(); + let max_x = input.iter().map(|c| c.0).max().unwrap(); + let max_y = input.iter().map(|c| c.1).max().unwrap(); + let max_z = input.iter().map(|c| c.2).max().unwrap(); + (min_x..=max_x, min_y..=max_y, min_z..=max_z) + }; + + let corrected_sa = faces.par_iter().filter(|(face, coord)| { + let other = match face { + Face::X => (coord.0 - 1, coord.1, coord.2), + Face::Y => (coord.0, coord.1 - 1, coord.2), + Face::Z => (coord.0, coord.1, coord.2 - 1), + }; + let mut cache = HashMap::new(); + can_reach_outside(&input, (&x_range, &y_range, &z_range), *coord, &HashSet::new(), &mut cache) + || can_reach_outside(&input, (&x_range, &y_range, &z_range), other, &HashSet::new(), &mut cache) + }).count(); + + println!("Part 2: {corrected_sa}"); + + Ok(()) +} + +fn can_reach_outside( + input: &Input, + (x_range, y_range, z_range): ( + &RangeInclusive, + &RangeInclusive, + &RangeInclusive, + ), + position: Coord, + visited: &HashSet, + cache: &mut HashMap, +) -> bool { + if let Some(result) = cache.get(&position) { + *result + } else { + let result = if x_range.contains(&position.0) && y_range.contains(&position.1) && z_range.contains(&position.2) { + if input.contains(&position) { + false + } else { + let mut visited = visited.clone(); + visited.insert(position); + + const DIRECTIONS: &[(isize, isize, isize)] = &[ + ( 1, 0, 0), + (-1, 0, 0), + ( 0, 1, 0), + ( 0, -1, 0), + ( 0, 0, 1), + ( 0, 0, -1), + ]; + + let mut can_reach = false; + + for direction in DIRECTIONS { + let new_position = (position.0 + direction.0, position.1 + direction.1, position.2 + direction.2); + if visited.contains(&new_position) { + continue; + } + if can_reach_outside(input, (x_range, y_range, z_range), new_position, &visited, cache) { + can_reach = true; + break; + } + } + + can_reach + } + } else { + true + }; + + cache.insert(position, result); + result + } +} diff --git a/test_cases/day_18.txt b/test_cases/day_18.txt new file mode 100644 index 0000000..d18bf98 --- /dev/null +++ b/test_cases/day_18.txt @@ -0,0 +1,13 @@ +2,2,2 +1,2,2 +3,2,2 +2,1,2 +2,3,2 +2,2,1 +2,2,3 +2,2,4 +2,2,6 +1,2,5 +3,2,5 +2,1,5 +2,3,5 \ No newline at end of file