My Advent of Code solutions in Python. kevinyap.ca/2019/12/going-fast-in-advent-of-code/
advent-of-code python
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add solution for 2019/14

+154
+96
2019/day14.py
··· 1 + import re 2 + import fileinput 3 + from collections import Counter 4 + 5 + from utils import parse_line 6 + 7 + 8 + formulas = {} 9 + from_ore = set() 10 + 11 + for i, line in enumerate(fileinput.input()): 12 + inp, out = line.split(' => ') 13 + re_form = r'(\d+) (.+)' 14 + 15 + inputs = [parse_line(re_form, i) for i in inp.split(', ')] 16 + out = parse_line(re_form, out) 17 + formulas[out[1]] = (out[0], inputs) 18 + 19 + if inputs[0][1] == 'ORE': 20 + from_ore.add(out[1]) 21 + 22 + 23 + def create_fuel(n): 24 + excesses = Counter() 25 + 26 + def needed(n, type): 27 + ret = Counter() 28 + 29 + if type in from_ore: 30 + ret[type] += n 31 + return ret 32 + 33 + nn, inputs = formulas[type] 34 + 35 + ratio = ((n - 1) // nn) + 1 36 + 37 + for m, t in inputs: 38 + ret[t] += m * ratio 39 + 40 + excess = ratio * nn - n 41 + excesses[type] += excess 42 + 43 + return ret 44 + 45 + 46 + resolve = Counter() 47 + resolve['FUEL'] = n 48 + 49 + while True: 50 + new_resolve = Counter() 51 + for type, amt in resolve.items(): 52 + new_resolve += needed(amt, type) 53 + 54 + if resolve == new_resolve: 55 + break 56 + 57 + for k, v in new_resolve.items(): 58 + if k in excesses: 59 + new_resolve[k] -= excesses[k] 60 + excesses[k] = 0 61 + 62 + resolve = new_resolve 63 + 64 + ore = 0 65 + 66 + for type, required in resolve.items(): 67 + formula = formulas[type] 68 + created = formula[0] 69 + ore_needed = formula[1][0][0] 70 + done = 0 71 + 72 + ratio = ((required - 1) // created) + 1 73 + ore += ratio * ore_needed 74 + 75 + excesses[type] += (required - ratio) 76 + 77 + return ore 78 + 79 + 80 + one_fuel = create_fuel(1) 81 + print "Ore to create 1 FUEL:", one_fuel 82 + 83 + trillion = 1000000000000 84 + worst_case = trillion // one_fuel 85 + lo, hi = worst_case, worst_case * 2 86 + 87 + while lo < hi: 88 + mid = (lo + hi + 1) // 2 89 + ore = create_fuel(mid) 90 + 91 + if ore > trillion: 92 + hi = mid - 1 93 + else: 94 + lo = mid 95 + 96 + print "Maximum FUEL with 1 trillion ORE:", lo
+56
2019/inputs/14.txt
··· 1 + 165 ORE => 2 PNBGW 2 + 2 FTZDF, 14 RHWGQ => 8 JTRM 3 + 1 QSKQ, 1 GPRK => 8 HKXF 4 + 2 GKLGP => 3 MTJLK 5 + 4 HXMPQ => 8 VCRLF 6 + 2 DMXC, 2 MTJLK => 8 QSKQ 7 + 39 TCLZ, 17 DKHX, 7 HVPQT, 1 DWMW, 33 THWX, 67 JVGP, 44 RDZSG, 7 JCKT, 22 TDSC, 1 QHVR => 1 FUEL 8 + 6 VCRLF, 1 HXMPQ, 6 WQSDR => 3 GKLGP 9 + 1 WLSQZ => 1 WQSDR 10 + 1 MTJLK => 2 PVSV 11 + 5 HVPQT, 4 WCTW => 8 NWGDN 12 + 3 KNTQG => 9 TCLZ 13 + 1 JTRM, 3 QSKQ, 2 RGWB => 9 RDZSG 14 + 1 MTJLK, 15 DZMQ => 6 RCPN 15 + 1 PVSV, 3 HBWDW => 7 DZMQ 16 + 1 CTKPZ, 2 HKXF => 3 RFCDH 17 + 5 QNXTS, 2 GSJNV, 1 JVGP, 10 HJTHM, 5 HKXF, 10 DZMQ => 4 JCKT 18 + 1 PNBGW => 2 HVPQT 19 + 187 ORE => 1 XLNC 20 + 16 GPRK => 6 QNXTS 21 + 1 FTZDF => 9 GPRK 22 + 9 KNTQG => 2 WCTW 23 + 35 WQSDR, 2 HVPQT => 8 RPVGN 24 + 5 RPVGN => 2 RHWGQ 25 + 1 CTKPZ, 9 QSKQ, 2 QNXTS => 5 DTFRT 26 + 1 HXMPQ, 12 VCRLF, 1 RHQH => 6 FTZDF 27 + 3 RHWGQ, 19 DZMQ, 8 FPNMC => 9 FGNK 28 + 7 RHQH, 3 HWSG => 9 HBWDW 29 + 11 QNXTS, 1 CNVKX => 8 QHVR 30 + 4 HVPQT => 6 NRLP 31 + 4 NWGDN, 1 HWSG => 2 DMXC 32 + 20 DTFRT, 4 NRLP, 1 CTKPZ => 8 HJTHM 33 + 2 BSVPD, 7 RHQH => 6 FPNMC 34 + 3 NSRB => 4 BSVPD 35 + 1 DZMQ => 3 GSJNV 36 + 2 GMNXP, 4 GSJNV, 1 ZRBR => 3 WPWM 37 + 6 RCPN => 4 CNVKX 38 + 1 NSRB => 5 RGWB 39 + 22 VCRLF => 4 NSRB 40 + 4 XLNC, 24 KNTQG => 9 WLSQZ 41 + 36 NWGDN => 2 WQZQ 42 + 5 CPMCX, 2 FGNK, 5 DTFRT => 2 ZRBR 43 + 1 CTKPZ, 1 GMNXP, 6 QNXTS => 4 KRDWH 44 + 9 RHWGQ, 16 FTZDF, 1 JVGP, 1 GMNXP, 3 HKXF, 9 DTFRT, 27 CTKPZ, 1 GKLGP => 9 DWMW 45 + 5 WQSDR, 4 NRLP, 3 TCLZ => 1 RHQH 46 + 4 NRLP => 5 GMNXP 47 + 158 ORE => 5 KNTQG 48 + 24 GMNXP, 6 JVGP, 1 BHVR, 4 KRDWH, 1 WPWM, 2 RFCDH => 7 TDSC 49 + 1 WCTW => 7 HXMPQ 50 + 10 BSVPD => 9 THWX 51 + 18 RGWB, 1 HJTHM => 3 DKHX 52 + 1 WQZQ, 4 VCRLF, 10 HVPQT => 3 CPMCX 53 + 14 BSVPD, 6 FPNMC, 5 TCLZ => 8 JVGP 54 + 4 WQZQ, 1 HXMPQ, 4 VCRLF => 3 HWSG 55 + 2 HWSG => 9 CTKPZ 56 + 4 NSRB, 1 GPRK => 4 BHVR
+2
2019/outputs/14.txt
··· 1 + 337075 2 + 5194174