Compare commits

..

2 Commits

  1. 52
      src/days/06/Day06.cpp
  2. 5
      src/days/06/Day06.h
  3. 23
      src/util.cpp
  4. 4
      src/util.h

@ -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};
}

@ -3,8 +3,13 @@
#include "../../Day.h"
class Day06 : public Day {
typedef pair<uint64, uint64> Record;
protected:
Result Task1() override;
Result Task2() override;
vector<Record> parseRecords() const;
Record parseRecord() const;
static pair<double, double> calculateEdges(double t, double d);
};

@ -44,4 +44,27 @@ bool isDigit(char c, uint8_t &result) {
bool isDigit(char c) {
auto val = c - '0';
return val >= 0 && val < 10;
}
vector<uint64> parseInts(const string &data) {
vector<uint64> result;
uint64 value = 0;
bool readingInt = false;
for (const char c : data){
uint8_t digit;
if (isDigit(c, digit)) {
value = value * 10 + digit;
readingInt = true;
} else if (readingInt){
readingInt = false;
result.push_back(value);
value = 0;
}
}
if (readingInt)
result.push_back(value);
return result;
}

@ -28,4 +28,6 @@ vector<string> split(const string &data, char c);
bool isDigit(char c, uint8_t &result);
bool isDigit(char c);
bool isDigit(char c);
vector<uint64> parseInts(const string &data);
Loading…
Cancel
Save