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.
 
 

75 lines
1.9 KiB

#include <iostream>
#include <utility>
#include <sstream>
#include <string>
#include <array>
#include <stdexcept>
#include <functional>
#include "solutions.hpp"
using namespace std;
typedef std::pair<std::string, std::string>(*solution_t)(std::istream&);
template <unsigned long N> void init_solutions(std::array<solution_t, N> &solutions);
template <unsigned int N>
pair<string, string> solve(istream&) {
stringstream s;
s << "solution " << N << " not implemented";
throw logic_error(s.str());
}
template <unsigned long I>
constexpr void do_init(solution_t *solutions) {
solutions[I-1] = solve<I>;
do_init<I-1>(solutions);
}
template <>
constexpr void do_init<1>(solution_t *solutions) {
solutions[0] = solve<1>;
}
template <unsigned long N>
void init_solutions(array<solution_t, N> &solutions) {
do_init<N>(solutions.data());
}
int main(int argc, char *argv[]) {
array<pair<string,string>(*)(istream&), 25> solutions;
init_solutions(solutions);
if (argc < 2) {
return 0;
}
int problem_number = stoi(string(argv[1]));
try {
auto x = solutions.at(problem_number-1);
auto answer = x(cin);
cout << "Solution 1: " << answer.first << endl;
cout << "Solution 2: " << answer.second << endl;
} catch (exception const &e) {
cerr << "error: " << e.what() << endl;
}
return 0;
}
//istream get_input() {
// CURL *curl;
// CURLcode res;
//
// char url[44] = {0};
// sprintf(url, "https://adventofcode.com/2020/day/%d/input");
//
// curl_global_init(CURL_GLOBAL_ALL);
// curl = curl_easy_init();
// curl_easy_setopt(curl, CURLOPT_URL, "https://adventofcode.com/2020/day/1/input");
// curl_easy_setopt(curl, CURLOPT_URL, "https://adventofcode.com/2020/day/1/input");
//
// curl_global_cleanup();
//}
// TODO: automatically download input files and stuff
// char *home_dir = getenv("HOME");
// if (home_dir != NULL) {
//
// }