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 "Day06.h" |
||||||
|
#include <cmath> |
||||||
|
|
||||||
Result Day06::Task1() { |
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() { |
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