67 lines
1.6 KiB
C++
67 lines
1.6 KiB
C++
#include <iostream>
|
|
#include <fstream>
|
|
#include <regex>
|
|
|
|
using namespace std;
|
|
|
|
// Advent of Code 2023, Day 4
|
|
|
|
int main() {
|
|
ifstream input("input.txt");
|
|
|
|
int sums = 0;
|
|
for (string line; getline(input, line);) {
|
|
regex e("Card\\s*[0-9]+: (.*)");
|
|
smatch m;
|
|
|
|
if (!regex_search(line, m, e) && m.size() <= 1) continue;
|
|
|
|
string set = m.str(1) + " ";
|
|
|
|
string currentNumber;
|
|
vector<int> winning;
|
|
vector<int> guesses;
|
|
|
|
bool buildMode = false;
|
|
bool guessing = false;
|
|
for (char current : set) {
|
|
if (current == '|') {
|
|
guessing = true;
|
|
continue;
|
|
}
|
|
|
|
if (isdigit(current)) {
|
|
currentNumber.push_back(current);
|
|
buildMode = true;
|
|
continue;
|
|
}
|
|
|
|
if (buildMode && current == ' ') {
|
|
if (guessing) {
|
|
guesses.push_back(stoi(currentNumber));
|
|
} else {
|
|
winning.push_back(stoi(currentNumber));
|
|
}
|
|
currentNumber = "";
|
|
buildMode = false;
|
|
}
|
|
}
|
|
|
|
int winningNums = 0;
|
|
for (auto item : winning) {
|
|
if (std::find(guesses.begin(), guesses.end(), item) != guesses.end()) {
|
|
if (winningNums == 0) {
|
|
winningNums = 1;
|
|
continue;
|
|
}
|
|
winningNums *= 2;
|
|
}
|
|
}
|
|
|
|
cout << line << " [" << winningNums << "]" << endl;
|
|
|
|
sums += winningNums;
|
|
}
|
|
|
|
cout << endl << "Sum: " << sums;
|
|
} |