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 <cstdint>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <unordered_map>
|
||||
#include <algorithm>
|
||||
#include <regex>
|
||||
#include <charconv>
|
||||
#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) {
|
||||
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) {
|
||||
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