Compare commits

...

3 Commits

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

@ -11,4 +11,23 @@ Expects runtime arguments as days, for example:
"5 9 1" executes Days 5, 9, 1 in this order.
Add argument "T" before to use XX_testInput.txt rather than XX_input.txt
#### Test Inputs
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,9 +51,12 @@ vector<Stack> Day05::parseStacks(){
for (int i = 0; i < stackCount; i++){
parsed.emplace_back();
int index = 1 + 4 * i;
for (size_t line = endIndex - 2; input[line].size() > index && input[line][index] != ' '; line--){
Crate crate = input[line][index];
parsed[i].push_back(crate);
if (line == 0)
break;
}
}

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

@ -10,4 +10,18 @@
using std::stoi, std::to_string;
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