diff --git a/src/days/06/Day06.cpp b/src/days/06/Day06.cpp index 80b06d0..34565f1 100644 --- a/src/days/06/Day06.cpp +++ b/src/days/06/Day06.cpp @@ -1,12 +1,14 @@ #include "Day06.h" +#include Result Day06::Task1() { uint64 product = 1; for (auto &[time, distance] : parseRecords()){ - uint64 wins = 0; - for (uint64 holdTime = 1; holdTime < time; holdTime++) - if ((time - holdTime) * holdTime > distance) wins++; + auto [x1, x2] = calculateEdges(double(time), double(distance)); + + uint64 wins = uint64(ceil(x2 - 1)) - uint64(x1); + product *= wins; } @@ -16,9 +18,9 @@ Result Day06::Task1() { Result Day06::Task2() { auto [time, distance] = parseRecord(); - uint64 wins = 0; - for (uint64 holdTime = 1; holdTime < time; holdTime++) - if ((time - holdTime) * holdTime > distance) wins++; + auto [x1, x2] = calculateEdges(double(time), double(distance)); + + uint64 wins = uint64(ceil(x2 - 1)) - uint64(x1); return to_string(wins); } @@ -44,3 +46,10 @@ Day06::Record Day06::parseRecord() const { uint64 distance = std::stoul(rawDistance); return {time, distance}; } + +pair 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}; +} diff --git a/src/days/06/Day06.h b/src/days/06/Day06.h index e3e1685..262fbff 100644 --- a/src/days/06/Day06.h +++ b/src/days/06/Day06.h @@ -11,4 +11,5 @@ protected: vector parseRecords() const; Record parseRecord() const; + static pair calculateEdges(double t, double d); }; \ No newline at end of file