From 060cfeb610d58720c52bc99a6b4fe40474eeb07f Mon Sep 17 00:00:00 2001 From: Parnic Date: Sat, 11 Jun 2022 16:40:57 -0500 Subject: [PATCH] Day 14 WIP --- days/14.go | 149 ++++++++++++++++++++++++++++++++++++++++++++++++ inputs/14p.txt | 60 +++++++++++++++++++ inputs/14s1.txt | 6 ++ inputs/14s2.txt | 7 +++ inputs/14s3.txt | 9 +++ inputs/14s4.txt | 12 ++++ inputs/14s5.txt | 17 ++++++ main.go | 1 + 8 files changed, 261 insertions(+) create mode 100644 days/14.go create mode 100644 inputs/14p.txt create mode 100644 inputs/14s1.txt create mode 100644 inputs/14s2.txt create mode 100644 inputs/14s3.txt create mode 100644 inputs/14s4.txt create mode 100644 inputs/14s5.txt diff --git a/days/14.go b/days/14.go new file mode 100644 index 0000000..36f98dc --- /dev/null +++ b/days/14.go @@ -0,0 +1,149 @@ +package days + +import ( + "fmt" + "strconv" + "strings" + + u "parnic.com/aoc2019/utilities" +) + +type reaction struct { + inputs map[string]int + output u.Pair[string, int] +} + +type Day14 struct { + reactions []reaction + leftovers map[string]int +} + +func (d *Day14) Parse() { + d.leftovers = make(map[string]int) + + lines := u.GetStringLines("14s2") + d.reactions = make([]reaction, len(lines)) + for i, line := range lines { + sides := strings.Split(line, " => ") + inputs := strings.Split(sides[0], ", ") + output := sides[1] + + outPair := strings.Split(output, " ") + outAmt, _ := strconv.Atoi(outPair[0]) + d.reactions[i].output = u.Pair[string, int]{First: outPair[1], Second: outAmt} + d.reactions[i].inputs = make(map[string]int) + for _, input := range inputs { + pair := strings.Split(input, " ") + d.reactions[i].inputs[pair[1]], _ = strconv.Atoi(pair[0]) + } + } +} + +func (d Day14) getReactionProducing(chem string) *reaction { + for _, reaction := range d.reactions { + if reaction.output.First == chem { + return &reaction + } + } + + return nil +} + +func (d Day14) Num() int { + return 14 +} + +func (d Day14) getOreRequiredFor(chem string, amt int) (int, int) { + requiredOre := 0 + for _, reaction := range d.reactions { + if reaction.output.First == chem { + // if oreAmt, exists := reaction.inputs["ORE"]; exists && len(reaction.inputs) == 1 { + // if d.leftovers[chem] >= amt { + // d.leftovers[chem] -= amt + // return 0, amt + // } + + // produced := reaction.output.Second + // for produced < amt { + // requiredOre += oreAmt + // produced += reaction.output.Second + // } + // requiredOre += oreAmt + // if produced > amt { + // d.leftovers[chem] += produced - amt + // } + // return requiredOre, produced + // } else { + for inChem, inAmt := range reaction.inputs { + produced := 0 + if d.leftovers[inChem] >= inAmt { + d.leftovers[inChem] -= inAmt + produced = inAmt + } else { + for produced < inAmt { + madeOre, madeChem := d.getOreRequiredFor(inChem, inAmt) + produced += madeChem + requiredOre += madeOre + } + if produced > inAmt { + d.leftovers[inChem] += produced - inAmt + } + } + } + // } + } + } + + return requiredOre, 0 +} + +func (d *Day14) Part1() string { + fuelReaction := d.getReactionProducing("FUEL") + if fuelReaction == nil { + panic("") + } + + neededMaterial := map[string]int{ + "FUEL": 1, + } + var recurse func(neededMaterial map[string]int) map[string]int + recurse = func(neededMaterial map[string]int) map[string]int { + neededInputs := make(map[string]int) + for chem, amt := range neededMaterial { + reaction := d.getReactionProducing(chem) + if reaction == nil { + continue + } + produced := reaction.output.Second + reactionsNeeded := 1 + for produced < amt { + produced += reaction.output.Second + reactionsNeeded++ + } + for inChem, inAmt := range reaction.inputs { + neededInputs[inChem] += inAmt * reactionsNeeded + } + } + if len(neededInputs) > 0 { + recursed := recurse(neededInputs) + for k, v := range recursed { + neededInputs[k] += v + } + } + return neededInputs + } + recursed := recurse(neededMaterial) + fmt.Println(len(recursed)) + + ore := 0 + for inChem, inAmt := range fuelReaction.inputs { + requiredOre, _ := d.getOreRequiredFor(inChem, inAmt) + ore += requiredOre + } + + return fmt.Sprintf("%s%d%s", u.TextBold, ore, u.TextReset) +} + +func (d *Day14) Part2() string { + return "" +} diff --git a/inputs/14p.txt b/inputs/14p.txt new file mode 100644 index 0000000..080be18 --- /dev/null +++ b/inputs/14p.txt @@ -0,0 +1,60 @@ +11 RVCS => 8 CBMDT +29 QXPB, 8 QRGRH => 8 LGMKD +3 VPRVD => 6 PMFZG +1 CNWNQ, 11 MJVXS => 6 SPLM +13 SPDRZ, 13 PMFZG => 2 BLFM +8 QWPFN => 7 LWVB +1 SPLM => 8 TKWQ +2 QRGRH, 6 CNWNQ => 7 DTZW +2 DMLT, 1 SPLM, 1 TMDK => 9 NKNS +1 MJVXS, 1 HLBV => 7 PQCQH +1 JZHZP, 9 LWVB => 7 MJSCQ +29 DGFR => 7 QRGRH +14 XFLKQ, 2 NKNS, 4 KMNJF, 3 MLZGQ, 7 TKWQ, 24 WTDW, 11 CBMDT => 4 GJKX +4 TKWQ, 1 WLCFR => 4 PDKGT +2 NKNS => 4 GDKL +4 WRZST => 9 XFLKQ +19 DGFR => 4 VPRVD +10 MJSCQ, 4 QWPFN, 4 QXPB => 2 MLZGQ +1 JZHZP => 7 QWPFN +1 XFLKQ => 9 FQGVL +3 GQGXC => 9 VHGP +3 NQZTV, 1 JZHZP => 2 NVZWL +38 WLCFR, 15 GJKX, 44 LGMKD, 2 CBVXG, 2 GDKL, 77 FQGVL, 10 MKRCZ, 29 WJQD, 33 BWXGC, 19 PQCQH, 24 BKXD => 1 FUEL +102 ORE => 5 DGFR +17 NWKLB, 1 SBPLK => 5 HRQM +3 BWXGC => 8 TQDP +1 TQDP => 2 PSZDZ +2 MJVXS => 9 WNXG +2 NBTW, 1 HRQM => 2 SVHBH +8 CNWNQ, 1 DTZW => 4 RVCS +4 VHGP, 20 WNXG, 2 SVHBH => 3 SPDRZ +110 ORE => 5 TXMC +10 QRGRH => 5 NWKLB +1 SBPLK => 3 MJVXS +9 DGFR => 5 RFSRL +5 LBTV => 3 DMLT +1 NWKLB, 1 KMNJF, 1 HDQXB, 6 LBTV, 2 PSZDZ, 34 PMFZG, 2 SVHBH => 2 WJQD +1 RVCS => 5 MKRCZ +14 NQZTV, 3 FPLT, 1 SJMS => 2 GQGXC +18 RFSRL, 13 VHGP, 23 NBTW => 5 WTDW +1 VHGP, 6 TKWQ => 7 QXPB +1 JZHZP, 1 CNWNQ => 5 KMNJF +109 ORE => 9 BWXGC +2 CNWNQ, 1 PDKGT, 2 KMNJF => 5 HDQXB +1 PDKGT, 18 WRZST, 9 MJSCQ, 3 VHGP, 1 BLFM, 1 LGMKD, 7 WLCFR => 2 BKXD +11 MLJK => 6 FPLT +8 DGFR, 2 TXMC, 3 WJRC => 9 SJMS +2 SBPLK => 1 LBTV +22 QWPFN => 4 WRZST +5 WRZST, 22 WNXG, 1 VHGP => 7 NBTW +7 RVCS => 9 TMDK +1 DGFR, 14 TXMC => 5 JZHZP +2 JZHZP => 3 SBPLK +19 PDKGT => 8 HLBV +195 ORE => 6 WJRC +6 GQGXC => 8 CNWNQ +1 NVZWL, 4 GQGXC => 2 CBVXG +1 NVZWL, 1 KMNJF => 8 WLCFR +153 ORE => 4 MLJK +1 BWXGC => 6 NQZTV \ No newline at end of file diff --git a/inputs/14s1.txt b/inputs/14s1.txt new file mode 100644 index 0000000..26a4d7e --- /dev/null +++ b/inputs/14s1.txt @@ -0,0 +1,6 @@ +10 ORE => 10 A +1 ORE => 1 B +7 A, 1 B => 1 C +7 A, 1 C => 1 D +7 A, 1 D => 1 E +7 A, 1 E => 1 FUEL \ No newline at end of file diff --git a/inputs/14s2.txt b/inputs/14s2.txt new file mode 100644 index 0000000..80a5907 --- /dev/null +++ b/inputs/14s2.txt @@ -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 \ No newline at end of file diff --git a/inputs/14s3.txt b/inputs/14s3.txt new file mode 100644 index 0000000..fe06479 --- /dev/null +++ b/inputs/14s3.txt @@ -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 \ No newline at end of file diff --git a/inputs/14s4.txt b/inputs/14s4.txt new file mode 100644 index 0000000..7c1333b --- /dev/null +++ b/inputs/14s4.txt @@ -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 \ No newline at end of file diff --git a/inputs/14s5.txt b/inputs/14s5.txt new file mode 100644 index 0000000..753fa4e --- /dev/null +++ b/inputs/14s5.txt @@ -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 \ No newline at end of file diff --git a/main.go b/main.go index a74f480..a21ec5d 100644 --- a/main.go +++ b/main.go @@ -44,6 +44,7 @@ var dayMap = []day{ &days.Day11{}, &days.Day12{}, &days.Day13{}, + &days.Day14{}, } func main() {