Day 5 Question 2 (late)

This commit is contained in:
2025-12-10 16:40:54 +02:00
parent 6b70d4955c
commit 4d07589255
3 changed files with 1268 additions and 0 deletions

1187
Day5/Question2/input Normal file

File diff suppressed because it is too large Load Diff

11
Day5/Question2/inputTest Normal file
View File

@@ -0,0 +1,11 @@
3-5
10-14
16-20
12-18
1
5
8
11
17
32

70
Day5/Question2/main.cpp Normal file
View File

@@ -0,0 +1,70 @@
#include <cstdint>
#include <fstream>
#include <iostream>
#include <map>
#include <string>
typedef uint64_t inclusiveLowerBound;
typedef uint64_t inclusiveUpperBound;
int main() {
std::fstream input("input");
std::string currentLine = "";
std::multimap<inclusiveLowerBound, inclusiveUpperBound> ranges{};
uint16_t positionOfHypen = 0;
uint64_t upperBound = 0, lowerBound = 0;
// Range and values are seperated by an empty \n
while (std::getline(input, currentLine, '\n')) {
if (currentLine == "") {
break;
}
positionOfHypen = currentLine.find('-');
lowerBound = std::stoull(currentLine.substr(0, positionOfHypen));
upperBound = std::stoull(currentLine.substr(positionOfHypen + 1));
ranges.insert({lowerBound, upperBound});
}
// First time doing this with ranges
auto range = ranges.begin();
while (range != ranges.end()) {
auto secondRange = range;
secondRange++;
while (secondRange != ranges.end()) {
// 3 Possible cases
bool isEndOfFirstBiggerThanSecond = range->second >= secondRange->second;
// 1. Second range is fully inside First range
if (isEndOfFirstBiggerThanSecond) {
secondRange = ranges.erase(secondRange);
continue;
}
// 2. Second Range's end is bigger than first, but Second's start is
// smaller than first's end
if (!isEndOfFirstBiggerThanSecond &&
range->second >= secondRange->first) {
range->second = secondRange->second;
secondRange = ranges.erase(secondRange);
continue;
}
// 3. Nothing happens, they are not overlapping
secondRange++;
// Note: The begining of first range WILL ALWAYS be smaller than second
}
range++;
}
uint64_t password = 0;
for (auto keys : ranges) {
password += keys.second - keys.first + 1; // 1 is for range to be inclusive
}
std::cout << password << std::endl;
return 0;
}