From 3c40f13cfcc9cda1936e9ec77e5ff0f692e51c61 Mon Sep 17 00:00:00 2001 From: SebastianStork Date: Thu, 2 Jan 2025 22:58:46 +0100 Subject: [PATCH] Solve 2024 day 8 part 2 --- 2024/day-08/main.cpp | 82 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 67 insertions(+), 15 deletions(-) diff --git a/2024/day-08/main.cpp b/2024/day-08/main.cpp index 5815a33..245e387 100644 --- a/2024/day-08/main.cpp +++ b/2024/day-08/main.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include using namespace std; @@ -23,27 +24,31 @@ void readInput(vector &antennaMap, map>> &anten } } -bool isInBounds(pair location, const vector &map) +pair getDirectionVector(const pair &antenna1, const pair &antenna2) { - return (location.first >= 0 && location.first < map.size()) - && (location.second >= 0 && location.second < map[0].size()); + return {antenna2.first - antenna1.first, antenna2.second - antenna1.second}; } -vector> getAntinodes(pair antenna1, - pair antenna2, +bool isInBounds(const pair &location, const vector &map) +{ + return (location.first >= 0 && cmp_less(location.first, map.size())) + && (location.second >= 0 && cmp_less(location.second, map[0].size())); +} + +vector> getAntinodes(const pair &antenna1, + const pair &antenna2, const vector &antennaMap) { if (antenna1 == antenna2) { return {}; } - pair directionVector = {antenna2.first - antenna1.first, - antenna2.second - antenna1.second}; + const pair directionVector = getDirectionVector(antenna1, antenna2); - pair antinode1 = {antenna2.first + directionVector.first, - antenna2.second + directionVector.second}; - pair antinode2 = {antenna1.first - directionVector.first, - antenna1.second - directionVector.second}; + const pair antinode1 = {antenna1.first - directionVector.first, + antenna1.second - directionVector.second}; + const pair antinode2 = {antenna2.first + directionVector.first, + antenna2.second + directionVector.second}; vector> antinodes; if (isInBounds(antinode1, antennaMap)) { @@ -55,6 +60,34 @@ vector> getAntinodes(pair antenna1, return antinodes; } +vector> getResonantHarmonicsAntinodes(const pair &antenna1, + const pair &antenna2, + const vector &antennaMap) +{ + if (antenna1 == antenna2) { + return {}; + } + + const pair directionVector = getDirectionVector(antenna1, antenna2); + vector> antinodes; + + pair antinode1 = antenna1; + do { + antinodes.push_back(antinode1); + antinode1.first -= directionVector.first; + antinode1.second -= directionVector.second; + } while (isInBounds(antinode1, antennaMap)); + + pair antinode2 = antenna2; + do { + antinodes.push_back(antinode2); + antinode2.first += directionVector.first; + antinode2.second += directionVector.second; + } while (isInBounds(antinode2, antennaMap)); + + return antinodes; +} + int main() { vector antennaMap; @@ -62,18 +95,37 @@ int main() readInput(antennaMap, antennas); set> uniqueAntinodes; + set> uniqueResonantHarmonicsAntinodes; + set, pair>> consideredAntennaCombinations; - for (auto antennasWithSameFrequency : antennas) { - for (auto antenna1 : antennasWithSameFrequency.second) { - for (auto antenna2 : antennasWithSameFrequency.second) { - vector> foundAntinodes = getAntinodes(antenna1, antenna2, antennaMap); + for (const auto &antennasWithSameFrequency : antennas) { + for (const auto &antenna1 : antennasWithSameFrequency.second) { + for (const auto &antenna2 : antennasWithSameFrequency.second) { + const auto orderedPair = make_pair(min(antenna1, antenna2), max(antenna1, antenna2)); + if (consideredAntennaCombinations.contains(orderedPair)) { + continue; + } + consideredAntennaCombinations.insert(orderedPair); + + const vector> foundAntinodes = getAntinodes(antenna1, + antenna2, + antennaMap); for (pair antinode : foundAntinodes) { uniqueAntinodes.insert(antinode); } + const vector> foundResonantHarmonicsAntinodes + = getResonantHarmonicsAntinodes(antenna1, antenna2, antennaMap); + for (pair antinode : foundResonantHarmonicsAntinodes) { + uniqueResonantHarmonicsAntinodes.insert(antinode); + } } } } // Part one cout << "Number of unique antinodes: " << uniqueAntinodes.size() << endl; + + // Part two + cout << "Number of unique antinodes when taking resonant harmonics into account: " + << uniqueResonantHarmonicsAntinodes.size() << endl; }