Added a page mapping for day 5 to reduce the array size
This commit is contained in:
parent
bc3edfd93c
commit
cf19ba7b61
|
@ -20,11 +20,16 @@
|
||||||
#include "PrintQueue.h"
|
#include "PrintQueue.h"
|
||||||
|
|
||||||
PrintQueue::PrintQueue()
|
PrintQueue::PrintQueue()
|
||||||
: Solver{}, isProcessingOrderingRules_{ true }, orderingRules_{}
|
: Solver{}, pageNoMapIndex_{ 0 }, isProcessingOrderingRules_{ true }, orderingRules_{}
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i <= maxPageNo_; i++)
|
for (size_t i = 0; i <= maxPageNo_; i++)
|
||||||
{
|
{
|
||||||
for (size_t j = 0; j <= maxPageNo_; j++)
|
pageNoMap_[i] = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t i = 0; i < nPages_; i++)
|
||||||
|
{
|
||||||
|
for (size_t j = 0; j < nPages_; j++)
|
||||||
{
|
{
|
||||||
orderingRules_[i][j] = false;
|
orderingRules_[i][j] = false;
|
||||||
}
|
}
|
||||||
|
@ -64,12 +69,21 @@ void PrintQueue::finish()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t PrintQueue::getMapped(const int pageNo)
|
||||||
|
{
|
||||||
|
if (pageNoMap_[pageNo] < 0)
|
||||||
|
{
|
||||||
|
pageNoMap_[pageNo] = pageNoMapIndex_++;
|
||||||
|
}
|
||||||
|
return pageNoMap_[pageNo];
|
||||||
|
}
|
||||||
|
|
||||||
void PrintQueue::processOrderingRule(const std::string& line)
|
void PrintQueue::processOrderingRule(const std::string& line)
|
||||||
{
|
{
|
||||||
auto pos{ line.find("|") };
|
auto pos{ line.find("|") };
|
||||||
auto before{ std::stoi(line.substr(0, pos)) };
|
auto before{ std::stoi(line.substr(0, pos)) };
|
||||||
auto after{ std::stoi(line.substr(pos + 1)) };
|
auto after{ std::stoi(line.substr(pos + 1)) };
|
||||||
orderingRules_[before][after] = true;
|
orderingRules_[getMapped(before)][getMapped(after)] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrintQueue::processUpdatePages(const std::string& line)
|
void PrintQueue::processUpdatePages(const std::string& line)
|
||||||
|
@ -85,7 +99,7 @@ void PrintQueue::processUpdatePages(const std::string& line)
|
||||||
size_t i{ 0 };
|
size_t i{ 0 };
|
||||||
while (isCorrectOrder && i < pages.size())
|
while (isCorrectOrder && i < pages.size())
|
||||||
{
|
{
|
||||||
isCorrectOrder = !orderingRules_[page][pages[i]];
|
isCorrectOrder = !orderingRules_[getMapped(page)][getMapped(pages[i])];
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
pages.push_back(page);
|
pages.push_back(page);
|
||||||
|
@ -100,7 +114,7 @@ void PrintQueue::processUpdatePages(const std::string& line)
|
||||||
// This works because the input defines a complete ordering on the occurring
|
// This works because the input defines a complete ordering on the occurring
|
||||||
// page numbers.
|
// page numbers.
|
||||||
std::sort(pages.begin(), pages.end(),
|
std::sort(pages.begin(), pages.end(),
|
||||||
[&](int const& a, int const& b) { return orderingRules_[a][b]; });
|
[&](int const& a, int const& b) { return orderingRules_[getMapped(a)][getMapped(b)]; });
|
||||||
part2 += pages[pages.size() / 2];
|
part2 += pages[pages.size() / 2];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,9 +27,13 @@ class PrintQueue :
|
||||||
void processDataLine(const std::string& line) override;
|
void processDataLine(const std::string& line) override;
|
||||||
void finish() override;
|
void finish() override;
|
||||||
private:
|
private:
|
||||||
static const size_t maxPageNo_{ 99 };
|
static const int nPages_{ 49 };
|
||||||
|
static const int maxPageNo_{ 99 };
|
||||||
bool isProcessingOrderingRules_;
|
bool isProcessingOrderingRules_;
|
||||||
bool orderingRules_[maxPageNo_ + 1][maxPageNo_ + 1];
|
int pageNoMapIndex_;
|
||||||
|
int pageNoMap_[maxPageNo_ + 1];
|
||||||
|
bool orderingRules_[nPages_][nPages_];
|
||||||
|
size_t getMapped(const int pageNo);
|
||||||
void processOrderingRule(const std::string& line);
|
void processOrderingRule(const std::string& line);
|
||||||
void processUpdatePages(const std::string& line);
|
void processUpdatePages(const std::string& line);
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue