From e630119aef0b5a5ec5d70129fe10dfb8d0a5804a Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 28 Dec 2022 23:25:21 -0500 Subject: [PATCH] first attempts :( --- 2022/Cargo.toml | 3 + 2022/input/day_16.txt | 54 + 2022/input/day_16_sample.txt | 10 + 2022/input/day_17.txt | 1 + 2022/input/day_17_sample.txt | 1 + 2022/input/day_18.txt | 2893 ++++++++++++++++++++++++++++++++++ 2022/input/day_18_sample.txt | 13 + 2022/input/day_19.txt | 30 + 2022/input/day_19_sample.txt | 2 + 2022/src/day_16.rs | 89 ++ 2022/src/day_17.rs | 258 +++ 2022/src/day_18.rs | 201 +++ 2022/src/day_19.rs | 202 +++ 2022/src/lib.rs | 4 + 14 files changed, 3761 insertions(+) create mode 100644 2022/input/day_16.txt create mode 100644 2022/input/day_16_sample.txt create mode 100644 2022/input/day_17.txt create mode 100644 2022/input/day_17_sample.txt create mode 100644 2022/input/day_18.txt create mode 100644 2022/input/day_18_sample.txt create mode 100644 2022/input/day_19.txt create mode 100644 2022/input/day_19_sample.txt create mode 100644 2022/src/day_16.rs create mode 100644 2022/src/day_17.rs create mode 100644 2022/src/day_18.rs create mode 100644 2022/src/day_19.rs diff --git a/2022/Cargo.toml b/2022/Cargo.toml index 44f6d09..74a4af5 100644 --- a/2022/Cargo.toml +++ b/2022/Cargo.toml @@ -3,6 +3,9 @@ name = "advent-of-code-2022" version = "0.1.0" edition = "2021" +[profile.test] +opt-level = 2 + # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] diff --git a/2022/input/day_16.txt b/2022/input/day_16.txt new file mode 100644 index 0000000..5d8278c --- /dev/null +++ b/2022/input/day_16.txt @@ -0,0 +1,54 @@ +Valve VR has flow rate=11; tunnels lead to valves LH, KV, BP +Valve UV has flow rate=0; tunnels lead to valves GH, RO +Valve OH has flow rate=0; tunnels lead to valves AJ, NY +Valve GD has flow rate=0; tunnels lead to valves TX, PW +Valve NS has flow rate=0; tunnels lead to valves AJ, AA +Valve KZ has flow rate=18; tunnels lead to valves KO, VK, PJ +Valve AH has flow rate=0; tunnels lead to valves ZP, DI +Valve SA has flow rate=0; tunnels lead to valves VG, JF +Valve VK has flow rate=0; tunnels lead to valves RO, KZ +Valve GB has flow rate=0; tunnels lead to valves XH, AA +Valve AJ has flow rate=6; tunnels lead to valves IC, OH, ZR, NS, EM +Valve PJ has flow rate=0; tunnels lead to valves KZ, SP +Valve KO has flow rate=0; tunnels lead to valves KZ, LE +Valve AA has flow rate=0; tunnels lead to valves TW, GB, TI, NS, UL +Valve TW has flow rate=0; tunnels lead to valves TU, AA +Valve VG has flow rate=25; tunnel leads to valve SA +Valve BP has flow rate=0; tunnels lead to valves RO, VR +Valve XH has flow rate=0; tunnels lead to valves GB, RI +Valve TX has flow rate=0; tunnels lead to valves RI, GD +Valve IR has flow rate=10; tunnels lead to valves TN, NY, JF +Valve TU has flow rate=0; tunnels lead to valves JD, TW +Valve KC has flow rate=0; tunnels lead to valves SP, RO +Valve LN has flow rate=0; tunnels lead to valves EM, RI +Valve HD has flow rate=0; tunnels lead to valves FE, SC +Valve KE has flow rate=0; tunnels lead to valves OM, RI +Valve VY has flow rate=0; tunnels lead to valves PW, BS +Valve LH has flow rate=0; tunnels lead to valves OM, VR +Valve EM has flow rate=0; tunnels lead to valves AJ, LN +Valve SO has flow rate=22; tunnels lead to valves ZP, FE +Valve EC has flow rate=0; tunnels lead to valves OM, UL +Valve KV has flow rate=0; tunnels lead to valves SP, VR +Valve FE has flow rate=0; tunnels lead to valves SO, HD +Valve TI has flow rate=0; tunnels lead to valves AA, PW +Valve SC has flow rate=14; tunnel leads to valve HD +Valve ZP has flow rate=0; tunnels lead to valves SO, AH +Valve RO has flow rate=19; tunnels lead to valves UV, BP, VK, KC +Valve ZR has flow rate=0; tunnels lead to valves OM, AJ +Valve JL has flow rate=21; tunnels lead to valves GN, TN +Valve PW has flow rate=9; tunnels lead to valves TI, GN, VY, GD, IC +Valve UL has flow rate=0; tunnels lead to valves EC, AA +Valve GN has flow rate=0; tunnels lead to valves JL, PW +Valve TN has flow rate=0; tunnels lead to valves JL, IR +Valve NV has flow rate=0; tunnels lead to valves RI, JD +Valve DI has flow rate=23; tunnels lead to valves LE, AH +Valve IC has flow rate=0; tunnels lead to valves PW, AJ +Valve JF has flow rate=0; tunnels lead to valves SA, IR +Valve LE has flow rate=0; tunnels lead to valves DI, KO +Valve BS has flow rate=0; tunnels lead to valves JD, VY +Valve JD has flow rate=15; tunnels lead to valves NV, TU, BS +Valve SP has flow rate=24; tunnels lead to valves KC, KV, PJ +Valve NY has flow rate=0; tunnels lead to valves IR, OH +Valve OM has flow rate=7; tunnels lead to valves EC, GH, KE, ZR, LH +Valve GH has flow rate=0; tunnels lead to valves OM, UV +Valve RI has flow rate=3; tunnels lead to valves NV, KE, LN, XH, TX diff --git a/2022/input/day_16_sample.txt b/2022/input/day_16_sample.txt new file mode 100644 index 0000000..9f30acc --- /dev/null +++ b/2022/input/day_16_sample.txt @@ -0,0 +1,10 @@ +Valve AA has flow rate=0; tunnels lead to valves DD, II, BB +Valve BB has flow rate=13; tunnels lead to valves CC, AA +Valve CC has flow rate=2; tunnels lead to valves DD, BB +Valve DD has flow rate=20; tunnels lead to valves CC, AA, EE +Valve EE has flow rate=3; tunnels lead to valves FF, DD +Valve FF has flow rate=0; tunnels lead to valves EE, GG +Valve GG has flow rate=0; tunnels lead to valves FF, HH +Valve HH has flow rate=22; tunnel leads to valve GG +Valve II has flow rate=0; tunnels lead to valves AA, JJ +Valve JJ has flow rate=21; tunnel leads to valve II diff --git a/2022/input/day_17.txt b/2022/input/day_17.txt new file mode 100644 index 0000000..f1b70bb --- /dev/null +++ b/2022/input/day_17.txt @@ -0,0 +1 @@ +>>><<>>><<<>>>><<>>><<<<>>>><<<>>>><<<>>><<<<>><<><>><<<>>>><<<<>><<<>><<<<>>><<<<>>><>><<>><<<>>>><<<<>>><<<<>>>><<<><>>>><><<>>>><<><>>>><<<>><<<>>><<<<>><<><<<<>><<><>><<<>><>>>><<<>>>><<>>>><<><<<>><<>>>><>><<<<>>>><>>><<<>><<<<>>>><<>><<<<><<><<<>>><<<<><<>>>><<><<<>><<<<><<<><<>>>><>><<<<>><>>>><<><><>>><>>>><<<><<>>>><<<><<<<>><<<>>><>>><<>>>><>>><<>><<<<>>>><<<>><<>>><<<<><<<>><>>>><<<<>><<<<><>><<<<>>><>>><<<<>>><<<<>>><<<<>>><<<>><<<>>><<<>><>>><<<<><>><<<<>>>><<<<>><<<>>>><<<<>><<<<>><<<<>>>><<<<>><<<>><<<>><<<>><<>>><<>>>><<<>>>><>>>><>><<<>>>><>><<<><<<<><<<>>>><<><<>>><>><>>>><<<>>><<<<>>><>>>><>>><<<><<>>><<<<><<>>>><<<><>><>>>><<<>><<<>><<<><<<<>><>><<<<>>><>>>><<>>><<>><>>>><<<<><>>><>><><>>>><<<><<<>>>><><<<<><<<><<<<>>><<<>><<<<>>><>>><<<<>>><<>><<<>>><<>><<<<><<<<><<<<>><<<>>><<>>>><>><<<<>>><><<>>><<<>>>><>>>><>>><<<<>>><<<<>><<<<><><>><<<<>><<>>>><>>>><<><<>>>><><<<>>><<>>>><<<>>><<<<>><<<<>>>><<<<>><<<><<>>>><<<<>>>><<<>>><<><<<>>><><<<>>>><<<<>>><>>><>>>><<<<>><<<>><<><<<>><>><>><<<><<<>>>><>><><>>>><<>>><<>><>><<<>><><<<<>>>><<>>><<>>><<>><<<>>><<<<>><<<<>>>><>>><<<<>><><<<>>>><<>><>>>><>>>><>>>><>>>><>>><<<<>><><<<<>>>><<<<>><><<<<><>><<>>><>>><<<>><><<>>>><<<>>><<<<>>>><<<>><<<<>>>><<<>>>><<<<>>>><<><<<<>>>><<<><<<>><<<<><<<>>><><<<>><<>><<<>>><<<><<<>>>><<<<>><<<<>><<>><<<<>><>><>>><<<<><>>>><<>><<<><<>><<<<><<><<<<>><>>><>><<<>>><<<>><<<<>>>><<<<>>>><<<>>><<<<>><>>><<>><<<><<<<>>>><<>>>><<<<>><<<<>><<<>>>><<>>>><><><<>><><<<><<<>>><>>><<<<>>>><<<>><<<<>>><<<<>><<<>>><<<<>>>><<><>><<<<><<<<>><<<><<><><><<<<>><<<<>>><<<>><>>>><>>><<<<>>><<<<><<>>><<<<><<>><<<><<<<>><<>>>><>><>><<<>>>><<<<>>><<<><<<>>>><<<><<<>>>><<<>><>>><<>>><<<><<<<>>>><>>>><<<<><<>><<>>><<><>>>><>>><><<>>>><>>><><>><<<>>>><<<><>><<>>>><<<<>>><<><<>>>><>><<>>><<<<><<>>>><<><>>><<<><<><<<<>><<<<>>>><<>><>><<>><>>>><<<>>>><<<<>><><<>>>><<<><<>>><<<>>>><<<>>><<>>>><<<<>>><>>><<<><<>>><><>>><<<>>>><<<<>>><<>>>><<>>><<<<>>>><<<>><><<>><<<>>><<>><<<>>>><<>><<>>><<>>>><<<>>>><<<>>><>>>><<><<<<><<<>>><<<><<<>>><<>>>><>><<<>><<>>>><><>>>><>>><<<>><<<>>>><<>>><<>><><<<>><<<<>><>>><>>>><<<<>><<<>>><<>>><<>>><<<<>>>><<>>>><>>><<<<>>><<<>><<<><<<>><<<<><<>>>><<>><>>><<<>>>><<><<<<>>>><<<>>>><<<><<<>><<<<><<<<><<>>>><<<<>>>><<<><<<<>>><<<<>><<><<<<>>>><>>><<<<>><<>><<<<>>>><<<>><<>>><<<><<<<>>><<>>>><<>>>><<<<>><>>>><<<<><>><>><<>>>><>>>><<<<>>><<<<>>><<<>>>><<<>>><<>>><<<<><><<>>><<><<<<>>><<>><<<>><<>><>><<<><<><<>>><<>>><<>>>><<>><<<><<<<>>><<<>>><<><>>><<<<>><<<<>>><<<>><>><<<<>><<<<>><<<<><>><>>><><>><<<>><>><>><<>><>>>><<<<>>><>><<>><<<<><<<>>>><<<<>>>><<<<><>>>><<<<><<<<>>>><>>>><><>>>><>>><<<<><<<<>>>><<<<><<<<>><<<<><<<<><<<>><<<>>><<>>>><<<<>>><><<>>>><<<><>>>><<<>><<<>>><<<>>>><>>><<<<><>>><>>>><<>>><>><<<<>><>><>><>>>><<<<><<>><<<>>><<<<>><<<<><<<<>><<<>><<>>>><<<>>><<><<><<<<>>>><<<>>>><<<>>><>><<<<>>>><<<<><<<<>>><<><<<<>>>><<<>><>>><>>>><<<>>>><<>>><>>><<<>><<<<>>><<><<<><<<<><<<<>><<<<>>><<>>>><<>><<>><<<<>>>><<<>>><<<<>>>><><<><<<>>>><><<>>><><><<<><<<<><><>>>><<<>>>><<><><<>><<>>><<>>><<<<>>>><<>><<<<>>><<<>>>><<<<>>><<>>>><<<>>>><>>><>>><<<><>><<<<>><<<>>>><<<<>><><<>>>><<<><<>><>><<<<><<><<<>>>><<><<>><<>><<<<>>>><<<>><<>>>><<>>>><<>>><>>><<<<>><<<<>>>><<<<>>>><><<<<>>>><<<>>>><><>>>><<<>>><>>><>>>><>>><<>><<<>><>>><>>><<<<>>><<>>>><<<>><<>>><<><<<<>>><<<><<<<>>>><>><<<>><<<>><>>><<<>>><<<<>>><<>><<<<>>><>>>><><<<>><<<<>>><<>>><<<<>>>><<<>><<<<>>><>><<<<><<<>>><<><<<<>>><<<>>><>>><>>><<>>>><<<<><<<>>>><<<>>>><>>>><<>>>><<<<>>>><<<>>><<<<>><<<<>><>>><<<<>>>><>>><<<>>>><><<<<>>>><<<>><>><<<<><>><>><<<<>>>><>>><<<<>><>><<><>>>><<<>>>><<<><>><<<<>><<><><<<>><<>>><<<>>>><>>><<>>><<<<><>>><<><>>>><<><<>><<<><<>><>>>><>>>><<><<<<>><<>>><<<<>><<<>>><<<<>>><>>>><>>><>>><<<<>>>><<<<>>>><<><>><<<<>>>><<>>><<<<><<>><<<<>>>><>><>><<<>>><>>><<>>>><<<<>><<><<<>>><><<<<><<<>><<<>>>><<<>>><>><<<<><<<<><<<<><>>>><<<<>><<>>><<>>>><<>>><><<<<>>><<>><<<>><<><<>>>><<<<>>>><<<<>>><<><<><<>>>><<>>><>>>><<<<>>>><<<>><<><<<>>><<<<>>><><<<>>>><<<><>>><<<>>>><<<<>>>><<>>><>>><<<<>>><<>><<<>>><>>>><><<>><>>>><<<<>>><>>>><<<><>>><<<<>>><><<<>>>><<<<>><<<<><><<<<>><<<>>>><>>><<>><<><<<<>><>>>><>>><<>>>><<<<>><<<<><<>>>><<>>>><>>>><<>><<<<>>><<<<>>><<><<>>>><>>><<<<>>>><<<>>>><><<<>><<<><>>>><<>><<>>>><<>><<<<>><><<>>>><<>>>><<>>>><<>>>><<<<>>><>><<<>>><<>><<>>>><<>>>><><<<><<<>>><<>><<><>><><<>>><><<<>>>><<><<<<>>>><<<<>><><<<>><>>><<<>>><<><>>>><><>><<<>>>><<>><<>><<>>><>>><<<>>><<<>>>><<<<><<><<<<>>>><<<>>>><<<><<<<>>><<<>>>><<>><<<>><><<<>>>><<<><><<>>><<<<>><<>>><>>><<<<>>><>>><<<>><>>>><<>><<<>><<<<>>><><<><<>>><<>><<<<><<<>>>><<<>>><<>><<<<>>><<<<>><<>>>><><><<<<>>><<<<>>><>>>><<>>><>>>><<<<>><<<<><<<>><>><<<>><>>>><><<<>>>><<<>>><<<>>>><>>><<<<>><>>><<<<>>><<<>><>><<<>>><<><<>>>><<>>><<<><<<<>>>><<>><>><<>><>>>><<<<>>>><<<>>><>><<<>><>><<<>><><<<<>>><<<<><<<<><<>>>><>>>><<>>><>><>><<<>>>><>><<>>>><<<<>><<<<><<<>>>><>>>><<<<>><<<>>>><<>>><<<><<<><<<<>><<<<><><<><<<>><<<<>><<<<>>><<<><>><<<>>><<>>>><><<<<>><<<>>>><<<<>>><<<<>>><>>><<<<>>>><<>><<<<><<<<>><>><<<>>>><>>><>><<<<>>>><<<<>><<>><<<<>>><<>>>><<>><<<>>>><<<<>>><<>>>><>>><>>><<<>><<<>>><>><<<<>><<<>>><>>>><<>>><<<<><<<><>><>><<<<>><<<<>>><><<<><<<>>><>><<<<>><<<<><<<>>><<>>><<<<>><<<>>>><<>>>><<<>>>><<<>><<<>>>><<>><<><<<>>>><<>>>><<><<<<>>>><<<<><<<>><<>>><><<<<>>>><<><<<<>>><<<>>><<<<>><<>>><<<>><<<>>><<<<>>>><<<>>><>>>><<<<><<<>>>><<<<>><>><<<<>>>><<<>><<<><<>>><><><<>>><<<<>>><<<><>>>><<<>>><<<<><<><><<>>>><<<<>><<<>>>><<<>><<><<<<>><<>>>><<<>>><>><>>><<<<>>>><><>><<><<>>>><<<>>><><<<>>>><<<<>><<<>>>><<<<>>>><<<<>><><>>><<<>>>><<<>>><<>><<<>><>><<>>><<<>>>><<>>>><<<<><>><<><<<<><<<><<<><>>>><<<><<<><<<>>>><<<>>>><<<>>><><<>>>><<<>>><<<>>><<<<><<<<>><<<<>><<<><<>>>><<<<><>>>><><<<>>>><<<>>><<<>><>>><<>>><<<>><><>>><<>><<<<>><<<<>><<>>>><><<<<>>><>>><<<>>><<<<>>>><<<<><<<><>><<<<><<<<><<<<><<<<>>>><<><<>>>><<>>><>><<>>><<<>>>><><>>><>><<<>>><<>>><>>>><<>><<>>>><<>><<<>>>><<<>>><<<<>>><<>>>><<<<><<<<>>><<<<>>>><<>><<<>>><<<<>>><>><<<<>><<<>>><<<>>><<<>>>><<<>>><<>><>>>><<<<><<>><<>>>><>>><<<>>>><<<<>>><<<>>><<>>>><<<<>>><<>>><<<<>>>><>>><<<<><<><>>>><<<<>>>><>><<><<<>>>><<>>>><>>>><<<><<<<>>>><<<>>>><<>>><<<<>><<>>><>><>>>><<<<><<<<>>>><<>>><<<>><<>><>><<>><<>>><<>>>><<>><<<>>>><><<><><<<>><<<<><<<>>>><>>><<>>><<<>><>>><<>><<<>>><>>>><<<>>><<>>><<>><>>><<><<<>>>><<<<>>>><<<>>><<>><<><<<>>>><<<<>><>>><<<<><<<<>>>><<<>>><<<>><<<<>>><<<<>>>><<<><<>><<>>>><<><<>><<>>><<<>><<><>>><>>><>><<<>>><<>><<>>>><><<<>>>><<>>>><<>>><>>>><<>>><<<><<>><<<>>>><<<<><<<<><<>>>><<<><>>><<<><<>><<<>>><<<><><<>>><<>>><<<<><>><<>><<<><<>>><<><>>><<<<>>>><>>>><<<<><<><<<>>>><<<>><<>>>><<<><<>>>><>>><<<>>>><<<<>>>><<><<<<>>>><<>>><>>>><<<><<<<><<<<>>><<<>><<<<>><<<>><<><<<>>><<<>>><<<>><<<<><<<<>><<<<>>><<<>><>>><<<<><<>>><>><<>>><<<<>>>><>>><>><<<>>><<>>><<>>>><<<><<>><>><>><<<>>>><>>>><><>><>>><<<>><<<<><<<<>><><<<>><<<>>><<<<><<>><<<<>>><><<><<<>>><<<>><>>>><>>>><<<>>><<<<>><<>>><<<<>><<>><><<<>><<>>><<>>><<<>>><<<<><<<<>>>><>>>><<<<>>><<<<>>><<<<>>><>><<><<>>><<<>><>>><<>>>><<<>>>><<>>><>>>><>><<>>><><<<<>><<<<><<<<><<<>>><<<<>>><<>><<<<>>><<<>>>><><<>><>><>>>><<<<>>><<<<>>>><<<<><<>><<<<>>>><<<>><<<<>>><<<<>>>><>>>><<<>><>>><<<<>>>><<<<><<<<>>>><<>><<<<>>><<<<><<><<<<>><>>><<<>>><<<>>><<<>>><<<>><<<<>>>><<<>>><>>>><<<<>>>><<>>><><<>><>><>><>><>>>><<<<>>>><<<>>>><<<<>><<<<>><<<<>>><<><>>>><>>><<<<>><<<>><<<<>><<>><><><<<>>><>><><<>><>>><<<><>>><>>>><<><<<<>>>><<>><<>><<<><<>>><<>>>><<<<>>><<<>><<>>><<<<><<<>>>><<<<>>>><><>>>><>><<>>><<<<>>><<>><<<>>><<<<>><>>><<>><<><<>><<>>>><<<<><<<<>><<<<>>>><<<<><<<<><><>>>><<>>><><<>>>><<<><>>>><<<<>>><<<<>>>><<<<>><<<>>>><<<<>><<<><<<<>>><<<<>>>><>><>>><<<><><<<>>>><<<<>>><>><>>><<>>><<>><<>>>><>>><<><<><><<>><<<>><>>><>>>><>>><>>><<>>><<<<><>><<><<<>><<<<>>><<<><>>><<>><>><<<<>>><>><<<<>>>><>>>><>>><>><<<><<>>><<>><<<<>>><<<<>><<><<<<><<>><<<><<<><><<<<>><<>><<<<><<<<>><>><<>><>><<<<>>><><><<<<>><<<>><<<>>><<<<>>>><<<><><<<><<><>><<<<>>>><><>><>>>><<><>>>><<>>><>><<>>>><<<>>><>>>><<>>>><<>>><<<><<<<>>>><<<<><<<>>>><<>><<<<>>>><<<><>>>><<<><<<><<<>><<<>><<<>><<<>><<>>>><<<>>><<>><<<<>><<><<>>><<<<><><<<<><>>>><<>><<>>><<<>><<<>>><<<>>>><<<>>>><<<<><<<><<<<>>><<>><<<><<<<>><<<>>>><<<><>>>><>>><<<><>><<<>>>><<<<>><<<<>>><<<<>>><>>><<<>><<<>>>><>>><<><<><<<>><<<>>>><<><<><>>>><<><<<<>>><<<<>>><<<>>>><<>>>><<<><<<<>>><<><<<>>>><<>><<<<>>><><<<<><<>><<<>>><<<>>>><<<<>>><><><<<>>><<<>>>><>>><>>><>>>><<<<>>>><>>><<<<><<><<<>>>><<<<><<<>><>><<<><<<><<>>><<<<>>><<>>><<<><<<<>>><<<<><<<<>><<><<<<>>><<>>>><>><<>>>><<<>>><><>>>><<<<>>><>><<<>>>><<><<>><<>>>><<<<>>>><<<<>>><>>><<<<>>>><<>>>><<<>>><<<<>><<>>>><<>>><>>><<<<>>><<<<>><>>><>>>><><><<>><<<<>>><<<>><<<>>><<>>><<><>>><>>>><<>><<<<>>><<<>>>><<>><>>>><<<<><>>>><<>><<><<<>>>><<<<><<<>>>><<<<>>><<<<>><><>>><><<<<>>><<<><<>>>><<<>>><<>>><<<<>>>><>>><>><>>>><>><<>>>><<<><<>>>><<<<><>><<>>><<>>>><<>><<>>>><>>>><<>>>><<<>>><<<<>>><<<<>>>><<<<>>><<>>>><<>>>><<<>><>>>><<<<>>>><<<<><<><<<<>>>><<<>><>><<>>>><<><><<<<>><<<<>><<<>>>><<<<>><<>>>><<<><<<<>>><>>><<<<><<<>>><<<>>>><<<><>><>><>>>><<<<>>>><<<>><<<<>><<<><<<<>>>><<<>><>>>><<<<>>><<<>>><<>><<<<>>><<<>><<<><>>>><>>><<<<><><><<<<>><<>><<<>>><<<<>><<>>><<>>>><<<>><<<><<>>><<<>>>><<>>><<<<>><<>>>><>><><<<<>><<<<>>>><>>>><<<>>>><<<<><<>>>><>>>><<<><<<>>>><<<>>>><<>><<>><<<>>>><>>><<<>>>><<<<>>><>>><<><<<><<<<>>><<>><<<<>>>><<<<>>>><<>><>><<>>><<<<><>>>><<<>>><<><<<<>>><>>><<>><<<<><<<>>><<<>><<<><<<>><<><>>>><<<><<<><<<>><<>>>><>>>><>><<<<>>>><<>><<<><><<>>>><<>>>><<<>><<<><<<>>>><<<>>><<>><<<>>>><<<<><<<<>><<>>><><<>>>><<<<>><<<<><<<><<<>><<>>>><<<<>>><<<><<<>>>><<<>>>><<>><<<><<<<>>><>>>><<<<><<<<>>><<<<>><<<><<<>>><<>>>><<>>>><<<<>>><<<>>>><<<<><><<<<>>><<<<>><<>><<><<>><<>><<<>><>>>><<<>><>><>><<<<>><><><>><><<<<>>><<<>>>><<>>>><<<>><<><<<>><<<>>>><>>><<<><>>>><>>>><<><>>>><<<>><<<>>><<<<>><<>><<<<>>>><<<>>><<>>>><<>>><<<><<<<><<>>><<<<>>>><<>>>><>><<>>><<<<>>>><<<>>><<>><<>>>><<<>><<>>>><<>>>><<<<>>><><<<>>>><<<<>>>><><<>>><<<>><>>><>>><<<<>>><><<>><<<<><<>>>><>>>><<<>>><<>><>><<<<>>><><<<<><>>><<<><<<>>><<<>>>><>><<<<>>><<<>>><<<>><>><<<<><<>>>><<<<>><>>> diff --git a/2022/input/day_17_sample.txt b/2022/input/day_17_sample.txt new file mode 100644 index 0000000..97a1aa1 --- /dev/null +++ b/2022/input/day_17_sample.txt @@ -0,0 +1 @@ +>>><<><>><<<>><>>><<<>>><<<><<<>><>><<>> diff --git a/2022/input/day_18.txt b/2022/input/day_18.txt new file mode 100644 index 0000000..c7f0ae1 --- /dev/null +++ b/2022/input/day_18.txt @@ -0,0 +1,2893 @@ +19,8,6 +5,10,4 +4,11,15 +1,13,11 +3,15,10 +6,12,5 +16,6,5 +4,5,9 +10,17,6 +19,14,8 +13,17,15 +13,10,3 +17,14,15 +18,9,6 +15,18,10 +8,8,18 +13,17,5 +5,4,12 +9,20,12 +12,5,4 +16,15,12 +20,6,9 +18,10,15 +13,2,12 +3,8,13 +4,11,6 +12,7,2 +7,2,13 +14,12,18 +8,15,10 +15,5,15 +18,13,12 +16,17,15 +13,6,18 +15,12,4 +17,13,17 +3,12,6 +6,20,9 +3,8,11 +16,4,10 +18,12,14 +18,5,12 +15,5,16 +18,15,9 +15,8,4 +6,8,16 +17,5,9 +7,7,4 +11,3,7 +8,14,5 +6,5,16 +7,15,5 +5,17,11 +6,5,9 +20,11,9 +15,13,17 +17,11,16 +11,10,20 +4,11,10 +4,8,15 +6,15,6 +18,8,9 +4,12,18 +11,14,18 +11,12,19 +5,16,16 +19,8,13 +10,18,8 +6,14,17 +11,7,19 +15,7,18 +11,9,1 +14,3,10 +17,15,13 +7,16,15 +15,14,3 +18,7,14 +10,7,17 +9,10,3 +2,15,13 +11,15,3 +3,13,17 +20,12,9 +2,10,12 +7,13,18 +3,13,16 +16,16,14 +8,15,15 +18,14,6 +15,6,15 +4,5,12 +4,14,16 +17,7,15 +8,12,2 +15,8,19 +12,18,14 +8,3,12 +4,7,12 +17,5,8 +4,12,4 +14,4,4 +15,19,6 +14,6,4 +3,7,14 +11,16,18 +5,15,15 +18,14,8 +12,17,15 +6,20,10 +8,19,15 +7,3,15 +11,11,19 +2,11,13 +15,16,17 +13,6,16 +2,12,6 +17,13,14 +12,19,15 +2,10,11 +10,3,16 +15,15,5 +3,10,12 +4,12,5 +16,8,15 +8,18,8 +6,16,8 +5,17,12 +20,10,13 +16,14,15 +10,20,10 +4,10,10 +1,9,8 +16,5,14 +4,12,6 +16,12,16 +3,10,11 +8,7,17 +2,9,9 +7,19,10 +13,6,17 +13,14,3 +13,18,9 +6,14,18 +16,6,7 +8,16,15 +18,6,9 +15,15,17 +4,13,14 +9,17,17 +9,2,9 +5,3,9 +17,12,6 +4,7,17 +3,5,9 +14,10,19 +16,17,8 +6,4,9 +11,13,4 +16,7,12 +16,13,3 +6,5,15 +10,13,2 +3,13,5 +15,13,3 +15,7,17 +9,18,5 +6,13,4 +17,18,9 +9,16,18 +4,8,14 +9,13,3 +2,8,10 +9,15,3 +18,13,6 +8,2,15 +14,4,16 +12,4,8 +16,12,4 +19,16,10 +7,12,3 +6,9,4 +4,14,13 +17,10,17 +4,11,5 +2,8,13 +19,11,12 +18,9,14 +4,4,9 +8,8,17 +10,2,10 +2,10,9 +16,11,18 +10,14,5 +18,5,15 +17,9,7 +15,13,18 +10,12,3 +14,12,19 +6,8,5 +15,1,11 +12,9,19 +12,19,8 +5,4,14 +5,10,18 +6,3,9 +3,11,10 +2,13,14 +18,10,8 +18,6,14 +7,9,4 +4,11,16 +11,17,10 +6,19,9 +7,11,2 +13,9,3 +2,9,12 +8,5,3 +12,3,14 +11,13,19 +12,9,1 +7,14,17 +3,5,7 +18,12,11 +9,6,19 +18,11,5 +10,13,18 +5,12,15 +7,9,18 +6,4,7 +6,18,8 +9,11,20 +14,4,15 +19,9,12 +11,3,16 +16,13,13 +14,5,5 +7,3,10 +8,5,4 +9,17,4 +13,17,7 +5,13,6 +2,15,12 +12,13,3 +5,10,5 +17,14,12 +14,18,14 +4,9,5 +3,4,10 +16,6,4 +6,14,16 +19,12,9 +13,17,17 +19,11,6 +9,5,16 +5,11,17 +15,16,5 +13,5,15 +5,4,11 +17,13,5 +14,14,18 +4,15,7 +11,18,7 +10,17,3 +15,4,14 +13,19,7 +8,13,2 +10,19,11 +7,14,15 +2,14,12 +4,7,15 +4,15,8 +6,4,11 +12,14,2 +3,13,10 +15,5,14 +11,4,11 +10,11,3 +9,17,15 +12,16,4 +8,19,13 +9,14,16 +14,4,5 +9,3,7 +5,12,16 +13,18,15 +19,14,12 +9,5,3 +12,7,18 +6,14,3 +9,5,17 +3,12,11 +1,10,10 +11,15,18 +3,8,10 +11,19,15 +8,4,16 +4,6,9 +11,15,4 +17,15,15 +14,7,17 +17,7,7 +19,10,13 +8,11,18 +9,11,4 +14,17,6 +10,4,15 +5,16,6 +9,5,4 +18,8,14 +16,7,6 +16,11,6 +5,5,13 +3,14,14 +18,8,8 +18,14,5 +7,17,8 +16,11,16 +13,16,5 +6,9,17 +9,13,18 +4,18,9 +12,17,17 +17,6,13 +14,13,19 +11,20,13 +7,5,13 +14,11,3 +7,18,5 +6,16,5 +16,4,11 +15,9,16 +1,7,12 +13,7,17 +14,3,13 +16,4,13 +2,10,14 +11,16,17 +3,8,14 +11,13,18 +11,10,19 +7,6,14 +14,19,14 +13,5,4 +18,10,5 +12,19,12 +14,5,8 +17,6,14 +16,7,4 +13,15,4 +15,11,2 +4,11,4 +10,5,4 +3,13,12 +2,11,8 +8,2,11 +7,5,7 +15,19,9 +10,9,2 +13,17,4 +15,4,12 +15,14,7 +7,9,3 +7,19,11 +13,4,15 +3,13,7 +3,8,8 +17,9,16 +12,16,6 +18,8,12 +5,7,15 +15,12,18 +7,11,18 +13,3,15 +6,5,6 +10,2,9 +2,13,6 +10,21,12 +6,9,19 +12,4,18 +14,1,10 +9,14,2 +15,8,18 +18,6,11 +16,3,10 +13,3,6 +17,14,6 +19,7,8 +3,13,15 +17,6,15 +10,19,6 +15,12,3 +7,9,19 +15,2,11 +8,16,4 +12,12,19 +7,15,17 +9,16,15 +8,15,18 +16,16,15 +14,18,9 +11,4,12 +15,8,5 +6,15,18 +16,5,10 +15,11,4 +7,18,14 +8,12,18 +7,18,6 +15,14,4 +16,9,16 +6,7,14 +2,12,8 +12,18,13 +9,17,6 +7,3,16 +4,12,7 +1,9,10 +7,7,18 +2,12,14 +5,14,16 +8,6,18 +17,11,13 +6,4,10 +14,9,16 +14,2,10 +14,20,12 +19,5,11 +16,6,8 +14,8,19 +17,14,11 +7,8,18 +14,14,16 +13,4,14 +17,6,8 +8,15,4 +5,7,12 +8,5,7 +18,9,16 +12,14,3 +18,11,13 +11,4,5 +5,9,17 +7,15,18 +16,10,4 +14,17,16 +15,18,11 +18,8,6 +18,14,14 +4,5,15 +10,6,2 +18,14,15 +14,3,14 +11,2,9 +17,4,13 +18,11,14 +19,13,7 +19,9,7 +3,14,15 +2,15,9 +6,4,8 +8,18,6 +16,13,5 +6,11,2 +4,11,17 +3,14,11 +18,7,9 +10,3,15 +14,19,7 +4,14,10 +11,17,4 +13,18,11 +12,3,8 +6,6,5 +15,14,12 +17,7,6 +15,7,15 +11,2,16 +16,8,7 +5,16,13 +10,10,3 +2,12,5 +10,6,18 +13,16,4 +14,15,17 +3,6,10 +4,12,9 +18,9,8 +16,4,6 +15,16,7 +7,16,5 +15,4,13 +9,15,18 +10,6,17 +11,4,18 +20,9,7 +12,11,19 +16,16,17 +10,4,16 +13,11,16 +12,4,14 +1,7,10 +11,3,5 +4,16,14 +12,15,18 +3,12,9 +16,7,17 +18,12,8 +12,11,20 +10,15,3 +13,7,16 +18,6,8 +16,17,11 +7,5,15 +9,4,14 +10,5,5 +5,8,17 +15,9,18 +6,18,10 +6,13,16 +16,6,13 +13,2,9 +11,13,2 +2,7,9 +8,19,12 +9,19,13 +12,19,14 +14,17,15 +8,9,2 +13,2,14 +9,19,9 +8,13,3 +11,6,19 +10,14,19 +10,16,16 +15,3,14 +8,5,16 +5,16,11 +2,11,12 +15,5,4 +14,3,5 +8,6,3 +12,4,17 +19,9,13 +16,13,16 +10,11,1 +7,5,5 +6,7,7 +8,6,13 +7,19,13 +5,11,3 +13,6,3 +15,8,17 +20,7,10 +18,7,5 +5,17,13 +7,4,6 +17,16,12 +4,15,9 +19,13,11 +8,7,19 +2,7,10 +2,8,11 +6,5,5 +11,2,15 +6,10,18 +9,2,8 +6,4,15 +13,5,5 +12,19,13 +16,5,6 +15,17,8 +4,7,13 +12,3,15 +19,14,13 +16,15,13 +12,6,3 +19,7,9 +10,18,14 +15,11,3 +8,17,10 +13,7,2 +17,11,10 +11,9,19 +12,13,19 +13,18,13 +10,14,1 +18,10,14 +4,8,16 +19,10,6 +9,18,7 +11,19,6 +10,1,9 +11,16,4 +18,11,15 +3,14,8 +11,7,4 +9,17,14 +5,13,15 +4,10,15 +18,6,13 +4,5,6 +2,12,13 +17,4,8 +10,7,2 +15,16,6 +8,16,18 +15,15,14 +16,5,16 +7,6,5 +11,3,17 +17,6,6 +9,10,2 +16,7,13 +1,12,10 +14,18,11 +8,17,17 +10,19,14 +4,6,8 +3,6,9 +17,6,9 +11,8,3 +15,10,2 +9,4,13 +13,11,19 +14,18,12 +13,13,19 +13,4,13 +10,18,15 +4,12,17 +12,15,3 +9,8,2 +6,4,16 +10,5,19 +6,15,16 +5,5,9 +6,10,17 +14,18,10 +12,14,18 +2,11,10 +11,16,6 +12,8,2 +8,6,5 +3,8,7 +3,12,14 +19,11,14 +16,8,16 +12,20,9 +9,12,3 +10,8,3 +2,11,14 +7,7,16 +14,18,16 +5,4,7 +9,14,17 +12,19,11 +9,18,12 +8,5,5 +6,18,9 +13,2,8 +2,12,12 +10,5,17 +3,9,12 +16,6,15 +12,2,9 +14,14,19 +11,18,16 +17,16,13 +2,7,7 +7,9,1 +6,7,5 +16,4,12 +18,15,12 +8,13,18 +16,16,5 +9,14,18 +17,3,9 +11,11,1 +18,12,7 +3,14,12 +6,12,17 +12,1,11 +14,4,9 +13,20,12 +16,8,3 +7,18,10 +13,11,3 +2,8,14 +13,18,8 +1,14,10 +19,15,10 +16,3,11 +17,17,14 +13,8,18 +18,12,13 +10,9,18 +4,5,13 +9,19,10 +13,18,5 +8,6,19 +9,14,3 +5,16,7 +8,14,3 +15,14,6 +4,10,5 +12,2,10 +8,19,11 +20,12,10 +14,15,4 +19,14,9 +14,7,19 +12,3,9 +14,10,18 +10,10,18 +14,7,3 +10,8,4 +19,11,10 +14,16,16 +9,7,18 +8,9,20 +12,3,6 +10,1,10 +9,9,1 +13,5,19 +7,15,14 +10,18,5 +4,10,16 +9,6,3 +11,4,4 +5,5,10 +13,5,17 +8,12,3 +17,4,12 +10,9,19 +15,7,3 +2,7,13 +5,17,9 +7,5,18 +3,16,8 +17,18,10 +14,6,16 +15,15,6 +16,5,17 +17,15,6 +14,1,12 +9,4,6 +6,11,18 +9,4,4 +12,8,1 +4,6,6 +12,17,4 +13,13,3 +5,15,16 +10,7,19 +7,6,6 +4,15,5 +7,12,1 +14,3,15 +17,13,3 +19,6,11 +14,17,13 +5,13,4 +7,18,12 +4,14,7 +6,10,16 +18,16,14 +2,12,9 +11,12,2 +6,6,16 +15,3,8 +10,5,3 +2,16,11 +12,4,12 +8,14,4 +1,8,9 +19,14,7 +4,13,9 +11,5,15 +14,6,18 +5,15,12 +1,12,9 +5,12,17 +13,9,18 +5,6,8 +7,11,3 +2,8,9 +7,4,10 +8,1,11 +16,12,5 +11,6,5 +2,13,9 +10,19,10 +14,19,8 +8,10,2 +11,2,14 +9,12,17 +13,4,7 +3,10,14 +18,14,16 +5,6,14 +16,9,3 +11,1,8 +7,15,16 +15,7,4 +16,5,7 +13,19,10 +12,13,18 +2,9,13 +11,9,3 +17,16,14 +3,14,10 +6,4,13 +13,19,12 +3,13,14 +9,13,19 +17,8,6 +10,2,6 +5,7,5 +13,12,4 +7,12,5 +12,3,13 +14,9,4 +3,7,7 +5,4,9 +15,2,9 +5,4,13 +18,15,7 +10,13,19 +3,14,6 +8,4,17 +9,5,5 +16,6,6 +9,14,5 +18,12,10 +8,13,19 +3,12,10 +3,15,9 +18,13,9 +8,4,5 +19,9,6 +18,13,15 +2,13,10 +18,13,14 +3,10,13 +8,2,9 +5,3,8 +16,15,15 +17,5,12 +6,14,7 +12,3,5 +4,15,13 +10,11,19 +19,13,6 +12,18,15 +15,17,11 +18,13,8 +11,2,11 +11,17,13 +7,5,11 +16,12,2 +2,8,16 +12,16,18 +11,13,20 +5,11,18 +3,10,17 +16,9,17 +10,10,19 +2,7,14 +4,15,15 +14,19,10 +18,15,8 +10,4,14 +7,18,11 +11,7,3 +8,19,8 +5,16,8 +16,3,13 +8,2,10 +16,15,10 +13,19,6 +15,16,13 +8,3,11 +19,15,11 +7,16,4 +2,11,11 +10,17,7 +18,14,11 +18,16,10 +18,16,11 +6,14,6 +8,18,15 +13,17,16 +10,14,17 +20,10,12 +15,8,16 +13,18,12 +16,16,11 +9,16,6 +10,4,4 +14,18,5 +12,11,2 +11,14,19 +5,14,5 +15,12,17 +14,6,6 +9,1,9 +17,5,7 +17,12,8 +4,5,11 +17,15,8 +18,13,7 +17,5,6 +9,1,10 +16,4,14 +8,3,15 +18,6,10 +2,12,11 +2,16,10 +17,14,5 +9,17,7 +4,6,10 +10,1,8 +4,8,2 +14,18,15 +8,18,7 +10,2,11 +15,15,13 +5,15,14 +17,15,12 +7,14,16 +17,4,11 +15,11,16 +13,5,6 +7,18,8 +5,10,13 +2,11,9 +4,10,4 +4,6,11 +19,8,8 +8,10,3 +7,10,2 +9,15,16 +11,1,9 +8,14,17 +12,5,7 +16,17,7 +17,17,8 +5,14,15 +5,4,8 +17,16,10 +6,16,7 +10,20,12 +19,8,9 +17,9,4 +18,11,8 +5,16,9 +12,16,17 +16,15,8 +13,4,16 +8,14,18 +3,17,12 +18,10,13 +10,2,14 +17,7,16 +10,6,4 +16,5,11 +18,8,16 +15,18,15 +6,17,5 +18,15,11 +13,3,13 +7,6,4 +4,9,4 +12,19,10 +4,6,15 +5,3,11 +4,13,6 +12,16,3 +6,8,4 +15,12,16 +17,7,14 +15,8,12 +17,13,6 +11,19,11 +4,16,11 +15,6,6 +13,2,7 +16,18,10 +4,8,11 +13,7,18 +4,6,7 +7,2,11 +17,10,15 +4,13,5 +14,9,18 +10,6,3 +13,14,17 +14,2,8 +14,18,13 +20,8,8 +16,12,3 +7,3,11 +11,15,2 +16,15,6 +8,4,8 +10,9,1 +2,14,13 +8,2,8 +7,6,15 +19,7,10 +13,16,16 +4,9,16 +12,2,11 +15,6,8 +14,19,11 +15,7,19 +7,18,13 +5,13,17 +17,10,7 +10,16,18 +10,7,4 +9,12,4 +16,10,3 +16,5,5 +18,13,5 +6,5,13 +8,3,8 +13,18,10 +16,15,9 +7,3,12 +5,15,18 +6,17,16 +14,5,4 +17,6,10 +6,11,3 +3,7,11 +9,12,20 +12,2,8 +11,16,16 +8,12,19 +3,15,8 +5,5,7 +17,16,8 +14,12,2 +15,5,5 +19,12,8 +18,9,13 +4,13,17 +16,14,5 +15,5,9 +9,3,15 +16,12,17 +10,17,4 +4,17,11 +7,2,6 +8,20,13 +6,17,14 +16,10,5 +4,15,10 +2,14,11 +4,16,6 +19,9,10 +12,15,16 +19,11,11 +6,10,2 +5,15,5 +11,2,13 +10,12,17 +6,8,17 +12,3,10 +13,5,16 +3,15,5 +14,19,9 +15,17,15 +17,15,14 +9,18,15 +3,11,14 +14,9,2 +9,17,16 +6,13,3 +4,11,11 +19,8,11 +13,2,11 +7,8,16 +4,14,14 +9,18,9 +7,6,3 +14,3,9 +4,10,6 +6,17,6 +8,16,17 +7,2,14 +16,3,9 +2,15,10 +17,8,11 +1,10,11 +11,7,1 +9,11,17 +12,3,12 +11,8,18 +10,2,7 +2,9,8 +2,13,7 +6,7,18 +10,13,3 +9,18,13 +3,16,12 +16,6,9 +9,16,16 +4,11,8 +11,14,16 +11,1,12 +17,3,11 +8,2,6 +7,14,18 +6,18,12 +8,8,3 +3,6,14 +2,9,11 +14,9,17 +8,2,7 +14,3,7 +15,14,17 +7,18,7 +19,7,13 +14,8,18 +7,4,11 +14,10,2 +3,7,10 +3,4,8 +17,7,13 +5,12,13 +16,6,3 +6,2,10 +15,12,19 +18,15,14 +15,17,7 +15,10,16 +14,17,4 +10,7,18 +15,3,12 +17,10,11 +12,18,9 +10,16,4 +13,15,17 +11,16,19 +3,6,12 +10,5,16 +15,6,4 +13,8,3 +3,11,5 +15,6,16 +9,9,20 +11,5,12 +16,16,9 +5,15,11 +3,9,15 +7,17,16 +11,9,17 +18,8,13 +18,7,7 +12,19,9 +4,8,6 +17,13,16 +13,7,3 +6,4,5 +17,13,18 +13,9,2 +11,18,6 +18,8,10 +6,11,19 +3,10,15 +17,14,7 +3,12,8 +11,8,2 +6,15,4 +1,8,12 +11,17,16 +17,3,12 +5,16,12 +15,17,16 +14,13,2 +6,3,11 +17,13,15 +1,12,11 +3,8,15 +12,2,12 +12,18,5 +14,8,2 +11,8,5 +3,7,12 +2,11,6 +2,11,15 +17,6,7 +15,14,11 +6,3,15 +16,14,16 +2,8,8 +17,8,12 +12,4,5 +15,6,5 +8,17,7 +10,4,5 +4,8,4 +14,12,4 +4,5,8 +19,10,10 +14,5,17 +7,5,17 +16,5,13 +10,19,12 +4,10,13 +7,13,17 +4,7,8 +12,4,15 +16,16,7 +7,12,4 +4,8,7 +9,19,12 +3,15,11 +13,16,15 +9,3,6 +5,14,11 +8,17,13 +17,12,5 +15,16,14 +18,12,17 +8,7,16 +16,16,6 +8,10,18 +12,8,19 +15,15,16 +17,13,13 +17,9,18 +12,18,7 +12,14,16 +7,17,11 +6,12,4 +19,15,14 +16,18,9 +10,17,16 +3,6,11 +18,10,12 +12,6,4 +10,5,6 +15,17,4 +17,6,11 +17,10,13 +14,17,5 +9,12,2 +12,18,4 +14,15,6 +16,4,7 +5,7,7 +5,11,2 +5,19,12 +12,10,19 +15,5,7 +10,4,17 +12,2,13 +11,2,6 +18,7,11 +12,7,4 +13,10,19 +3,12,4 +14,15,5 +3,10,7 +5,15,17 +5,8,4 +19,8,14 +10,19,15 +12,4,16 +18,12,9 +8,7,3 +14,14,4 +3,7,8 +7,15,4 +9,11,3 +18,12,6 +19,12,10 +4,16,8 +17,8,15 +12,18,6 +9,6,2 +7,4,16 +6,12,19 +17,7,5 +7,3,9 +15,14,5 +6,8,3 +7,4,7 +3,8,9 +18,8,15 +16,13,9 +16,16,8 +8,1,9 +10,3,7 +12,6,17 +9,19,7 +9,16,3 +5,7,6 +6,5,8 +3,9,14 +14,5,7 +7,3,8 +16,19,14 +6,3,13 +18,16,9 +6,18,13 +17,12,15 +12,10,2 +16,10,14 +3,15,14 +10,14,18 +15,9,3 +10,19,9 +9,17,5 +13,11,18 +12,9,18 +16,4,9 +9,20,10 +16,12,6 +9,9,2 +7,9,20 +8,18,11 +12,1,12 +6,17,13 +3,10,8 +15,3,9 +15,10,3 +7,14,4 +3,7,6 +3,17,9 +3,6,8 +7,17,6 +7,13,3 +8,12,17 +7,17,7 +11,19,8 +12,17,14 +7,8,17 +18,5,8 +17,14,16 +5,6,5 +5,16,14 +14,13,17 +17,9,17 +13,17,14 +19,8,7 +13,15,6 +11,4,17 +15,18,12 +6,6,15 +12,13,2 +10,17,5 +19,7,14 +17,9,6 +14,19,12 +8,6,2 +5,13,16 +14,17,14 +15,13,5 +14,13,18 +5,12,5 +11,14,3 +17,5,11 +18,8,7 +12,15,4 +16,15,5 +17,8,7 +1,13,10 +9,14,4 +4,9,11 +13,5,8 +6,16,6 +13,15,5 +10,8,19 +19,13,8 +2,14,6 +11,4,6 +4,15,6 +6,4,12 +17,17,10 +17,10,16 +18,12,12 +14,7,20 +4,12,16 +15,9,5 +5,4,6 +7,14,3 +9,3,10 +9,3,9 +12,5,18 +11,13,3 +2,11,7 +19,15,9 +3,12,12 +12,8,20 +5,7,17 +8,1,12 +18,7,8 +7,9,16 +8,17,5 +19,13,13 +7,17,14 +17,13,7 +16,5,12 +13,4,9 +4,13,16 +3,6,7 +6,15,5 +2,6,12 +7,17,10 +6,18,7 +15,9,2 +17,10,8 +16,18,12 +12,4,6 +17,7,4 +8,4,9 +6,4,14 +11,2,12 +19,6,14 +3,16,11 +11,18,5 +8,9,18 +7,5,4 +4,8,17 +6,4,6 +8,2,12 +16,9,18 +6,15,7 +8,16,5 +9,19,14 +17,4,10 +19,12,14 +6,5,4 +6,7,3 +4,7,9 +9,16,17 +7,4,8 +6,7,6 +11,2,7 +7,8,3 +17,10,10 +14,16,15 +4,5,16 +19,13,12 +6,3,6 +6,16,16 +14,11,4 +16,3,15 +5,10,17 +14,3,12 +18,10,7 +15,10,19 +11,19,12 +2,13,8 +6,7,17 +17,15,7 +6,17,11 +17,11,4 +17,16,7 +21,12,10 +10,3,10 +12,3,4 +19,14,10 +9,11,16 +11,5,4 +9,7,2 +10,3,6 +7,4,15 +5,11,5 +10,20,13 +15,17,14 +8,9,17 +8,10,19 +13,4,6 +11,15,17 +7,17,5 +18,17,10 +4,8,18 +5,9,3 +13,3,12 +6,5,7 +3,6,6 +18,9,9 +18,7,12 +12,11,17 +13,12,3 +18,16,8 +13,4,11 +6,8,14 +8,8,4 +10,19,13 +2,10,13 +19,10,12 +11,6,18 +19,6,7 +9,18,6 +10,16,17 +8,17,3 +6,6,4 +4,9,13 +2,8,6 +4,14,9 +16,2,11 +17,6,17 +3,9,7 +11,17,9 +2,12,10 +12,6,2 +12,18,11 +16,13,15 +19,16,12 +9,3,14 +9,7,3 +17,5,10 +6,10,19 +15,16,12 +6,11,1 +15,17,13 +2,7,12 +18,14,7 +10,15,2 +6,9,3 +12,5,15 +19,13,9 +5,9,4 +17,13,4 +15,9,6 +19,11,8 +6,10,4 +5,13,8 +12,11,3 +8,17,14 +10,17,15 +5,4,10 +9,4,16 +13,3,7 +16,9,4 +15,17,6 +7,12,18 +3,7,13 +20,11,7 +12,4,4 +9,4,17 +5,6,9 +5,5,6 +5,16,17 +5,2,11 +16,11,14 +3,13,6 +6,3,14 +14,15,18 +4,5,10 +7,3,7 +11,5,16 +3,10,16 +15,19,13 +16,6,14 +11,1,11 +19,10,11 +20,12,13 +8,7,2 +11,17,5 +5,3,12 +13,7,19 +18,14,13 +17,17,11 +18,5,9 +3,13,9 +16,3,8 +16,19,10 +3,8,6 +14,15,12 +2,12,15 +17,15,11 +4,14,6 +4,6,14 +7,6,17 +15,7,5 +17,12,4 +11,7,18 +16,14,17 +13,12,17 +7,4,5 +13,4,10 +10,14,3 +11,6,3 +8,11,20 +17,10,4 +11,17,7 +5,16,10 +9,7,17 +12,7,19 +19,8,12 +8,20,8 +14,17,8 +12,1,8 +13,12,2 +17,17,12 +15,13,4 +8,11,3 +8,19,7 +14,13,16 +15,5,12 +4,8,12 +16,4,8 +18,11,16 +16,9,5 +9,16,2 +13,10,4 +5,6,6 +8,9,19 +15,18,8 +3,9,6 +6,9,18 +16,7,7 +13,1,11 +15,18,7 +12,12,18 +9,7,4 +18,6,6 +10,18,12 +5,15,6 +5,10,2 +2,7,11 +6,18,14 +19,15,8 +7,16,17 +7,5,6 +3,14,7 +6,18,6 +18,5,11 +16,6,12 +7,14,2 +3,13,11 +15,13,2 +15,4,8 +17,7,12 +3,9,8 +16,11,2 +13,3,16 +10,15,4 +1,10,12 +11,17,8 +10,11,2 +18,10,6 +20,9,12 +10,14,16 +12,14,4 +18,14,12 +13,13,1 +14,2,7 +16,16,13 +6,9,5 +10,17,12 +9,10,19 +9,12,19 +11,5,18 +5,18,8 +9,9,18 +13,3,5 +8,17,16 +14,6,3 +11,1,10 +15,19,8 +10,4,3 +12,20,10 +6,3,8 +15,10,18 +11,12,3 +11,5,6 +15,4,4 +7,10,18 +14,6,7 +14,19,15 +6,15,9 +5,9,6 +2,9,7 +10,1,7 +6,12,16 +9,18,14 +12,6,5 +19,11,5 +18,4,12 +20,11,11 +16,5,8 +17,8,5 +9,2,12 +14,16,14 +4,7,4 +4,14,5 +11,18,18 +7,17,17 +6,6,6 +7,2,9 +18,16,12 +15,19,12 +4,10,3 +6,14,9 +11,0,12 +13,4,5 +5,6,16 +10,12,19 +17,10,14 +8,15,3 +5,3,10 +11,9,4 +17,8,13 +2,15,11 +18,16,13 +15,18,13 +15,2,8 +17,14,13 +11,19,9 +10,2,15 +5,18,13 +9,11,19 +6,16,17 +16,7,3 +13,6,4 +7,4,4 +15,17,12 +14,6,17 +5,11,4 +17,14,14 +9,8,18 +7,18,9 +10,18,16 +17,10,6 +6,13,14 +18,13,13 +14,10,4 +16,17,12 +18,4,9 +10,12,18 +13,14,16 +5,3,13 +4,17,13 +5,15,4 +15,12,5 +15,10,6 +4,7,14 +2,9,10 +3,7,9 +14,9,15 +13,18,4 +6,6,12 +15,18,6 +18,9,10 +11,11,20 +17,7,8 +5,17,7 +8,3,5 +3,9,16 +16,14,13 +6,7,2 +11,18,14 +6,17,15 +17,6,5 +9,10,18 +16,18,15 +12,17,7 +15,10,5 +17,18,11 +7,17,15 +14,10,3 +7,12,2 +15,16,11 +3,5,8 +11,14,4 +17,11,9 +13,8,2 +11,18,9 +18,15,10 +10,3,13 +13,18,6 +7,6,18 +5,7,4 +17,8,9 +4,9,18 +9,8,20 +13,9,19 +5,6,17 +11,20,11 +17,17,13 +15,5,17 +5,5,14 +1,12,13 +7,10,4 +9,3,11 +4,9,7 +5,3,14 +8,6,6 +17,7,10 +19,12,13 +4,9,9 +2,13,11 +11,4,7 +5,11,16 +4,4,8 +14,9,3 +15,5,6 +9,4,7 +13,11,20 +18,7,10 +3,12,15 +15,4,9 +17,8,16 +14,7,4 +2,6,11 +2,13,13 +20,10,14 +3,11,12 +3,9,11 +6,12,18 +20,11,10 +1,11,10 +6,15,11 +11,4,3 +14,14,17 +11,19,7 +3,12,7 +2,10,10 +9,2,14 +6,7,4 +17,6,12 +19,9,9 +11,20,7 +8,5,8 +8,1,10 +2,12,7 +7,13,4 +13,5,7 +15,9,14 +15,19,10 +5,14,17 +10,9,20 +15,18,14 +4,8,3 +10,11,4 +20,10,11 +8,5,13 +3,14,9 +17,15,16 +11,5,5 +2,10,7 +9,19,6 +1,11,11 +16,15,11 +18,7,13 +7,16,3 +14,17,9 +5,8,16 +9,11,1 +10,11,20 +5,5,8 +7,20,14 +13,2,13 +14,4,14 +3,10,4 +9,1,13 +13,9,4 +11,18,15 +16,17,10 +12,10,1 +6,3,5 +3,9,13 +11,2,10 +6,5,17 +17,16,6 +13,14,19 +13,14,15 +8,18,16 +17,5,15 +10,11,18 +18,10,9 +12,9,3 +15,4,15 +4,11,3 +8,16,7 +5,7,14 +14,18,8 +18,5,10 +8,14,19 +10,5,18 +4,13,12 +10,17,17 +14,2,11 +3,9,5 +5,8,15 +16,7,5 +8,4,7 +6,6,17 +14,16,4 +18,12,15 +9,18,10 +19,10,7 +15,4,7 +7,4,17 +10,2,12 +19,11,15 +9,10,20 +19,7,11 +9,15,17 +11,19,14 +10,19,7 +10,18,6 +6,12,6 +2,16,12 +16,7,9 +18,7,15 +14,16,7 +6,17,7 +15,3,15 +18,12,16 +7,2,12 +7,7,3 +5,12,19 +13,1,14 +9,19,11 +9,6,4 +4,11,7 +16,14,3 +14,6,14 +8,18,12 +20,11,13 +16,8,4 +6,6,14 +17,7,11 +13,14,18 +10,3,17 +15,19,14 +12,18,3 +12,5,19 +13,16,3 +18,6,12 +18,10,17 +15,3,11 +9,3,13 +10,15,19 +7,13,6 +19,11,13 +12,18,8 +5,10,3 +9,17,10 +16,13,4 +11,20,6 +16,9,15 +15,14,15 +14,11,2 +12,7,17 +13,11,2 +17,10,18 +7,3,13 +13,8,6 +9,11,2 +19,11,16 +6,3,10 +13,15,13 +7,16,6 +12,16,19 +16,8,5 +20,12,14 +9,19,16 +4,4,12 +16,8,17 +9,7,19 +16,18,14 +5,13,18 +5,2,10 +17,11,5 +17,9,3 +6,15,17 +7,10,19 +8,18,13 +13,17,8 +8,6,17 +13,5,3 +4,6,13 +13,12,1 +15,16,15 +17,12,14 +11,4,16 +14,3,11 +5,5,16 +6,17,9 +8,7,5 +10,18,13 +12,17,9 +8,20,12 +8,7,4 +7,11,1 +12,17,16 +2,8,7 +14,17,10 +4,17,9 +13,19,13 +16,16,16 +5,8,18 +10,19,8 +17,9,15 +14,16,18 +9,3,8 +16,6,16 +7,10,17 +5,14,12 +6,16,12 +11,17,15 +12,14,19 +4,4,11 +12,7,3 +9,7,16 +15,19,15 +13,11,17 +16,7,14 +16,11,4 +13,18,14 +3,11,13 +7,16,18 +3,15,7 +14,4,7 +8,18,14 +15,8,3 +10,10,20 +5,18,11 +19,6,10 +13,14,1 +18,9,15 +12,12,4 +6,11,4 +16,8,8 +14,6,5 +16,7,15 +12,12,17 +1,11,12 +8,15,5 +3,10,10 +7,19,12 +15,19,11 +20,11,12 +17,11,17 +18,10,16 +14,8,4 +10,12,2 +15,17,9 +11,18,13 +16,15,14 +16,18,7 +14,16,5 +6,14,5 +5,12,6 +6,18,11 +17,15,10 +12,3,7 +6,15,3 +13,13,2 +12,5,6 +16,18,8 +20,10,10 +4,7,5 +9,3,5 +16,11,17 +7,19,7 +4,15,14 +3,9,9 +7,4,13 +20,7,8 +3,8,5 +10,16,5 +9,2,5 +14,10,6 +11,3,8 +18,14,10 +3,11,7 +3,10,6 +9,15,2 +17,9,5 +12,15,17 +11,14,2 +13,7,14 +16,3,12 +8,18,10 +12,5,16 +11,4,13 +4,16,9 +4,17,10 +11,18,8 +10,4,9 +5,14,4 +3,13,13 +17,16,5 +4,14,4 +7,20,9 +6,10,3 +18,13,16 +7,5,16 +8,3,10 +7,6,13 +10,14,2 +4,6,12 +17,8,14 +10,7,15 +12,12,2 +7,8,1 +15,11,6 +13,4,17 +9,6,16 +3,12,13 +5,19,14 +9,17,13 +12,5,3 +15,3,6 +9,8,1 +4,5,14 +16,18,13 +12,15,19 +10,10,2 +9,5,19 +11,11,2 +5,5,12 +14,13,3 +13,6,19 +14,20,8 +5,9,2 +4,15,16 +13,18,7 +13,12,20 +16,12,18 +13,16,14 +6,10,6 +6,19,10 +8,5,15 +5,7,10 +7,13,2 +12,4,9 +13,16,17 +9,11,18 +7,9,17 +17,14,8 +17,13,8 +15,16,4 +2,9,14 +9,2,11 +6,16,15 +3,16,9 +11,4,15 +5,13,5 +5,6,13 +15,15,7 +6,15,12 +10,8,1 +20,10,9 +10,10,21 +14,5,16 +9,12,1 +5,14,18 +4,14,11 +13,11,4 +4,15,11 +8,11,19 +14,3,8 +17,12,17 +15,6,17 +4,7,6 +16,5,9 +1,10,9 +3,7,15 +19,10,15 +8,2,14 +16,9,6 +5,10,15 +12,8,4 +19,10,14 +13,10,1 +13,7,4 +5,14,13 +7,11,17 +13,5,18 +9,16,13 +19,8,10 +4,18,11 +12,20,12 +9,2,16 +16,16,12 +18,11,6 +8,9,3 +9,6,18 +11,15,5 +12,9,2 +9,19,8 +13,16,7 +10,12,1 +7,16,16 +7,4,9 +3,12,16 +13,8,19 +9,8,3 +14,12,3 +11,3,14 +15,6,12 +15,4,5 +10,3,5 +14,14,3 +10,20,7 +16,7,16 +6,13,19 +10,8,2 +14,2,13 +4,8,5 +8,13,17 +13,13,4 +16,12,7 +7,15,3 +19,11,9 +5,17,14 +8,15,19 +11,16,15 +5,5,15 +18,8,5 +15,17,5 +13,6,6 +10,17,14 +8,4,13 +11,10,18 +16,10,6 +5,9,16 +6,15,15 +10,4,6 +3,13,8 +3,15,12 +7,10,3 +18,13,10 +5,9,5 +8,4,14 +12,4,11 +12,17,13 +19,9,8 +15,10,4 +13,10,2 +7,16,12 +18,5,14 +13,19,9 +9,18,11 +20,14,11 +13,7,5 +20,12,12 +15,9,4 +10,3,11 +12,1,13 +8,3,16 +11,12,18 +17,5,5 +6,3,12 +10,18,10 +9,1,12 +19,7,7 +9,18,16 +2,10,15 +8,17,15 +6,16,13 +18,11,9 +7,6,9 +15,4,6 +5,7,3 +3,14,13 +10,16,7 +6,12,3 +11,7,2 +12,6,18 +3,10,9 +8,6,4 +11,6,17 +7,19,6 +8,4,15 +19,13,10 +9,16,19 +17,16,11 +20,9,9 +16,6,10 +14,4,6 +5,12,3 +7,13,19 +2,14,9 +7,16,8 +19,14,6 +18,14,9 +8,14,2 +18,11,10 +11,18,10 +5,7,16 +2,15,8 +17,3,10 +3,6,13 +12,17,18 +8,8,1 +7,6,16 +16,12,15 +13,5,13 +5,9,18 +2,9,15 +8,16,16 +8,4,6 +5,8,8 +7,3,14 +12,12,3 +17,5,16 +4,8,8 +17,8,17 +4,14,18 +5,16,15 +8,3,9 +13,5,11 +19,15,13 +4,16,7 +9,14,19 +9,20,11 +6,2,12 +17,11,15 +6,17,8 +14,4,13 +15,2,10 +13,8,1 +4,10,9 +15,16,8 +3,11,8 +18,15,13 +5,18,12 +15,5,13 +5,10,7 +2,13,12 +4,15,12 +12,17,8 +1,10,7 +12,2,14 +14,7,5 +17,4,14 +10,3,12 +19,12,7 +15,9,17 +11,6,4 +13,2,15 +13,9,16 +13,6,14 +5,12,4 +6,14,4 +15,5,8 +10,20,11 +9,9,3 +14,6,15 +4,3,10 +2,14,10 +7,17,4 +9,13,2 +4,6,5 +18,12,5 +10,1,13 +4,10,17 +5,5,17 +15,3,10 +11,19,13 +15,15,11 +10,18,11 +8,8,19 +5,10,16 +10,14,20 +5,15,13 +6,2,9 +7,2,10 +5,17,5 +3,11,15 +10,16,19 +6,18,5 +9,2,7 +16,8,13 +12,8,18 +17,15,9 +14,19,13 +9,15,12 +4,4,10 +5,4,5 +8,1,14 +9,9,19 +4,16,16 +9,4,3 +10,5,15 +12,3,11 +15,16,9 +4,4,13 +12,17,10 +19,6,8 +15,2,12 +12,10,20 +11,13,17 +11,20,8 +9,4,11 +12,18,12 +17,11,7 +11,17,6 +6,9,16 +8,15,6 +14,17,12 +1,9,11 +14,8,17 +11,3,18 +4,8,10 +7,4,14 +4,12,15 +9,1,11 +4,16,12 +14,7,16 +13,3,11 +7,8,19 +3,15,15 +14,8,3 +2,7,8 +8,3,7 +2,12,16 +11,6,2 +4,16,13 +4,16,10 +6,19,14 +5,13,14 +4,14,12 +7,16,7 +4,13,13 +9,4,5 +6,12,15 +16,13,17 +16,14,14 +13,17,12 +14,16,17 +12,13,4 +16,15,7 +10,2,16 +10,4,18 +15,15,3 +20,12,8 +15,11,18 +10,21,10 +4,10,19 +7,11,4 +7,17,13 +10,1,12 +11,17,17 +14,4,12 +14,11,18 +6,13,17 +5,18,6 +15,20,10 +6,6,11 +14,11,19 +4,7,16 +15,16,10 +14,15,15 +6,5,10 +19,5,8 +5,7,9 +9,6,17 +7,5,14 +16,15,4 +15,5,3 +19,10,9 +4,7,10 +12,14,5 +6,8,18 +11,3,10 +15,7,6 +17,9,8 +20,13,10 +13,1,8 +3,11,6 +5,14,7 +9,5,15 +12,5,17 +8,1,13 +9,16,8 +14,2,12 +7,15,15 +11,4,14 +5,3,7 +11,18,12 +14,16,13 +17,11,3 +4,4,6 +7,11,5 +2,14,8 +8,2,16 +19,6,12 +7,5,3 +11,5,2 +9,13,1 +11,21,11 +11,16,3 +6,8,2 +13,10,17 +10,12,5 +4,12,8 +12,6,7 +5,15,7 +11,3,6 +10,1,11 +18,4,10 +14,18,7 +12,3,17 +16,15,17 +3,11,11 +15,4,10 +17,4,15 +9,20,9 +4,13,8 +20,9,8 +19,10,8 +20,9,15 +14,15,14 +4,9,8 +13,14,2 +14,14,2 +14,11,16 +10,15,17 +1,13,12 +8,10,20 +15,8,2 +9,7,20 +3,5,11 +15,11,17 +17,4,9 +11,17,11 +6,7,8 +3,11,4 +13,15,18 +19,7,12 +8,18,9 +9,5,18 +17,11,6 +5,14,6 +8,16,3 +7,5,8 +8,13,4 +16,7,18 +17,14,9 +17,15,17 +5,5,4 +17,8,10 +11,5,8 +10,19,16 +12,13,20 +15,15,4 +12,11,1 +3,11,16 +9,8,17 +14,3,16 +6,12,2 +6,5,14 +18,10,3 +5,17,10 +13,15,3 +11,5,3 +15,7,7 +20,14,10 +19,14,14 +13,3,14 +8,15,17 +6,18,15 +19,11,7 +9,19,15 +15,18,9 +6,8,8 +7,15,2 +18,17,7 +4,13,10 +12,8,17 +19,13,14 +2,6,10 +19,12,11 +13,3,4 +17,14,10 +10,18,9 +6,1,11 +12,5,14 +15,14,16 +11,8,1 +10,7,3 +9,3,12 +5,6,10 +17,14,4 +11,3,11 +12,1,10 +13,9,17 +18,17,14 +1,8,13 +14,16,3 +6,19,8 +8,19,10 +13,10,18 +13,17,13 +3,7,5 +8,7,18 +12,16,16 +6,17,17 +4,11,18 +8,6,16 +3,11,9 +11,16,5 +12,11,18 +19,7,15 +7,6,7 +6,4,4 +6,2,13 +20,13,11 +12,11,0 +14,17,3 +13,17,6 +18,4,11 +20,8,10 +14,20,10 +13,3,9 +4,13,4 +19,12,12 +12,19,5 +3,5,10 +3,15,13 +11,3,15 +3,11,17 +16,15,16 +13,5,10 +6,8,15 +11,4,10 +2,14,7 +7,9,2 +20,10,8 +8,2,13 +2,14,14 +10,2,13 +13,15,16 +14,7,18 +5,7,11 +10,7,20 +7,16,10 +7,7,17 +10,18,7 +9,4,15 +10,13,1 +1,7,11 +12,17,5 +18,9,11 +12,5,5 +11,1,13 +4,10,14 +15,12,2 +11,6,16 +15,2,13 +14,11,1 +8,8,20 +16,4,15 +6,11,20 +16,14,4 +9,10,1 +17,9,13 +20,12,11 +11,8,20 +5,18,10 +5,17,6 +10,16,3 +12,8,3 +11,9,2 +17,13,9 +6,19,12 +14,2,9 +5,2,12 +6,11,17 +4,13,11 +8,14,16 +11,16,14 +12,2,7 +9,20,8 +12,16,5 +6,6,18 +18,10,10 +12,12,1 +14,5,6 +14,11,20 +13,14,4 +7,19,8 +15,11,5 +6,16,9 +16,14,7 +8,3,13 +10,18,17 +18,13,11 +10,6,5 +15,14,14 +19,15,12 +0,11,12 +7,2,8 +10,13,20 +12,19,6 +13,19,15 +9,8,19 +3,12,5 +8,4,3 +11,2,8 +12,17,6 +18,17,8 +16,17,13 +18,7,6 +13,14,6 +3,9,4 +5,10,9 +17,5,14 +8,17,6 +13,5,2 +6,17,10 +12,18,10 +6,13,15 +2,6,14 +15,10,17 +15,9,20 +10,15,18 +7,13,20 +1,14,11 +9,2,13 +19,9,14 +12,13,1 +13,15,1 +5,9,14 +19,12,15 +12,15,5 +11,20,10 +16,8,6 +9,6,6 +1,8,11 +18,11,7 +8,3,14 +14,14,15 +14,18,6 +14,1,11 +10,6,19 +10,20,8 +17,17,15 +7,10,16 +19,13,15 +1,9,13 +13,3,10 +7,15,6 +4,7,7 +13,2,10 +6,19,11 +13,17,10 +9,16,4 +11,11,18 +18,11,12 +0,9,12 +6,13,6 +15,16,16 +8,15,2 +9,2,10 +4,14,15 +3,9,10 +4,9,6 +15,17,10 +17,8,4 +16,9,19 +11,3,4 +16,17,14 +14,17,11 +21,11,11 +7,8,2 +1,10,8 +2,10,8 +11,9,20 +14,15,3 +5,11,19 +8,13,5 +8,3,6 +10,4,13 +11,8,19 +20,12,7 +2,8,15 +12,9,20 +15,17,17 +6,19,6 +11,10,2 +14,17,7 +8,17,12 +18,11,17 +12,10,18 +8,4,10 +8,5,17 +9,18,4 +13,20,13 +3,5,12 +1,12,12 +18,5,7 +5,6,15 +5,5,11 +8,14,14 +11,11,3 +16,11,3 +11,19,4 +17,11,14 +18,15,5 +4,10,8 +19,9,11 +2,5,11 +6,10,5 +11,5,17 +4,10,7 +4,6,16 +2,6,8 +14,6,2 +11,15,16 +17,12,9 +5,2,7 +12,7,6 +11,14,17 +4,9,14 +15,3,13 +8,16,14 +13,16,18 +17,7,9 +10,15,5 +7,11,19 +10,16,15 +5,4,15 +5,18,9 +10,5,7 +14,7,2 +6,9,20 +13,8,20 +8,1,8 +10,6,15 +5,13,3 +10,0,12 +10,3,18 +8,19,14 +18,11,11 +9,14,1 +5,10,14 +10,10,0 +6,5,12 +8,11,5 +18,5,13 +16,8,18 +16,10,17 +11,20,9 +4,13,15 +9,6,15 +14,20,13 +2,9,6 +14,15,16 +7,2,7 +5,17,8 +4,4,7 +20,9,11 +4,9,15 +5,13,13 +12,19,7 +9,3,16 +6,12,14 +16,17,5 +8,5,14 +16,10,19 +15,5,11 +15,8,15 +7,8,5 +14,6,9 +5,8,3 +15,6,18 +8,3,4 +4,9,17 +10,18,4 +20,13,13 +2,15,14 +16,17,6 +16,6,11 +6,6,7 +14,3,6 +18,15,6 +17,10,12 +10,20,14 +5,15,8 +9,17,3 +17,11,8 +5,11,6 +10,14,6 +7,13,5 +14,20,11 +11,20,12 +5,16,5 +12,1,9 +12,15,2 diff --git a/2022/input/day_18_sample.txt b/2022/input/day_18_sample.txt new file mode 100644 index 0000000..73a7202 --- /dev/null +++ b/2022/input/day_18_sample.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 diff --git a/2022/input/day_19.txt b/2022/input/day_19.txt new file mode 100644 index 0000000..017bf6c --- /dev/null +++ b/2022/input/day_19.txt @@ -0,0 +1,30 @@ +Blueprint 1: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 12 clay. Each geode robot costs 4 ore and 19 obsidian. +Blueprint 2: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 11 clay. Each geode robot costs 2 ore and 7 obsidian. +Blueprint 3: Each ore robot costs 3 ore. Each clay robot costs 3 ore. Each obsidian robot costs 2 ore and 13 clay. Each geode robot costs 3 ore and 12 obsidian. +Blueprint 4: Each ore robot costs 2 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 18 clay. Each geode robot costs 2 ore and 19 obsidian. +Blueprint 5: Each ore robot costs 2 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 19 clay. Each geode robot costs 4 ore and 13 obsidian. +Blueprint 6: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 7 clay. Each geode robot costs 4 ore and 11 obsidian. +Blueprint 7: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 15 clay. Each geode robot costs 4 ore and 17 obsidian. +Blueprint 8: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 13 clay. Each geode robot costs 3 ore and 7 obsidian. +Blueprint 9: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 12 clay. Each geode robot costs 3 ore and 15 obsidian. +Blueprint 10: Each ore robot costs 4 ore. Each clay robot costs 3 ore. Each obsidian robot costs 4 ore and 18 clay. Each geode robot costs 4 ore and 11 obsidian. +Blueprint 11: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 8 clay. Each geode robot costs 2 ore and 15 obsidian. +Blueprint 12: Each ore robot costs 4 ore. Each clay robot costs 3 ore. Each obsidian robot costs 4 ore and 8 clay. Each geode robot costs 3 ore and 7 obsidian. +Blueprint 13: Each ore robot costs 4 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 10 clay. Each geode robot costs 2 ore and 10 obsidian. +Blueprint 14: Each ore robot costs 2 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 13 clay. Each geode robot costs 2 ore and 20 obsidian. +Blueprint 15: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 19 clay. Each geode robot costs 3 ore and 8 obsidian. +Blueprint 16: Each ore robot costs 3 ore. Each clay robot costs 3 ore. Each obsidian robot costs 2 ore and 16 clay. Each geode robot costs 2 ore and 18 obsidian. +Blueprint 17: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 9 clay. Each geode robot costs 3 ore and 19 obsidian. +Blueprint 18: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 11 clay. Each geode robot costs 4 ore and 8 obsidian. +Blueprint 19: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 12 clay. Each geode robot costs 3 ore and 17 obsidian. +Blueprint 20: Each ore robot costs 3 ore. Each clay robot costs 3 ore. Each obsidian robot costs 2 ore and 14 clay. Each geode robot costs 3 ore and 17 obsidian. +Blueprint 21: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 15 clay. Each geode robot costs 3 ore and 16 obsidian. +Blueprint 22: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 16 clay. Each geode robot costs 4 ore and 16 obsidian. +Blueprint 23: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 19 clay. Each geode robot costs 4 ore and 11 obsidian. +Blueprint 24: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 18 clay. Each geode robot costs 4 ore and 9 obsidian. +Blueprint 25: Each ore robot costs 4 ore. Each clay robot costs 3 ore. Each obsidian robot costs 2 ore and 17 clay. Each geode robot costs 3 ore and 16 obsidian. +Blueprint 26: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 20 clay. Each geode robot costs 4 ore and 7 obsidian. +Blueprint 27: Each ore robot costs 2 ore. Each clay robot costs 2 ore. Each obsidian robot costs 2 ore and 8 clay. Each geode robot costs 2 ore and 14 obsidian. +Blueprint 28: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 20 clay. Each geode robot costs 3 ore and 14 obsidian. +Blueprint 29: Each ore robot costs 4 ore. Each clay robot costs 3 ore. Each obsidian robot costs 4 ore and 20 clay. Each geode robot costs 4 ore and 8 obsidian. +Blueprint 30: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 18 clay. Each geode robot costs 3 ore and 13 obsidian. diff --git a/2022/input/day_19_sample.txt b/2022/input/day_19_sample.txt new file mode 100644 index 0000000..f39c094 --- /dev/null +++ b/2022/input/day_19_sample.txt @@ -0,0 +1,2 @@ +Blueprint 1: Each ore robot costs 4 ore. Each clay robot costs 2 ore. Each obsidian robot costs 3 ore and 14 clay. Each geode robot costs 2 ore and 7 obsidian. +Blueprint 2: Each ore robot costs 2 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 8 clay. Each geode robot costs 3 ore and 12 obsidian. diff --git a/2022/src/day_16.rs b/2022/src/day_16.rs new file mode 100644 index 0000000..19f7f94 --- /dev/null +++ b/2022/src/day_16.rs @@ -0,0 +1,89 @@ +use std::collections::HashMap; +#[derive(Debug)] +struct Node { + id: String, + rate: i64, + edges: Vec, +} +type Data = (String, HashMap); +type Output = i64; +fn parse(input: &str) -> Data { + let start = input.lines().next().unwrap()[6..=7].to_string(); + let map = input + .lines() + .map(|l| { + let id = l[6..=7].to_string(); + + let rate = l + .chars() + .skip_while(|c| *c != '=') + .skip(1) + .take_while(|c| *c != ';') + .collect::() + .parse() + .unwrap(); + + let edges_str = l + .chars() + .skip_while(|c| *c != ';') + .skip_while(|c| *c != 'v') + .skip_while(|c| *c != ' ') + .skip(1) + .collect::(); + let edges = edges_str.split(", ").map(str::to_owned).collect(); + + (id.clone(), Node { id, edges, rate }) + }) + .collect(); + (start, map) +} +fn part_one((start, mut graph): Data) -> Output { + fn solve( + graph: &mut HashMap, + curr: &str, + parent: &str, + amount_released: i64, + time_left: i64, + ) -> Output { + if time_left == 0 { + return amount_released; + } + + let mut max = 0; + let rate = graph.get(curr).unwrap().rate; + if rate > 0 { + graph.get_mut(curr).unwrap().rate = 0; + max = solve( + &mut *graph, + curr, + curr, + amount_released + rate * (time_left - 1), + time_left - 1, + ); + graph.get_mut(curr).unwrap().rate = rate; + } + + for edge in &graph.get(curr).unwrap().edges.clone() { + if edge != parent { + max = std::cmp::max( + max, + solve(graph, edge, curr, amount_released, time_left - 1), + ); + } + } + max + } + solve(&mut graph, &start, "", 0, 30) +} +fn part_two(_data: Data) -> Output { + todo!() +} + +advent_of_code_macro::generate_tests!( + day 16, + parse, + part_one, + part_two, + sample tests [1_651, 0], + star tests [0, 0] +); diff --git a/2022/src/day_17.rs b/2022/src/day_17.rs new file mode 100644 index 0000000..807737a --- /dev/null +++ b/2022/src/day_17.rs @@ -0,0 +1,258 @@ +type Board = Vec<[bool; 7]>; +#[derive(Clone, Copy, Debug)] +enum BlockType { + Square, + L, + Horizontal, + Vertical, + Cross, +} +impl BlockType { + fn height(&self) -> usize { + match *self { + Square => 2, + L => 3, + Horizontal => 1, + Vertical => 4, + Cross => 3, + } + } +} + +use BlockType::*; + +#[derive(Debug)] +struct Position { + row: usize, + col: usize, +} + +#[derive(Debug)] +struct Block { + pos: Position, + block_type: BlockType, +} +impl Block { + fn left(&mut self, board: &Board) { + let cond = match self.block_type { + Square => { + self.pos.col > 0 + && !board[self.pos.row][self.pos.col - 1] + && !board[self.pos.row - 1][self.pos.col - 1] + } + L => { + self.pos.col > 0 + && !board[self.pos.row][self.pos.col + 1] + && !board[self.pos.row - 1][self.pos.col + 1] + && !board[self.pos.row - 2][self.pos.col - 1] + } + Cross => { + self.pos.col > 0 + && !board[self.pos.row][self.pos.col] + && !board[self.pos.row - 1][self.pos.col - 1] + && !board[self.pos.row - 2][self.pos.col] + } + Horizontal => self.pos.col > 0 && !board[self.pos.row][self.pos.col - 1], + Vertical => { + self.pos.col > 0 + && !board[self.pos.row][self.pos.col - 1] + && !board[self.pos.row - 1][self.pos.col - 1] + && !board[self.pos.row - 2][self.pos.col - 1] + && !board[self.pos.row - 3][self.pos.col - 1] + } + }; + if cond { + self.pos.col -= 1; + } + println!("left to {:?}, {:?}", self.pos, self.block_type); + } + + fn right(&mut self, board: &Board) { + let cond = match self.block_type { + Square => { + self.pos.col < 5 + && !board[self.pos.row][self.pos.col + 2] + && !board[self.pos.row - 1][self.pos.col + 2] + } + L => { + self.pos.col < 4 + && !board[self.pos.row][self.pos.col + 3] + && !board[self.pos.row - 1][self.pos.col + 3] + && !board[self.pos.row - 2][self.pos.col + 3] + } + Cross => { + self.pos.col < 4 + && !board[self.pos.row][self.pos.col + 2] + && !board[self.pos.row - 1][self.pos.col + 3] + && !board[self.pos.row - 2][self.pos.col + 2] + } + Horizontal => self.pos.col < 3 && !board[self.pos.row][self.pos.col + 4], + Vertical => { + self.pos.col < 6 + && !board[self.pos.row][self.pos.col + 1] + && !board[self.pos.row - 1][self.pos.col + 1] + && !board[self.pos.row - 2][self.pos.col + 1] + && !board[self.pos.row - 3][self.pos.col + 1] + } + }; + if cond { + self.pos.col += 1; + } + println!("right to {:?}, {:?}", self.pos, self.block_type); + } + + /// Returns if the block comes to rest (and can't move down) + /// board will only be mutated to insert the object if the block is at rest + fn down(&mut self, board: &mut Board) -> bool { + let is_falling = match self.block_type { + Square => { + self.pos.row > 1 + && !board[self.pos.row - 2][self.pos.col] + && !board[self.pos.row - 2][self.pos.col + 1] + } + L => { + self.pos.row > 2 + && !board[self.pos.row - 3][self.pos.col] + && !board[self.pos.row - 3][self.pos.col + 1] + && !board[self.pos.row - 3][self.pos.col + 2] + } + Cross => { + self.pos.row > 2 + && !board[self.pos.row - 2][self.pos.col] + && !board[self.pos.row - 3][self.pos.col + 1] + && !board[self.pos.row - 2][self.pos.col + 2] + } + Horizontal => { + self.pos.row > 0 + && !board[self.pos.row - 1][self.pos.col] + && !board[self.pos.row - 1][self.pos.col + 1] + && !board[self.pos.row - 1][self.pos.col + 2] + && !board[self.pos.row - 1][self.pos.col + 3] + } + Vertical => self.pos.row > 3 && !board[self.pos.row - 4][self.pos.col], + }; + if is_falling { + self.pos.row -= 1; + } + + println!( + "down to {:?}, is falling? {:?}, {:?}", + self.pos, is_falling, self.block_type + ); + !is_falling + } + fn draw(&self, board: &mut Board) { + match self.block_type { + Square => { + board[self.pos.row][self.pos.col] = true; + board[self.pos.row][self.pos.col + 1] = true; + board[self.pos.row - 1][self.pos.col] = true; + board[self.pos.row - 1][self.pos.col + 1] = true; + } + L => { + board[self.pos.row][self.pos.col + 2] = true; + board[self.pos.row - 1][self.pos.col + 2] = true; + board[self.pos.row - 2][self.pos.col + 2] = true; + board[self.pos.row - 2][self.pos.col + 1] = true; + board[self.pos.row - 2][self.pos.col] = true; + } + Cross => { + board[self.pos.row][self.pos.col + 1] = true; + board[self.pos.row - 1][self.pos.col + 1] = true; + board[self.pos.row - 2][self.pos.col + 1] = true; + board[self.pos.row - 1][self.pos.col] = true; + board[self.pos.row - 1][self.pos.col + 2] = true; + } + Horizontal => { + board[self.pos.row][self.pos.col] = true; + board[self.pos.row][self.pos.col + 1] = true; + board[self.pos.row][self.pos.col + 2] = true; + board[self.pos.row][self.pos.col + 3] = true; + } + Vertical => { + board[self.pos.row][self.pos.col] = true; + board[self.pos.row - 1][self.pos.col] = true; + board[self.pos.row - 2][self.pos.col] = true; + board[self.pos.row - 3][self.pos.col] = true; + } + } + } +} + +type Data = &'static str; +type Output = i32; +fn parse(input: &'static str) -> Data { + input +} +fn part_one(data: Data) -> Output { + let mut blocks = vec![Horizontal, Cross, L, Vertical, Square] + .into_iter() + .cycle(); + let mut top = -1i32; + let block_type = blocks.next().unwrap(); + let mut curr = Block { + pos: Position { row: 3, col: 2 }, + block_type, + }; + let mut board = vec![[false; 7]; 5]; + let mut num_rocks = 0; + for c in data.chars().cycle() { + match c { + '>' => curr.right(&board), + '<' => curr.left(&board), + _ => {} + } + if curr.down(&mut board) { + curr.draw(&mut board); + top = board + .iter() + .enumerate() + .rev() + .find(|(_, el)| **el != [false; 7]) + .map(|(idx, _)| idx as i32) + .unwrap(); + num_rocks += 1; + + println!(); + for line in board.iter().rev() { + print!("|"); + line.iter() + .map(|filled| if *filled { '#' } else { '.' }) + .for_each(|c| print!("{c}")); + println!("|"); + } + println!("+-------+"); + println!("{:?}", top); + println!(); + + if num_rocks == 15 { + return top; + } + let block_type = blocks.next().unwrap(); + let start_row = top + 3 + block_type.height() as i32; + while board.len() <= start_row as usize { + board.push([false; 7]); + } + curr = Block { + pos: Position { + row: start_row as usize, + col: 2, + }, + block_type, + }; + } + } + unreachable!() +} +fn part_two(_data: Data) -> Output { + todo!() +} + +advent_of_code_macro::generate_tests!( + day 17, + parse, + part_one, + part_two, + sample tests [3068, 0], + star tests [0, 0] +); diff --git a/2022/src/day_18.rs b/2022/src/day_18.rs new file mode 100644 index 0000000..586e64b --- /dev/null +++ b/2022/src/day_18.rs @@ -0,0 +1,201 @@ +use std::collections::HashSet; +use Side::*; + +type Point = (i32, i32, i32); + +#[derive(Debug, Clone, Copy, Hash, Eq, PartialEq)] +enum Side { + /// positive z side + Top, + + /// negative z side + Bottom, + + /// negative x side + Left, + + /// positive x side + Right, + + /// positive y side + Front, + + /// negative y side + Back, +} +impl Side { + fn inverse(&self) -> Self { + match *self { + Top => Bottom, + Bottom => Top, + Left => Right, + Right => Left, + Front => Back, + Back => Front, + } + } +} + +type Data = HashSet; + +type Output = i32; + +fn parse(input: &str) -> Data { + input + .lines() + .map(|l| l.split(',').map(str::parse).map(Result::unwrap)) + .map(|mut iter| { + ( + iter.next().unwrap(), + iter.next().unwrap(), + iter.next().unwrap(), + ) + }) + .collect() +} + +fn part_one(data: Data) -> Output { + data.iter() + .map(|(x, y, z)| { + let offsets = [ + (0, 0, 1), + (0, 1, 0), + (1, 0, 0), + (0, 0, -1), + (0, -1, 0), + (-1, 0, 0), + ]; + offsets + .iter() + .filter(|(x_off, y_off, z_off)| !data.contains(&(x + x_off, y + y_off, z + z_off))) + .count() as Output + }) + .sum() +} + +fn part_two(data: Data) -> Output { + let mut queue = vec![( + *data + .iter() + .max_by(|(x1, _, _), (x2, _, _)| x1.cmp(x2)) + .unwrap(), + Top, + )]; + let mut visited: HashSet<(Point, Side)> = queue.clone().into_iter().collect(); + for i in 0.. { + if i >= queue.len() { + return visited.len() as Output; + } + let ((curr_x, curr_y, curr_z), curr_side) = queue[i]; + let offsets = [(1, 0), (0, 1), (-1, 0), (0, -1)]; + let positions = offsets.iter().map(|(a, b)| match curr_side { + Top | Bottom => (curr_x + a, curr_y + b, curr_z), + Left | Right => (curr_x, curr_y + a, curr_z + b), + Front | Back => (curr_x + a, curr_y, curr_z + b), + }); + for (new_x, new_y, new_z) in positions { + let res = match curr_side { + Top | Bottom => { + let side = if curr_x > new_x { + Right + } else if curr_x < new_x { + Left + } else if curr_y > new_y { + Front + } else { + Back + }; + if curr_side == Top { + if data.contains(&(new_x, new_y, new_z + 1)) { + ((new_x, new_y, new_z + 1), side) + } else if data.contains(&(new_x, new_y, new_z)) { + ((new_x, new_y, new_z), Top) + } else { + ((curr_x, curr_y, curr_z), side.inverse()) + } + } else { + if data.contains(&(new_x, new_y, new_z - 1)) { + ((new_x, new_y, new_z - 1), side) + } else if data.contains(&(new_x, new_y, new_z)) { + ((new_x, new_y, new_z), Bottom) + } else { + ((curr_x, curr_y, curr_z), side.inverse()) + } + } + } + Left | Right => { + let side = if curr_z > new_z { + Top + } else if curr_z < new_z { + Bottom + } else if curr_y > new_y { + Front + } else { + Back + }; + if curr_side == Left { + if data.contains(&(new_x - 1, new_y, new_z)) { + ((new_x - 1, new_y, new_z), side) + } else if data.contains(&(new_x, new_y, new_z)) { + ((new_x, new_y, new_z), Left) + } else { + ((curr_x, curr_y, curr_z), side.inverse()) + } + } else { + if data.contains(&(new_x + 1, new_y, new_z)) { + ((new_x + 1, new_y, new_z), side) + } else if data.contains(&(new_x, new_y, new_z)) { + ((new_x, new_y, new_z), Right) + } else { + ((curr_x, curr_y, curr_z), side.inverse()) + } + } + } + Front | Back => { + let side = if curr_z > new_z { + Top + } else if curr_z < new_z { + Bottom + } else if curr_x > new_x { + Right + } else { + Left + }; + if curr_side == Front { + if data.contains(&(new_x, new_y + 1, new_z)) { + ((new_x, new_y + 1, new_z), side) + } else if data.contains(&(new_x, new_y, new_z)) { + ((new_x, new_y, new_z), Front) + } else { + ((curr_x, curr_y, curr_z), side.inverse()) + } + } else { + if data.contains(&(new_x + 1, new_y, new_z)) { + ((new_x + 1, new_y, new_z), side) + } else if data.contains(&(new_x, new_y, new_z)) { + ((new_x, new_y, new_z), Back) + } else { + ((curr_x, curr_y, curr_z), side.inverse()) + } + } + } + }; + if !visited.contains(&res) { + visited.insert(res); + println!("{:?}", res); + queue.push(res); + } + } + } + + unreachable!() +} + +advent_of_code_macro::generate_tests!( + day 18, + parse, + part_one, + part_two, + sample tests [64, 58], + star tests [4300, 0] +); diff --git a/2022/src/day_19.rs b/2022/src/day_19.rs new file mode 100644 index 0000000..44ea621 --- /dev/null +++ b/2022/src/day_19.rs @@ -0,0 +1,202 @@ +use std::collections::{BinaryHeap, HashSet}; + +#[derive(Debug)] +struct Blueprint { + id: i64, + ore_robot_cost: i64, + clay_robot_cost: i64, + obsidian_robot_cost: (i64, i64), + geode_robot_cost: (i64, i64), +} +#[derive(Debug, Hash, PartialEq, Eq, Clone, Copy)] +struct Search { + time_left: i64, + ore: i64, + ore_robots: i64, + clay: i64, + clay_robots: i64, + obsidian: i64, + obsidian_robots: i64, + geode: i64, + geode_robots: i64, +} +impl std::cmp::Ord for Search { + fn cmp(&self, other: &Self) -> std::cmp::Ordering { + (self.geode_robots * self.time_left + self.geode) + .cmp(&(other.geode_robots * other.time_left + other.geode)) + .then_with(|| self.obsidian_robots.cmp(&other.obsidian_robots)) + .then_with(|| self.clay_robots.cmp(&other.clay_robots)) + .then_with(|| self.ore_robots.cmp(&other.ore_robots)) + } +} +impl std::cmp::PartialOrd for Search { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} +type Data = Vec; +type Output = i64; +fn parse(input: &str) -> Data { + input + .lines() + .map(|l| Blueprint { + id: get_id(l), + ore_robot_cost: get_cost_one(l, "ore"), + clay_robot_cost: get_cost_one(l, "clay"), + obsidian_robot_cost: get_cost_two(l, "obsidian"), + geode_robot_cost: get_cost_two(l, "geode"), + }) + .collect() +} +fn max_geodes(bp: &Blueprint, initial_search: Search) -> Output { + let mut queue: BinaryHeap = BinaryHeap::new(); + let mut visited: HashSet = HashSet::new(); + queue.push(initial_search); + let mut max = 0; + while let Some(search) = queue.pop() { + if search.time_left == 0 { + println!("{:?}, {:?}", max, search); + max = std::cmp::max(search.geode, max); + } + { + let mut temp_search = search; + while temp_search.ore >= bp.ore_robot_cost { + temp_search.ore -= bp.ore_robot_cost; + temp_search.ore_robots += 1; + } + if !visited.contains(&temp_search) { + visited.insert(temp_search); + queue.push(temp_search); + } + } + { + let mut temp_search = search; + while temp_search.ore >= bp.clay_robot_cost { + temp_search.ore -= bp.clay_robot_cost; + temp_search.clay_robots += 1; + } + if !visited.contains(&temp_search) { + visited.insert(temp_search); + queue.push(temp_search); + } + } + { + let mut temp_search = search; + while temp_search.ore >= bp.obsidian_robot_cost.0 + && temp_search.clay >= bp.obsidian_robot_cost.1 + { + temp_search.ore -= bp.obsidian_robot_cost.0; + temp_search.clay -= bp.obsidian_robot_cost.1; + temp_search.obsidian_robots += 1; + } + if !visited.contains(&temp_search) { + visited.insert(temp_search); + queue.push(temp_search); + } + } + { + let mut temp_search = search; + while temp_search.ore >= bp.geode_robot_cost.0 + && temp_search.obsidian >= bp.geode_robot_cost.1 + { + temp_search.ore -= bp.geode_robot_cost.0; + temp_search.obsidian -= bp.geode_robot_cost.1; + temp_search.geode_robots += 1; + } + if !visited.contains(&temp_search) { + visited.insert(temp_search); + queue.push(temp_search); + } + } + { + let mut temp_search = search; + temp_search.ore += temp_search.ore_robots; + temp_search.clay += temp_search.clay_robots; + temp_search.obsidian += temp_search.obsidian_robots; + temp_search.geode += temp_search.geode_robots; + temp_search.time_left -= 1; + if !visited.contains(&temp_search) { + visited.insert(temp_search); + queue.push(temp_search); + } + } + } + max +} +fn part_one(data: Data) -> Output { + for bp in data { + let res = max_geodes( + &bp, + Search { + time_left: 24, + ore: 0, + ore_robots: 1, + clay: 0, + clay_robots: 0, + obsidian: 0, + obsidian_robots: 0, + geode: 0, + geode_robots: 0, + }, + ); + dbg!(res); + } + todo!() +} +fn part_two(data: Data) -> Output { + todo!() +} + +advent_of_code_macro::generate_tests!( + day 19, + parse, + part_one, + part_two, + sample tests [0, 0], + star tests [0, 0] +); + +// helper funtions for parsing +fn get_cost_one(l: &str, t: &str) -> i64 { + l.split_once(&format!("{} robot costs ", t)) + .unwrap() + .1 + .split_once(' ') + .unwrap() + .0 + .parse() + .unwrap() +} +fn get_cost_two(l: &str, t: &str) -> (i64, i64) { + ( + l.split_once(&format!("{} robot costs ", t)) + .unwrap() + .1 + .split_once(' ') + .unwrap() + .0 + .parse() + .unwrap(), + l.split_once(&format!("{} robot costs ", t)) + .unwrap() + .1 + .split_once("and ") + .unwrap() + .1 + .split_once(' ') + .unwrap() + .0 + .parse() + .unwrap(), + ) +} +fn get_id(l: &str) -> i64 { + l.split_once(' ') + .unwrap() + .1 + .split_once(':') + .unwrap() + .0 + .parse() + .unwrap() +} diff --git a/2022/src/lib.rs b/2022/src/lib.rs index cefc13e..adb7a64 100644 --- a/2022/src/lib.rs +++ b/2022/src/lib.rs @@ -14,3 +14,7 @@ mod day_12; mod day_13; mod day_14; mod day_15; +mod day_16; +mod day_17; +mod day_18; +mod day_19;