mirror of
https://github.com/bertptrs/adventofcode.git
synced 2025-12-25 21:00:31 +01:00
Implement day 14 part 1.
This commit is contained in:
58
2019/inputs/14.txt
Normal file
58
2019/inputs/14.txt
Normal file
@@ -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
|
||||||
@@ -1,10 +1,114 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <vector>
|
||||||
|
#include <map>
|
||||||
|
#include <unordered_map>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <regex>
|
||||||
|
#include <charconv>
|
||||||
#include "days.hpp"
|
#include "days.hpp"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
typedef std::pair<std::string, std::int64_t> requirement_t;
|
||||||
|
typedef std::vector<requirement_t> reqlist_t;
|
||||||
|
|
||||||
|
std::map<reqlist_t, reqlist_t> read_recipes(std::istream &input) {
|
||||||
|
std::map<reqlist_t, reqlist_t> 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<class Map>
|
||||||
|
std::unordered_map<std::string, reqlist_t> element_creators(const Map &map) {
|
||||||
|
std::unordered_map<std::string, reqlist_t> 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<std::string, std::int64_t> &stock,
|
||||||
|
const std::map<reqlist_t, reqlist_t> &recipes, std::unordered_map<std::string, reqlist_t> 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) {
|
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<std::string, std::int64_t> stock;
|
||||||
|
|
||||||
|
output << ore_required("FUEL", 1, stock, recipes, inverted) << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void aoc2019::day14_part2(std::istream &input, std::ostream &output) {
|
void aoc2019::day14_part2(std::istream &input, std::ostream &output) {
|
||||||
output << "Not implemented\n";
|
output << "Not implemented\n";
|
||||||
}
|
}
|
||||||
|
|||||||
6
2019/tests/samples/14-1-1.in
Normal file
6
2019/tests/samples/14-1-1.in
Normal file
@@ -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
|
||||||
1
2019/tests/samples/14-1-1.out
Normal file
1
2019/tests/samples/14-1-1.out
Normal file
@@ -0,0 +1 @@
|
|||||||
|
31
|
||||||
7
2019/tests/samples/14-1-2.in
Normal file
7
2019/tests/samples/14-1-2.in
Normal file
@@ -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
|
||||||
1
2019/tests/samples/14-1-2.out
Normal file
1
2019/tests/samples/14-1-2.out
Normal file
@@ -0,0 +1 @@
|
|||||||
|
165
|
||||||
9
2019/tests/samples/14-1-3.in
Normal file
9
2019/tests/samples/14-1-3.in
Normal file
@@ -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
|
||||||
1
2019/tests/samples/14-1-3.out
Normal file
1
2019/tests/samples/14-1-3.out
Normal file
@@ -0,0 +1 @@
|
|||||||
|
13312
|
||||||
12
2019/tests/samples/14-1-4.in
Normal file
12
2019/tests/samples/14-1-4.in
Normal file
@@ -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
|
||||||
1
2019/tests/samples/14-1-4.out
Normal file
1
2019/tests/samples/14-1-4.out
Normal file
@@ -0,0 +1 @@
|
|||||||
|
180697
|
||||||
17
2019/tests/samples/14-1-5.in
Normal file
17
2019/tests/samples/14-1-5.in
Normal file
@@ -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
|
||||||
1
2019/tests/samples/14-1-5.out
Normal file
1
2019/tests/samples/14-1-5.out
Normal file
@@ -0,0 +1 @@
|
|||||||
|
2210736
|
||||||
Reference in New Issue
Block a user