You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
1.3 KiB
47 lines
1.3 KiB
#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;
|
|
|
|
template <>
|
|
pair<string, string> solve<1>(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);
|
|
}
|