diff --git a/day14.py b/day14.py new file mode 100644 index 0000000..efece18 --- /dev/null +++ b/day14.py @@ -0,0 +1,58 @@ +from aoc import AOCDay +from math import ceil +from typing import Any + + +class Day(AOCDay): + test_solutions_p1 = [165, 13312, 180697, 2210736] + test_solutions_p2 = [82892753, 5586022, 460664] + conversions = {} + rest = {} + + def buildConversionDict(self): + self.rest = {} + conv_input = self.getInputAsArraySplit(" => ") + + for need_str, give_str in conv_input: + tar_amt, tar = give_str.split() + self.conversions[tar] = {'amount': int(tar_amt), 'need': {}} + + for r in need_str.split(", "): + a, n = r.split() + self.conversions[tar]['need'][n] = int(a) + + def getOreNeed(self, what: str, amount: int) -> int: + amount -= self.rest.get(what, 0) + if amount < 0: + self.rest[what] = abs(amount) + return 0 + + if what == 'ORE': + return amount + + ore_need = 0 + count = ceil(amount / self.conversions[what]['amount']) + for need, need_amt in self.conversions[what]['need'].items(): + ore_need += self.getOreNeed(need, need_amt * count) + + self.rest[what] = self.conversions[what]['amount'] * count - amount + + return ore_need + + def part1(self) -> Any: + self.buildConversionDict() + return self.getOreNeed('FUEL', 1) + + def part2(self) -> Any: + self.buildConversionDict() + got_ore = 1_000_000_000_000 + min_fuel = got_ore // self.getOreNeed('FUEL', 1) + factor = 100_000 + while factor >= 1: + ore_need = self.getOreNeed('FUEL', min_fuel + factor) + if ore_need > got_ore: + factor //= 10 + else: + min_fuel += factor + + return min_fuel if self.getOreNeed('FUEL', min_fuel) < got_ore else min_fuel - 1 diff --git a/inputs/input14 b/inputs/input14 new file mode 100644 index 0000000..4609c2c --- /dev/null +++ b/inputs/input14 @@ -0,0 +1,60 @@ +2 LFPRM, 4 GPNQ => 2 VGZVD +1 KXFHM, 14 SJLP => 8 MGRTM +2 HBXVT, 3 HNHC, 5 BDLV => 1 DKTW +2 MGRTM, 8 RVTB => 4 DFMW +2 SJLP => 9 PXTS +1 NXBG => 6 FXBXZ +32 LPSQ => 9 GSDXD +13 LZGTR => 4 ZRMJ +1 FTPQ, 16 CPCS => 5 HNHC +2 THQH, 2 NDJG, 5 MSKT => 4 LRZV +2 BDLV, 9 HBXVT, 21 NXBG => 7 PLRK +16 LNSKQ, 41 KXFHM, 1 DKTW, 1 NCPSZ, 3 ZCSB, 11 MGRTM, 19 WNJWP, 11 KRBG => 1 FUEL +5 FTPQ, 1 HBXVT => 4 BDLV +15 LSDX, 1 GFJW, 1 QDHJT => 4 NKHQV +9 CZHTP, 1 FRPTK => 6 SNBS +17 LFLVS, 2 WCFT => 8 KGJQ +6 CMHLP => 1 SJLP +144 ORE => 3 KQKXZ +3 GFJW, 1 RVTB, 1 GPNQ => 2 NXBG +4 BDLV => 5 CMHLP +2 LSDX => 1 LZGTR +156 ORE => 3 NDJG +136 ORE => 8 MSKT +4 BDLV, 1 NKHQV, 1 RVTB => 7 LNSKQ +1 LRZV, 3 WCFT => 2 HBXVT +5 KGJQ, 1 SWBSN => 7 QHFX +2 DQHBG => 4 LPSQ +6 GSDXD => 3 LSDX +11 RWLD, 3 BNKVZ, 4 PXTS, 3 XTRQC, 5 LSDX, 5 LMHL, 36 MGRTM => 4 ZCSB +8 CPCS => 2 FRPTK +5 NDJG => 3 WCFT +1 GDQG, 1 QHFX => 4 KXFHM +160 ORE => 3 THQH +20 GFJW, 2 DQHBG => 6 RVTB +2 FXBXZ, 1 WNJWP, 1 VGZVD => 5 RWLD +3 DQHBG => 7 SWBSN +7 QHFX => 8 CPCS +14 HBXVT => 3 VCDW +5 FRPTK => 7 NGDX +1 HWFQ => 4 LFLVS +2 CPCS => 6 ZTKSW +9 KGJQ, 8 ZTKSW, 13 BDLV => 6 GDQG +13 LMHL, 1 LZGTR, 18 BNKVZ, 11 VCDW, 9 DFMW, 11 FTPQ, 3 RWLD => 4 KRBG +1 XRCH => 7 GPNQ +3 WCFT => 9 DQHBG +1 FTPQ => 8 CZHTP +1 PBMR, 2 ZTKSW => 2 BNKVZ +2 PLRK, 3 CPCS => 8 ZSGBG +3 NGDX, 3 XRCH => 6 XTRQC +6 ZTKSW, 11 HNHC, 22 SNBS => 9 WNJWP +5 KQKXZ => 8 HWFQ +23 WCFT => 7 PBMR +1 LRZV, 1 QDHJT => 2 GFJW +1 ZSGBG, 5 CGTHV, 9 ZRMJ => 3 LMHL +1 DQHBG => 9 XRCH +1 GDQG, 17 RWLD, 2 KGJQ, 8 VCDW, 2 BNKVZ, 2 WNJWP, 1 VGZVD => 3 NCPSZ +19 SJLP, 3 ZTKSW, 1 CZHTP => 4 LFPRM +14 SNBS => 8 CGTHV +3 DQHBG, 4 WCFT => 1 FTPQ +3 MSKT, 3 NDJG => 5 QDHJT diff --git a/inputs/test_input14_1_0 b/inputs/test_input14_1_0 new file mode 100644 index 0000000..85c4b1e --- /dev/null +++ b/inputs/test_input14_1_0 @@ -0,0 +1,7 @@ +9 ORE => 2 A +8 ORE => 3 B +7 ORE => 5 C +3 A, 4 B => 1 AB +5 B, 7 C => 1 BC +4 C, 1 A => 1 CA +2 AB, 3 BC, 4 CA => 1 FUEL diff --git a/inputs/test_input14_1_1 b/inputs/test_input14_1_1 new file mode 100644 index 0000000..4d6b9f0 --- /dev/null +++ b/inputs/test_input14_1_1 @@ -0,0 +1,9 @@ +157 ORE => 5 NZVS +165 ORE => 6 DCFZ +44 XJWVT, 5 KHKGT, 1 QDVJ, 29 NZVS, 9 GPVTF, 48 HKGWZ => 1 FUEL +12 HKGWZ, 1 GPVTF, 8 PSHF => 9 QDVJ +179 ORE => 7 PSHF +177 ORE => 5 HKGWZ +7 DCFZ, 7 PSHF => 2 XJWVT +165 ORE => 2 GPVTF +3 DCFZ, 7 NZVS, 5 HKGWZ, 10 PSHF => 8 KHKGT diff --git a/inputs/test_input14_1_2 b/inputs/test_input14_1_2 new file mode 100644 index 0000000..c670978 --- /dev/null +++ b/inputs/test_input14_1_2 @@ -0,0 +1,12 @@ +2 VPVL, 7 FWMGM, 2 CXFTF, 11 MNCFX => 1 STKFG +17 NVRVD, 3 JNWZP => 8 VPVL +53 STKFG, 6 MNCFX, 46 VJHF, 81 HVMC, 68 CXFTF, 25 GNMV => 1 FUEL +22 VJHF, 37 MNCFX => 5 FWMGM +139 ORE => 4 NVRVD +144 ORE => 7 JNWZP +5 MNCFX, 7 RFSQX, 2 FWMGM, 2 VPVL, 19 CXFTF => 3 HVMC +5 VJHF, 7 MNCFX, 9 VPVL, 37 CXFTF => 6 GNMV +145 ORE => 6 MNCFX +1 NVRVD => 8 CXFTF +1 VJHF, 6 MNCFX => 4 RFSQX +176 ORE => 6 VJHF diff --git a/inputs/test_input14_1_3 b/inputs/test_input14_1_3 new file mode 100644 index 0000000..a5ca2c3 --- /dev/null +++ b/inputs/test_input14_1_3 @@ -0,0 +1,17 @@ +171 ORE => 8 CNZTR +7 ZLQW, 3 BMBT, 9 XCVML, 26 XMNCP, 1 WPTQ, 2 MZWV, 1 RJRHP => 4 PLWSL +114 ORE => 4 BHXH +14 VRPVC => 6 BMBT +6 BHXH, 18 KTJDG, 12 WPTQ, 7 PLWSL, 31 FHTLT, 37 ZDVW => 1 FUEL +6 WPTQ, 2 BMBT, 8 ZLQW, 18 KTJDG, 1 XMNCP, 6 MZWV, 1 RJRHP => 6 FHTLT +15 XDBXC, 2 LTCX, 1 VRPVC => 6 ZLQW +13 WPTQ, 10 LTCX, 3 RJRHP, 14 XMNCP, 2 MZWV, 1 ZLQW => 1 ZDVW +5 BMBT => 4 WPTQ +189 ORE => 9 KTJDG +1 MZWV, 17 XDBXC, 3 XCVML => 2 XMNCP +12 VRPVC, 27 CNZTR => 2 XDBXC +15 KTJDG, 12 BHXH => 5 XCVML +3 BHXH, 2 VRPVC => 7 MZWV +121 ORE => 7 VRPVC +7 XCVML => 6 RJRHP +5 BHXH, 4 VRPVC => 5 LTCX diff --git a/inputs/test_input14_2_0 b/inputs/test_input14_2_0 new file mode 100644 index 0000000..4d6b9f0 --- /dev/null +++ b/inputs/test_input14_2_0 @@ -0,0 +1,9 @@ +157 ORE => 5 NZVS +165 ORE => 6 DCFZ +44 XJWVT, 5 KHKGT, 1 QDVJ, 29 NZVS, 9 GPVTF, 48 HKGWZ => 1 FUEL +12 HKGWZ, 1 GPVTF, 8 PSHF => 9 QDVJ +179 ORE => 7 PSHF +177 ORE => 5 HKGWZ +7 DCFZ, 7 PSHF => 2 XJWVT +165 ORE => 2 GPVTF +3 DCFZ, 7 NZVS, 5 HKGWZ, 10 PSHF => 8 KHKGT diff --git a/inputs/test_input14_2_1 b/inputs/test_input14_2_1 new file mode 100644 index 0000000..c670978 --- /dev/null +++ b/inputs/test_input14_2_1 @@ -0,0 +1,12 @@ +2 VPVL, 7 FWMGM, 2 CXFTF, 11 MNCFX => 1 STKFG +17 NVRVD, 3 JNWZP => 8 VPVL +53 STKFG, 6 MNCFX, 46 VJHF, 81 HVMC, 68 CXFTF, 25 GNMV => 1 FUEL +22 VJHF, 37 MNCFX => 5 FWMGM +139 ORE => 4 NVRVD +144 ORE => 7 JNWZP +5 MNCFX, 7 RFSQX, 2 FWMGM, 2 VPVL, 19 CXFTF => 3 HVMC +5 VJHF, 7 MNCFX, 9 VPVL, 37 CXFTF => 6 GNMV +145 ORE => 6 MNCFX +1 NVRVD => 8 CXFTF +1 VJHF, 6 MNCFX => 4 RFSQX +176 ORE => 6 VJHF diff --git a/inputs/test_input14_2_2 b/inputs/test_input14_2_2 new file mode 100644 index 0000000..a5ca2c3 --- /dev/null +++ b/inputs/test_input14_2_2 @@ -0,0 +1,17 @@ +171 ORE => 8 CNZTR +7 ZLQW, 3 BMBT, 9 XCVML, 26 XMNCP, 1 WPTQ, 2 MZWV, 1 RJRHP => 4 PLWSL +114 ORE => 4 BHXH +14 VRPVC => 6 BMBT +6 BHXH, 18 KTJDG, 12 WPTQ, 7 PLWSL, 31 FHTLT, 37 ZDVW => 1 FUEL +6 WPTQ, 2 BMBT, 8 ZLQW, 18 KTJDG, 1 XMNCP, 6 MZWV, 1 RJRHP => 6 FHTLT +15 XDBXC, 2 LTCX, 1 VRPVC => 6 ZLQW +13 WPTQ, 10 LTCX, 3 RJRHP, 14 XMNCP, 2 MZWV, 1 ZLQW => 1 ZDVW +5 BMBT => 4 WPTQ +189 ORE => 9 KTJDG +1 MZWV, 17 XDBXC, 3 XCVML => 2 XMNCP +12 VRPVC, 27 CNZTR => 2 XDBXC +15 KTJDG, 12 BHXH => 5 XCVML +3 BHXH, 2 VRPVC => 7 MZWV +121 ORE => 7 VRPVC +7 XCVML => 6 RJRHP +5 BHXH, 4 VRPVC => 5 LTCX