summaryrefslogtreecommitdiff
path: root/2020/1a.cpp
diff options
context:
space:
mode:
Diffstat (limited to '2020/1a.cpp')
-rw-r--r--2020/1a.cpp90
1 files changed, 90 insertions, 0 deletions
diff --git a/2020/1a.cpp b/2020/1a.cpp
new file mode 100644
index 0000000..179598b
--- /dev/null
+++ b/2020/1a.cpp
@@ -0,0 +1,90 @@
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <vector>
+#include <bitset>
+#include <functional>
+#include <cstdlib>
+#include <climits>
+#include <ctime>
+#include <cassert>
+
+
+static double time_func(std::function<void()> func) {
+ const double minmeasure = 2.0;
+ const double factor = 1.5;
+
+ for (int reps = 1;
+ reps < INT_MAX / factor;
+ reps = std::max<int>(reps + 1, reps * factor)) {
+ const clock_t t_start = clock();
+ for (int k = 0; k < reps; k++) func();
+ const clock_t t_end = clock();
+ const double time_taken = (double)(t_end - t_start) / CLOCKS_PER_SEC;
+ std::cerr << reps << "x -> " << time_taken << "s" << std::endl;
+ if (time_taken >= minmeasure) return time_taken / reps;
+ }
+
+ assert(false);
+}
+
+static std::string read_input() {
+ std::ios::sync_with_stdio(false);
+
+ std::ifstream file{"1.in"};
+ file.seekg(0, std::ios::end);
+ size_t filesize = file.tellg();
+ file.seekg(0);
+
+ std::string input(filesize, '\0');
+ size_t cursor = 0;
+ while (cursor < filesize) {
+ file.read(&input[cursor], filesize - cursor);
+ cursor += file.gcount();
+ }
+
+ return input;
+}
+
+static std::pair<int, int> solve(const std::string &input) {
+ std::vector<int> numbers;
+ numbers.reserve(input.size() / 2);
+
+ std::bitset<2021> have;
+
+ char *endp = nullptr;
+ const char *cursor = input.data();
+ while (true) {
+ int val = strtol(cursor, &endp, 10);
+ if (endp == cursor) break;
+ numbers.push_back(val);
+ have[val] = true;
+ cursor = endp;
+ }
+
+ int ans1 = -1;
+ for (int n : numbers) {
+ if (2020 - n >= 0 && have[2020 - n]) {
+ ans1 = n * (2020 - n);
+ break;
+ }
+ }
+
+ for (int n : numbers) {
+ for (int m : numbers) {
+ const int k = 2020 - (n + m);
+ if (k >= 0 && have[k]) {
+ return std::make_pair(ans1, n * m * k);
+ }
+ }
+ }
+
+ assert(false);
+}
+
+int main() {
+ const std::string input = read_input();
+ auto out = solve(input);
+ std::cout << out.first << '\n' << out.second << std::endl;
+ std::cout << time_func([&input](){ solve(input); }) << std::endl;
+}