Compare commits

..

No commits in common. '0c62846bbdd22f9b2b6c3cbe39c49d68c6cf9893' and '521917cd68ff53ae4fcbcff88a8eb04b11767032' have entirely different histories.

  1. 21
      README.md
  2. 3
      src/days/05/Day05.cpp
  3. 48
      src/main.cpp
  4. 16
      src/util.h

@ -11,23 +11,4 @@ Expects runtime arguments as days, for example:
"5 9 1" executes Days 5, 9, 1 in this order. "5 9 1" executes Days 5, 9, 1 in this order.
#### Test Inputs Add argument "T" before to use XX_testInput.txt rather than XX_input.txt
Add argument "T" after each Day to use XX_testInput.txt rather than XX_input.txt
For Test-Inputs, it tries to fetch the content of the first code-Tag. You can control this by adding the index of the desired code-Tag.
Example:
"3T 6T1 9"
- Day 3 with content from inside the first code-Tag
- Day 6 with content from inside the second code-Tag
- Day 9 with regular input
#### Get index with Browser Dev Tools:
Select the correct code-Tag in the inspector, then paste this into the console:
<code>
Array.from(document.getElementsByTagName("code")).indexOf($0)
</code>

@ -51,12 +51,9 @@ vector<Stack> Day05::parseStacks(){
for (int i = 0; i < stackCount; i++){ for (int i = 0; i < stackCount; i++){
parsed.emplace_back(); parsed.emplace_back();
int index = 1 + 4 * i; int index = 1 + 4 * i;
for (size_t line = endIndex - 2; input[line].size() > index && input[line][index] != ' '; line--){ for (size_t line = endIndex - 2; input[line].size() > index && input[line][index] != ' '; line--){
Crate crate = input[line][index]; Crate crate = input[line][index];
parsed[i].push_back(crate); parsed[i].push_back(crate);
if (line == 0)
break;
} }
} }

@ -2,7 +2,8 @@
#include <cpr/cpr.h> #include <cpr/cpr.h>
#include "days/days.h" #include "days/days.h"
Input getInput(int day, string key, bool useTestInput, int testFetchIndex) {
Input getInput(int day, string key, bool useTestInput) {
Input input; Input input;
char dayStrPadded[3]; char dayStrPadded[3];
@ -11,30 +12,18 @@ Input getInput(int day, string key, bool useTestInput, int testFetchIndex) {
string localFilePath = "input/" + string(dayStrPadded) + postfix; string localFilePath = "input/" + string(dayStrPadded) + postfix;
if (!std::filesystem::exists({localFilePath})) { if (!std::filesystem::exists({localFilePath})) {
if (key.empty())
return input;
string dayStr = std::to_string(day); string dayStr = std::to_string(day);
string url = "https://adventofcode.com/2022/day/" + dayStr; string url = "https://adventofcode.com/2022/day/" + dayStr + "/input";
auto cookies = cpr::Cookies{{"session", key}}; cout << "Input does not exist. Fetching from " + url << endl;
if (!useTestInput){ std::ofstream file(localFilePath);
if (key.empty()){ file << cpr::Get(cpr::Url{url}, cpr::Cookies{{"session", key}}).text;
cout << "Session key Cookie is missing, cannot fetch Input" << endl; file.close();
return input;
}
url += "/input";
cout << "Input does not exist. Fetching from " + url << endl;
std::ofstream file(localFilePath);
file << cpr::Get(cpr::Url{url}, cookies).text;
file.close();
} else {
cout << "Test Input does not exist. Fetching from " + url << " from <code>-Tag with index " << testFetchIndex << endl;
std::ofstream file(localFilePath);
string res = cpr::Get(cpr::Url{url}).text;
size_t i1 = findAll(res, "<code>")[testFetchIndex];
size_t i2 = findAll(res, "</code>")[testFetchIndex];
file << res.substr(i1 + 6, i2 - (i1 + 6));
file.close();
}
} }
// TODO fetch testInput from first <code>-Tag in HTML
std::ifstream file(localFilePath); std::ifstream file(localFilePath);
string line; string line;
@ -59,16 +48,19 @@ string getSessionKey() {
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
auto key = getSessionKey(); auto key = getSessionKey();
bool useTestInput = false;
auto days = getAllDays(); auto days = getAllDays();
std::filesystem::create_directory("input"); std::filesystem::create_directory("input");
for (int i = 1; i < argc; i++) { int i = 1;
string arg = argv[i]; if (argc > 1 && string(argv[1]) == "T") {
bool useTestInput = arg.size() > 1 && arg[1] == 'T'; useTestInput = true;
int testFetchIndex = useTestInput && arg.size() > 2 ? arg[2] - '0' : 0; i++;
int dayNum = std::stoi(arg); }
for (; i < argc; i++) {
int dayNum = std::stoi(argv[i]);
cout << "Running day " << dayNum << endl; cout << "Running day " << dayNum << endl;
Input input = getInput(dayNum, key, useTestInput, testFetchIndex); Input input = getInput(dayNum, key, useTestInput);
Day *day = days[dayNum - 1]; Day *day = days[dayNum - 1];
int code = day->run(input); int code = day->run(input);
if (code != 0) if (code != 0)

@ -10,18 +10,4 @@
using std::stoi, std::to_string; using std::stoi, std::to_string;
using std::cout, std::endl; using std::cout, std::endl;
using std::string, std::vector, std::set, std::pair, std::map; using std::string, std::vector, std::set, std::pair, std::map;
inline vector<size_t> findAll(const string& data, const string& toSearch){
vector<size_t> indices;
size_t pos = data.find(toSearch);
while (pos != string::npos){
indices.push_back(pos);
pos = data.find(toSearch, pos + toSearch.size());
}
return indices;
}
Loading…
Cancel
Save