From 5306e7aa94d7f260027c62df6db5e521fa202127 Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Sat, 14 Dec 2019 14:15:59 +0100 Subject: [PATCH] Implement day 14 part 1. --- 2019/inputs/14.txt | 58 ++++++++++++++++++ 2019/src/day14.cpp | 108 +++++++++++++++++++++++++++++++++- 2019/tests/samples/14-1-1.in | 6 ++ 2019/tests/samples/14-1-1.out | 1 + 2019/tests/samples/14-1-2.in | 7 +++ 2019/tests/samples/14-1-2.out | 1 + 2019/tests/samples/14-1-3.in | 9 +++ 2019/tests/samples/14-1-3.out | 1 + 2019/tests/samples/14-1-4.in | 12 ++++ 2019/tests/samples/14-1-4.out | 1 + 2019/tests/samples/14-1-5.in | 17 ++++++ 2019/tests/samples/14-1-5.out | 1 + 12 files changed, 220 insertions(+), 2 deletions(-) create mode 100644 2019/inputs/14.txt create mode 100644 2019/tests/samples/14-1-1.in create mode 100644 2019/tests/samples/14-1-1.out create mode 100644 2019/tests/samples/14-1-2.in create mode 100644 2019/tests/samples/14-1-2.out create mode 100644 2019/tests/samples/14-1-3.in create mode 100644 2019/tests/samples/14-1-3.out create mode 100644 2019/tests/samples/14-1-4.in create mode 100644 2019/tests/samples/14-1-4.out create mode 100644 2019/tests/samples/14-1-5.in create mode 100644 2019/tests/samples/14-1-5.out diff --git a/2019/inputs/14.txt b/2019/inputs/14.txt new file mode 100644 index 0000000..c9b5f41 --- /dev/null +++ b/2019/inputs/14.txt @@ -0,0 +1,58 @@ +3 DJDNR => 1 ZCMR +7 VWJH => 5 ZPGT +5 BHZP => 2 DJDNR +6 KCNKC, 19 MZWS => 4 PKVJF +21 GXSHP, 1 TWGP, 3 BGCW => 1 XHRWR +12 DZGWQ, 2 XRDL, 3 XNVT => 2 FTMC +7 VWJH, 33 BGCW, 1 TBVC => 9 DSDP +1 NMTGB, 4 KCNKC, 5 SBSJ, 4 MCZDZ, 7 DLCP, 2 GRBZF, 1 CLKP, 10 VQHJG => 6 DVCR +7 ZCMR => 9 VNTF +2 VNTF, 1 GKMN => 1 TZWBH +6 QMFV, 7 GRBZF => 7 RHDZ +8 PKVJF => 9 NJQH +110 ORE => 9 GZTS +4 DJDNR, 7 SFHV => 8 KQFH +1 ZTCZ, 5 LZFBP => 7 VWPMZ +2 GKMN, 6 TZWBH, 1 GXSHP => 1 MJHJH +2 DLCP, 4 NGJRN => 3 GRBZF +2 DJDNR, 1 GSRBL => 4 VWJH +7 RMQX => 3 SFHV +1 GZTS => 7 GSRBL +3 GZTS, 1 SFHV => 3 QLXCS +10 SFHV => 3 MKTHL +2 DJDNR, 2 BGCW, 4 FSTJ => 3 GKMN +2 KQFH, 7 GSRBL => 7 TWGP +22 RHDZ, 22 DZGWQ, 2 NGJRN, 14 XHRWR, 21 VWPMZ, 15 ZPXHM, 26 BHZP => 8 BPHZ +1 QLXCS => 6 ZBTS +12 DLCP, 9 DSDP => 9 ZPXHM +1 VNTF => 5 ZBTX +2 TZWBH, 2 JCDW => 1 CPLG +1 XHRWR, 7 FSTJ, 5 DZGWQ => 4 NGJRN +179 ORE => 3 RMQX +1 DSDP => 1 MZWS +140 ORE => 8 BHZP +1 LZFBP, 4 DZGWQ => 2 PMDK +1 GZTS => 1 GXSHP +10 CPLG, 8 MCZDZ => 5 ZTCZ +5 ZPGT, 4 THLBN, 24 GSRBL, 40 VNTF, 9 DVCR, 2 SHLP, 11 PMDK, 19 BPHZ, 45 NJQH => 1 FUEL +9 MKTHL => 7 KCNKC +5 NGJRN => 3 QMFV +1 ZTCZ, 6 VNTF => 2 VQHJG +5 FTMC, 5 ZBTX, 1 MJHJH => 1 CLKP +7 FSTJ => 6 DLCP +1 DSDP => 5 KTML +4 LZFBP, 8 MKTHL => 7 MCZDZ +1 SFHV => 1 DZGWQ +2 QLXCS => 4 ZMXRH +3 KQFH, 1 DJDNR => 7 TBVC +5 DSDP => 7 THLBN +9 BHZP, 1 VWJH => 6 BGCW +4 GXSHP => 6 JCDW +1 KQFH, 3 ZMXRH => 9 XNVT +6 TBVC => 4 GVMH +3 VWPMZ, 3 GRBZF, 27 MJHJH, 2 QMFV, 4 NMTGB, 13 KTML => 7 SHLP +1 GVMH => 2 FSTJ +2 VQHJG, 2 NJQH => 8 SBSJ +1 XNVT => 2 XRDL +2 KCNKC => 5 LZFBP +2 ZBTS, 8 DLCP => 4 NMTGB diff --git a/2019/src/day14.cpp b/2019/src/day14.cpp index b0441a4..773f4c4 100644 --- a/2019/src/day14.cpp +++ b/2019/src/day14.cpp @@ -1,10 +1,114 @@ #include +#include +#include +#include +#include +#include +#include +#include #include "days.hpp" +namespace { + typedef std::pair requirement_t; + typedef std::vector reqlist_t; + + std::map read_recipes(std::istream &input) { + std::map recipes; + + std::string buffer; + std::regex listing_regex("(\\d+) ([A-Z]+)"); + + std::int64_t amount; + + while (std::getline(input, buffer)) { + reqlist_t requirements, production; + + std::string_view line = buffer; + + auto split_point = line.find(" => "); + + auto requirements_part = line.substr(0, split_point); + auto production_part = line.substr(split_point + 4); + + for(auto it = std::regex_token_iterator(requirements_part.begin(), requirements_part.end(), listing_regex, {1, 2}); it != std::cregex_token_iterator(); ++it) { + std::from_chars(it->first, it->second, amount); + ++it; + + requirements.emplace_back(*it, amount); + } + + for(auto it = std::regex_token_iterator(production_part.begin(), production_part.end(), listing_regex, {1, 2}); it != std::cregex_token_iterator(); ++it) { + std::from_chars(it->first, it->second, amount); + ++it; + + production.emplace_back(*it, amount); + } + + recipes[std::move(production)] = std::move(requirements); + } + + return recipes; + } + + template + std::unordered_map element_creators(const Map &map) { + std::unordered_map inverted; + + for (auto &entry : map) { + for (auto &x : entry.first) { + inverted[x.first] = entry.first; + } + } + + return inverted; + } + + std::int64_t + ore_required(const std::string &element, std::int64_t amount, std::unordered_map &stock, + const std::map &recipes, std::unordered_map inverted) { + if (element == "ORE") { + return amount; + } + + if (stock[element] > 0) { + auto from_stock = std::min(amount, stock[element]); + amount -= from_stock; + stock[element] -= from_stock; + } + + auto &productions = inverted.at(element); + auto &requirements = recipes.at(productions); + + auto number_produced = std::find_if(productions.begin(), productions.end(), + [element](const auto &x) { return x.first == element; })->second; + + auto productions_needed = amount / number_produced + (amount % number_produced ? 1 : 0); + + std::int64_t ore_needed = 0; + + for (auto &requirement : requirements) { + ore_needed += ore_required(requirement.first, requirement.second * productions_needed, stock, recipes, + inverted); + } + + for (auto &production : productions) { + stock[production.first] += productions_needed * production.second; + } + + stock[element] -= amount; + + return ore_needed; + } +} + void aoc2019::day14_part1(std::istream &input, std::ostream &output) { - output << "Not implemented\n"; + auto recipes = read_recipes(input); + auto inverted = element_creators(recipes); + std::unordered_map stock; + + output << ore_required("FUEL", 1, stock, recipes, inverted) << std::endl; } void aoc2019::day14_part2(std::istream &input, std::ostream &output) { - output << "Not implemented\n"; + output << "Not implemented\n"; } diff --git a/2019/tests/samples/14-1-1.in b/2019/tests/samples/14-1-1.in new file mode 100644 index 0000000..65ad5cc --- /dev/null +++ b/2019/tests/samples/14-1-1.in @@ -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 diff --git a/2019/tests/samples/14-1-1.out b/2019/tests/samples/14-1-1.out new file mode 100644 index 0000000..e85087a --- /dev/null +++ b/2019/tests/samples/14-1-1.out @@ -0,0 +1 @@ +31 diff --git a/2019/tests/samples/14-1-2.in b/2019/tests/samples/14-1-2.in new file mode 100644 index 0000000..85c4b1e --- /dev/null +++ b/2019/tests/samples/14-1-2.in @@ -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/2019/tests/samples/14-1-2.out b/2019/tests/samples/14-1-2.out new file mode 100644 index 0000000..9e42f3e --- /dev/null +++ b/2019/tests/samples/14-1-2.out @@ -0,0 +1 @@ +165 diff --git a/2019/tests/samples/14-1-3.in b/2019/tests/samples/14-1-3.in new file mode 100644 index 0000000..4d6b9f0 --- /dev/null +++ b/2019/tests/samples/14-1-3.in @@ -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/2019/tests/samples/14-1-3.out b/2019/tests/samples/14-1-3.out new file mode 100644 index 0000000..ccb0cfe --- /dev/null +++ b/2019/tests/samples/14-1-3.out @@ -0,0 +1 @@ +13312 diff --git a/2019/tests/samples/14-1-4.in b/2019/tests/samples/14-1-4.in new file mode 100644 index 0000000..c670978 --- /dev/null +++ b/2019/tests/samples/14-1-4.in @@ -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/2019/tests/samples/14-1-4.out b/2019/tests/samples/14-1-4.out new file mode 100644 index 0000000..cb19a6c --- /dev/null +++ b/2019/tests/samples/14-1-4.out @@ -0,0 +1 @@ +180697 diff --git a/2019/tests/samples/14-1-5.in b/2019/tests/samples/14-1-5.in new file mode 100644 index 0000000..a5ca2c3 --- /dev/null +++ b/2019/tests/samples/14-1-5.in @@ -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/2019/tests/samples/14-1-5.out b/2019/tests/samples/14-1-5.out new file mode 100644 index 0000000..b65e868 --- /dev/null +++ b/2019/tests/samples/14-1-5.out @@ -0,0 +1 @@ +2210736