Compare commits
2 Commits
bfa9abdc5c
...
37153165fa
Author | SHA1 | Date |
---|---|---|
Benjamin Kraft | 37153165fa | 9 months ago |
Benjamin Kraft | ecb5fc9f06 | 9 months ago |
4 changed files with 80 additions and 4 deletions
@ -1,9 +1,55 @@ |
||||
#include "Day06.h" |
||||
#include <cmath> |
||||
|
||||
Result Day06::Task1() { |
||||
return Day::Task1(); |
||||
uint64 product = 1; |
||||
|
||||
for (auto &[time, distance] : parseRecords()){ |
||||
auto [x1, x2] = calculateEdges(double(time), double(distance)); |
||||
|
||||
uint64 wins = uint64(ceil(x2 - 1)) - uint64(x1); |
||||
|
||||
product *= wins; |
||||
} |
||||
|
||||
return to_string(product); |
||||
} |
||||
|
||||
Result Day06::Task2() { |
||||
return Day::Task2(); |
||||
} |
||||
auto [time, distance] = parseRecord(); |
||||
|
||||
auto [x1, x2] = calculateEdges(double(time), double(distance)); |
||||
|
||||
uint64 wins = uint64(ceil(x2 - 1)) - uint64(x1); |
||||
|
||||
return to_string(wins); |
||||
} |
||||
|
||||
vector<Day06::Record> Day06::parseRecords() const { |
||||
vector<Record> records; |
||||
|
||||
vector<uint64> time = parseInts(input[0].substr(5)); |
||||
vector<uint64> distance = parseInts(input[1].substr(10)); |
||||
|
||||
for (size_t i = 0; i < time.size(); i++) |
||||
records.emplace_back(time[i], distance[i]); |
||||
|
||||
return records; |
||||
} |
||||
|
||||
Day06::Record Day06::parseRecord() const { |
||||
string rawTime = input[0].substr(10); |
||||
std::erase(rawTime, ' '); |
||||
string rawDistance = input[1].substr(10); |
||||
std::erase(rawDistance, ' '); |
||||
uint64 time = std::stoul(rawTime); |
||||
uint64 distance = std::stoul(rawDistance); |
||||
return {time, distance}; |
||||
} |
||||
|
||||
pair<double, double> Day06::calculateEdges(double t, double d) { |
||||
// parabula f(x) = -x² + tx | set it equal to d, calculate x1, x2
|
||||
double x1 = t / 2 - sqrt(t * t / 4 - d); |
||||
double x2 = t / 2 + sqrt(t * t / 4 - d); |
||||
return {x1, x2}; |
||||
} |
||||
|
Loading…
Reference in new issue