Compare commits

...

6 Commits

Author SHA1 Message Date
Stedd e74ca62d02 combined part 1 and 2 2024-12-01 17:39:49 +01:00
Stedd de3c5f9f08 edited performance printout 2024-12-01 17:29:20 +01:00
Stedd 6a23fa268e Small gain in performance from reserving space
I don't want to hardcode the number of lines in the input file.
2024-12-01 17:29:02 +01:00
Stedd 3d44c7c416 Using the filestream to run the parser loop directly
Also removed col2 variable and calculating occurrence_map during parsing.
2024-12-01 17:28:18 +01:00
Stedd 89318eaf4c added stress testing 2024-12-01 16:52:23 +01:00
Stedd ba00e02c3a The if is not actually needed, I redundantly created the standard behaviour of unordered_map 2024-12-01 16:37:06 +01:00
3 changed files with 48 additions and 68 deletions

View File

@ -72,46 +72,7 @@ To find the total distance between the left list and the right list, add up the
you found. In the example above, this is 2 + 1 + 0 + 1 + 2 + 5, a total distance of 11! you found. In the example above, this is 2 + 1 + 0 + 1 + 2 + 5, a total distance of 11!
Your actual left and right lists contain many location IDs. What is the total distance between your lists? Your actual left and right lists contain many location IDs. What is the total distance between your lists?
*/
void day01::Part1()
{
std::vector<int> col1;
std::vector<int> col2;
int sum = 0;
std::ifstream input("input/day01.txt");
if (!input)
{
std::cerr << "Failed to open input file." << std::endl;
std::cout << "Current path is " << std::filesystem::current_path() << '\n';
return;
}
std::string delimiter = " ";
auto delimiterLength = delimiter.length();
std::string line;
while (std::getline(input, line))
{
auto delimiterPos = line.find(delimiter);
col1.emplace_back(std::stoi(line.substr(0, delimiterPos)));
col2.emplace_back(std::stoi(line.substr(delimiterPos + delimiterLength, line.length())));
}
std::sort(col1.begin(), col1.end());
std::sort(col2.begin(), col2.end());
for (int i = 0; i < col1.size(); ++i)
{
sum += std::abs(col1[i] - col2[i]);
}
}
/*
--- Part Two --- --- Part Two ---
Your analysis only confirmed what everyone feared: the two lists of location IDs are indeed very different. Your analysis only confirmed what everyone feared: the two lists of location IDs are indeed very different.
@ -150,15 +111,20 @@ Once again consider your left and right lists. What is their similarity score?
*/ */
void day01::Part2() void day01::Calculate()
{ {
std::vector<int> col1; std::vector<int> col1;
std::vector<int> col2; std::vector<int> col2;
std::unordered_map<int, int> occurrence_map; std::unordered_map<int, int> occurrence_map;
int sum = 0; int totalDistance = 0;
int similarityScore = 0;
size_t estimated_size = 1000;
col1.reserve(estimated_size);
col2.reserve(estimated_size);
occurrence_map.reserve(estimated_size);
std::ifstream input("input/day01.txt"); std::ifstream input("input/day01.txt");
//std::ifstream input("input/day01short.txt");
if (!input) if (!input)
{ {
@ -168,31 +134,28 @@ void day01::Part2()
return; return;
} }
std::string delimiter = " ";
auto delimiterLength = delimiter.length();
std::string line; std::string line;
while (std::getline(input, line)) int num1, num2;
while (input >> num1 >> num2)
{ {
auto delimiterPos = line.find(delimiter); col1.emplace_back(num1);
col1.emplace_back(std::stoi(line.substr(0, delimiterPos))); col2.emplace_back(num2);
col2.emplace_back(std::stoi(line.substr(delimiterPos + delimiterLength, line.length()))); occurrence_map[num2]++;
} }
for (auto number: col2) std::sort(col1.begin(), col1.end());
std::sort(col2.begin(), col2.end());
for (size_t i = 0; i < col1.size(); i++)
{ {
if (occurrence_map.contains(number)) totalDistance += std::abs(col1[i] - col2[i]);
{ similarityScore += col1[i] * occurrence_map[col1[i]];
occurrence_map[number]++;
} else
{
occurrence_map[number] = 1;
}
} }
for (auto number: col1) printf("Total distance: %d\n", totalDistance);
{ printf("Similarity score: %d\n", similarityScore);
sum += number * occurrence_map[number];
}
printf("Sum of all occurrence pairs is: %d\n", sum);
} }
//Correct answers:
//part1: 1889772
//part2: 23228917

View File

@ -10,7 +10,7 @@ class day01
{ {
public: public:
static void Part1(); static void Part1();
static void Part2(); static void Calculate();
}; };

View File

@ -5,9 +5,26 @@
int main() int main()
{ {
const auto startTime = std::chrono::high_resolution_clock::now(); double lowest = 10000;
day01::Part2(); double totalTime = 0;
const auto endTime = std::chrono::high_resolution_clock::now(); constexpr int cycles = 1;
const std::chrono::duration<double> diff = endTime - startTime; //constexpr int cycles = 10000;
std::cout << "Execution time: " << diff.count() * 1e6 << " μs" << std::endl; for (int i = 1; i <= cycles; i++)
{
const auto startTime = std::chrono::high_resolution_clock::now();
day01::Calculate();
const auto endTime = std::chrono::high_resolution_clock::now();
const std::chrono::duration<double> diff = endTime - startTime;
totalTime += diff.count();
if (diff.count() < lowest)
{
lowest = diff.count();
}
}
const double average = totalTime / cycles;
std::cout << "Ran " << cycles << " cycles. "
<< "Execution time avg: " << average * 1e6 << " μs. Lowest: "
<< lowest
* 1e6 << " μs" << std::endl;
} }