|
|
|
@ -0,0 +1,46 @@ |
|
|
|
#include <string>
|
|
|
|
#include <utility> // for std::pair
|
|
|
|
#include <iostream>
|
|
|
|
#include <cstdint>
|
|
|
|
#include <unordered_set>
|
|
|
|
#include <unordered_map>
|
|
|
|
//#include <set>
|
|
|
|
#include <vector>
|
|
|
|
#include <algorithm>
|
|
|
|
|
|
|
|
#include "solutions.hpp"
|
|
|
|
|
|
|
|
using namespace std; |
|
|
|
|
|
|
|
pair<string, string> solve1(istream &input) { |
|
|
|
unordered_set<int64_t> seen; |
|
|
|
unordered_map<int64_t, pair<int64_t, int64_t>> targets; |
|
|
|
string part1; |
|
|
|
string part2; |
|
|
|
bool part1_solved = false; |
|
|
|
bool part2_solved = false; |
|
|
|
for(string line; getline(input, line); ) { |
|
|
|
int64_t number = stoi(line); |
|
|
|
if (!part1_solved && seen.contains(2020 - number)) { |
|
|
|
part1 = to_string((2020 - number) * number); |
|
|
|
part1_solved = true; |
|
|
|
} |
|
|
|
if (!part2_solved) { |
|
|
|
auto search = targets.find(number); |
|
|
|
if (search != targets.end()) { |
|
|
|
part2 = to_string(number * search->second.first * search->second.second); |
|
|
|
part2_solved = true; |
|
|
|
} |
|
|
|
for (int64_t partner : seen) { |
|
|
|
if (number + partner <= 2020) { |
|
|
|
targets[2020 - number - partner] = pair(number, partner); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
if (part1_solved && part2_solved) { |
|
|
|
return pair(part1, part2); |
|
|
|
} |
|
|
|
seen.insert(number); |
|
|
|
} |
|
|
|
return pair(part1, part2); |
|
|
|
} |