From 660ae056348698c685f018704ace89ea272d565c Mon Sep 17 00:00:00 2001 From: skasch Date: Sat, 2 Nov 2024 23:47:08 +0100 Subject: [PATCH] Day 24, C++ --- day-24/input/skasch.txt | 292 +++++++++++++++++++++++++++++++++++++++ day-24/part-1/skasch.cpp | 87 ++++++++++++ day-24/part-2/skasch.cpp | 142 +++++++++++++++++++ 3 files changed, 521 insertions(+) create mode 100644 day-24/input/skasch.txt create mode 100644 day-24/part-1/skasch.cpp create mode 100644 day-24/part-2/skasch.cpp diff --git a/day-24/input/skasch.txt b/day-24/input/skasch.txt new file mode 100644 index 00000000..91d27336 --- /dev/null +++ b/day-24/input/skasch.txt @@ -0,0 +1,292 @@ +nwswswnenwswsweswseswswnwswsweswsw +swseswsenwswnenwsesesenwseseesesenwenw +seswseswseswswseswwswneseswsese +nwwwsewenwwwwswwwe +seswwwseeseseseseseseswseswneneesew +eenewewweseneneneenene +nenenenenwnwwswseenwwneneenwneswnwnw +swneswwswwnewwwswwswwww +seseweewwnwwnwwsewwnwnenewnwne +nwwewewnwnwwwwnwswnwwsenwneww +sewnewswswwsenwsenenwneswswsesweenw +nwwnwnenwnwwnwsewnwseewsenwsesenwnwnw +enwnenwnwswnwnenesenwneswnenwnenwwnenese +neneneneneswneneenwenenenenenenewnwse +nwenwswsenwwnwwnwwnwwnwneww +wnwnwnwnwnenenwnesenwnwnwneswnwnenwsewne +wnwnwnwsesenwwwnenewnwnwnwnww +wnewwwswwwwwsw +nenwnenenewnenwnesenesenewnenenw +eeseeseeesenwesesese +seneseneneeeneewwswenweeneeneenene +wswsesenwseeeeseseseseseswnewseswnwnwse +swnenewwneneneneneneneseenenenenenee +swenwwwwewweswswwswswwswwnww +neswnenenenwswnwnwnwneneneneewnwneenw +eeesewswseenweewnwweeseene +swnwseeswneenwsesenwseeswnw +enwwnwwwswnwnwnenenenenwnenwnesesesenw +swwwwwwnewnewewwnewwsesw +eneseswwneseewnwnweswswwwnenwnenwne +sewsesesesenwnesewnweeswswswneseswwsw +nwneswnwnenenwnenweneswnesenwswnewnw +seneneseseseewsenenwswsewseswswsenesw +nwneseneenesewwnesenene +swwnwwsenwewswneewnweweswewnewse +nenenwseneswnwnwnwsenwwnwnenwnenenenw +neneneswneneenweesweneeeewenenw +swswswsenewseseseewswnesewswswseseswnw +eswwnwnwwswnwwwnwnwewwnw +swneseswenwseswsesesenwneseseseseswsese +nesenesenewnenenenwsenewnewsenwwnwne +swswseswseseswswnwseswsenesweswsw +swnwnwwswwswswswswwswsweneseswswnewne +nenenenenenwswneneswsenwnesenenenwnenenwnee +newnwneneeswneswnenwwsenenwneneenwnenw +swneeesesenesesewseseeesewse +nenwnwswseeenwseswneenewwene +enenenenenenenwnenesw +nwwswwwseneewwwwnwwwswnenweww +sewseneeesenwesesesesewneswseeew +swnwnweneswneneseswnwnenenenenenenwnese +nwsenwneseswwewnweswneewnwnwnwenw +wsenwwnwwnwenwwwnweswnw +swswwewnwnenesesewsesewneesewnene +neswnwwseswenenenwneseneeneenewsesww +nwwwsesenesesesesesenwseneeswnwsenewse +wnwswneswswswsweswne +enesenweneswsewneenenenwswnewnwnwsw +enenwnwswsenenwnwswnwwnwnwnwnwwnwwnw +wswswswwswwsesenwnwswnewsewswswnese +swwswneswswswneswswswsw +swswseswsesesenwseeeswseseswnwseseswnewsw +nwseeseseseswwesesesesesesesenesesenwe +swnwewewwwnwnwwnwnenwwwnwsewnw +swswswswnwswsenwswwweswwswsw +swenwswnesenwswesweseswwnewswenwswswnw +enewswnwwwwswswneewneewsw +nwsewnenwnwwnwnwnwenwnwnwnwnwswsesenwnw +wneeseseswseseesenweeseenwsenesewwne +senenwnwnenwnwnwnewnwnwnwnwenwnwswnesw +seseseseeseseseneseewse +neneeeneewweeneeneesesw +swswnwseswswwneseswswswswnwneswseswwswe +wsenenwwwseseeseswsewneneneneseswse +seeseeneeeswswseseenwneewneeseese +eeseeeeswsenweweenwneeewseene +wnenewnenenenesesenewnwnwnenenenwsenwne +neneneeswswnenenenenwenwnenwneneneswne +nwnwnwnwswwwnwnwwneenwwwswnwnwsenw +eneweneeneneenesweneneneesweswnww +neseseseseswsesesenwseseswseseseseswnew +seseseswswseseswsewne +swnwnewsweswswweswswswswwswswsesenwswsw +neewnwswnwswswewswnenwseswnwswswswsesw +esewnewwwwwswwwwwnwseewwwne +swswswnwswesweswswsweswswswswsewswnwsw +swneswswwnwswswswwswneswsweewswswsw +swwwesesewwswseneseneseseseeswsesesw +nwswnwnwnweswwnwnwenwnwnwnwe +nwwwnenwseseswnewsenesesewneswswwwe +nwnenenenwsenwwnenwnewseneewse +wwnwswnewwwwnw +swneneswnesenenenewnesenwewnewnenene +nenwneeneneesenwnesenewsw +neseseeewswweesesese +seenwsesesenwseeseseseseesesese +wwwwwswnewswswwwwnwswnewesw +swswwswswseswsenwwwseneeneswseswnwneese +nesenweseswesewsenwwsesesesesesee +neswseswsenwsweseneswswswseswswswswswwwnw +sesesewswseneswnwswswswswnwsesenwswesesw +nwwswesenewnwswswnwswwnwenenwne +eeeeneeweeeneneseeeenw +seseneseswwsewnwneseeeseneseswsenesw +nwnwneenwwnewewenwwnwnenwsesenenenw +neneneneswnenenwneneneeneneswneswswnene +wswseewneneseenewsesewwwswnwnwnwnwnw +nwnwnwnwnwnenwnwswnwnenenwsenwe +swnwnweswnwseeeeenwsesewswwnenesw +ewswseswnwwnwwnwnwsweweeenwnenw +wnewwnwneswsenwsewwenewnwnwwwww +nwnenenenewnwsenwnenwnwnesewnenwnwnwnwse +swsenewneswneneneenwnw +sweseswneeeneesenwnwneneenwnesenww +seswswneswswseswwseswnenwseseneswswswswse +nenwsenenwneneewneneneneneneswswene +wsewwwwwnewwwwwwwnw +swswseseeswswswwswsesesesewneneseswnw +nenweswnwnenenwnwnenwnewsewwnenenwe +neeewnenwnwnwnwnwsenwnwnwswwnwnwnwnw +swsenwswswneseswenewewsenwwnesewsenwne +wswwswwweeswswwswswnwnwnwene +nwneneneneseswnenwnesweswnenenwnenesene +wseseswswsewseneeswneewswseseswsene +swsenweeneswswsesesene +weswswsenewnwwewwswswenwsewnwnesw +neswnewsenwewnesenwsweseeseene +seswswseseswwneswseenweswswswswswnwnw +eseswswsweeswseswswsenwswswswswsewsenw +enewnwswsesweneswseswseenwsewnwsee +neseneswseweseenweeweesweeenew +wnwenesenwswnwnewsenwnwswnwnesewnwwese +swnwswswseeseseeneswswswswswswswswsww +wsesewwneseswswswseswnwswseeswneswewsw +nwnenenwnwenwswnwnenewnwnwswnwsesenwnww +eswseseswsewseseswsesesesenese +nwswswseeswswseswswsenweseewnwsesese +seseeeeenewswnwwnwswsenwnenwnwnwwsesw +neeweewnenwneenwnwsenwsenwsesesene +nenwseeseenwenwseeswswnweeeneeswse +swswseswswswswswenwwwswnwswneswswesww +swswneswnwswswswswswseewswewswwnene +nwneeneenwnewswnenwnenwswnenwnwnwenwne +nenenenenwnenesweneseneneneswnwnenenenw +ewseesweenweneseenwesweewwew +eseseeseseseeweesewseesesene +wneeneneenwweswenwwseneeenesesese +nwnwnenesenenenwwnwwnwsenwnwnwnenenwse +senewnwseesenwwseseswesewesesenenesw +seneeewnwwwsewnenwewnwswswse +neswwewwwwwwwswsweewwwww +wwsweswwswewwsenewwswwswswswnw +nwnwnwnwneneswnwsenwenwnwnwneenewnwnw +senwwnwneneeswneneeeweeenenenesw +nweneswneneswneenwnewnwnwnwnwnenenwnesenw +sewneswnweweswnesewnwwwwnewswsww +wneswswswwswsewswwswswswewswsw +senwneseswseeseswneseswneswswswswswsenw +ewwsweneenwsene +seeneeseeenewnwewswnwswswsesenww +wsesewwsewwswwnewswwnewwwwwnew +wnwsewwwnwwnewsenwnwnewnwnesenwnw +swswseseswsenewsesesesesesesesenwsenwse +nwwwwneswwwwwseswewwwwnenew +seewneeeeseenwsewenwsesw +nwnenwwneneseswnwew +neeenwenwesweeeeeeeseesw +nwnwwswewswnwnenwnwnwnwsenene +ewnwsesesesenwswesesesewswseesesese +neenwwsewsenwseeeeewwswneeneswne +swsenwseeswsewnwweneseneseeswsesesee +swsenwnweseswseenwseswseseseenwwsesene +eseenenenwneswnwnwneeeeneseneenew +swnenesweeeswneswenenwswneeeeseswse +sewsesesweeeeweeneeneseswesee +swwwwwwewnwnwwwewwwwnw +seswswenenwnweeneneneneswwenenenenenwne +seseeeseswwneeesenww +nwnwnwswneenwnenwneneswnwswnwsw +swswswswseswneswswswswnwseswsww +wnwwnwwsenwnwwneenwnwnwsesenwnwenww +eseeseeesewseseswesesenwnenwesese +swswnenwnenenwnenwenenenwenenwnwswnwnwswne +newwsewwwnwwnewsew +swswswseseswwseswswneswneneswnwnwswsesw +eeeesenwswseeeeewwseeneeeee +neswswseswneeswswneswswseswswww +neseeesesesewnwseswsesesewseseswwnwsee +nwnwnesenenwnwsesweswswenwnwnwewnwwse +eswswswswswseeeswwseewsenenwwsesww +newwnesesesweeneewwenee +swnwswwnwswseeneeseeneswswenwswwnesw +sesesweeseswseeseseenweseeswnesenenw +wwwwwwseewwwwwwwwswwnesene +swnwnwnenwesweswswsenwwneneenwnwnww +swnwnwewenwenweenwnwswwwnwnwnwww +wsweswswswswnwswswsweswswswswswswswne +neneneswwnwnenwnwneswneenwsesenene +swewswseneswnwswseswswseseenwswswsee +enweeesweseseweeeeeenwswee +sewseseswnenesewenwneeneneneewnewnew +esenwswewneswneswnwnenwnwnwenwenwnw +swneswwswwswswswwwwenwswswsweswsw +newseswseswnwseseneeswsenwwswnw +wwesweewswswnwwewewwwenwnesenw +seswenwseswenwwseewnenenwnesenwsese +wwwwnewwwswswww +nwwnwnwswnesenenenwwenwenwwnwnwsenwwnw +nwsewesesewswsesweseseneseneseswnese +eseeeeenwseeseswe +swseenwseswwneneswsweseswseswnwwnene +eenwewesweseneweswnenwswsewenee +wewwwwwwwwwnewsewwwwsenw +wwwsewwwwneww +senwneneenenwsenwnesenenenenewnewsesw +eweeeeeeee +nwnewneneneseneneenewseneneswsenenwnenw +swsewswnwneeenwseweseenwwwenesww +swswnwswneneswsesewswseswsewswnesese +newwnwnwwwwnwswswnenwnwneenwnwswnw +eenwsenwnewwneneenenwnenwsewwwsee +eseesenweeseseswseenesenweeewswnwe +nwenwenewnwwwnwswwsweswseswnwwe +nwseneeswswseseseswswswseswseeewswnw +seeeenweeweeeeesweeenee +eneweswnesenenewnenewneswnenesesww +nwwnewswnwwwnwe +swswswswswseswswswswwswswnesw +wwwsewnenwwwwnwsewnw +neeeseseesewseseesesewsesesene +nwnwswswneswwswseswswswsweswswseneswswsw +sesesenewsewseseswseseseseswnesesese +seneseswswseswseeeseenwnwseenesewnwse +nwwnwwwwwnwwewe +swseswwsweswswswnwswsweswswswswneswse +swseeswswswswswswswwnwnwswwnesesenwswsw +senwseseswsesenesenenwsesesewsesesesese +ewswwswnwseneswseswnenwswsenwseseswswne +sweswseswseswwwseneneenesenwseswnwsenw +nwwweswnwswnwswswseeseswsenenwsesww +sesewseesenwesweseeneseeneseswnewese +esewseeeesewenwseeweenesewew +eneseneswnesewwneenwneneswewsewnesw +newneweeseenesweneeeseenwneeswe +seswseseneswswswswswswsw +wsesesesesenesesenwseesenwsesesesesese +nenenenesenenewnenenene +seswwnwswwsesesweswsweswenesenwene +neswesenenesenenweeswseeenwnewnwnene +eeeeeeeenweeneswenenwnweswsw +seneenenesweneswneewnwswnene +swswwswswswwswswnwwwnweenwwseswww +swswwswneswseneswswswsenesw +swwswswswswswsweswswswswsw +seneseseseenwnwsweswnwseseswseswwneswswsw +nenwnwswnenwewneswnwnewnenenesenenee +nwseseesenwwswseeenesesesesenwnwew +swnwswseenewswwswswswwwwwnwswwe +nwneenesenwneewnewneseeneneesw +neswnwwnenweswneneneneswnenwwneenwneene +neeneneswwsenwnwneneneseenenenewsene +swswnewseseseswswseswneswnwseeseswsese +swnwwswseswwnwsweeswwnweenewnwsw +nenweeeeswneweseswneswne +weneenwnenenenenwnenwswnewneeneneenesw +swnenwnwwwswwwnenewwnwsewnesewnw +neswswwswswseesweneswswsewswswwswse +nenenenwwsenwnwnenwnwnenwsenenwnwnwsenw +nwseseswseesenwseswswsenwese +wswneswnwneneswseseswwnwseswswnesenwsesew +weeeewsweeeneneneswesenwswee +senwnwwwnwsenwnwwwnwsesenesesenewsene +wwwesewwsenwwwwswweswwswnenww +swwneneseswswwswsewwwsw +enenwneneeneeseneswnwneeneswnesenene +eseesenenenewwneneseenenewnenenewnene +wenwswewnwewnweswseeeneeneenesw +neneneneswnenewsenwneseneenenwneswnenewne +eneswneneeseeswenewneeeeeenwnee +eswswsenwneseeseeeeeswnweeeewne +nwewwwwenwwwwewnwwnwwewsw +nwwwwnwnesenwwseenwswnwewnwswwnewnw +seweeweeenwseeeeenwseeeene +wswsenenewwwwwwwswwswwwneseww +nenenenweeseneneneeeeeweewswse +neneneneenweseeneswswnenenweeneswee +sesweeeswenwnese +enweseneneneneenwneenwneswneswneswnew +senenweseneneswsesenwseswswnwwswnwsewse +nwnwnwenwnwnwnwnwnwnwswnwnwnwsesenwnwnw +wwwnwnwwenwnwnwnwsenwswww +nwnwnweswnenenwnesenwwswnenenenwnesenwe \ No newline at end of file diff --git a/day-24/part-1/skasch.cpp b/day-24/part-1/skasch.cpp new file mode 100644 index 00000000..8768967d --- /dev/null +++ b/day-24/part-1/skasch.cpp @@ -0,0 +1,87 @@ +#include +#include +#include +#include +#include +#include + +static std::unordered_map> kFlipped; +static int kFlippedCount = 0; + +void Flip(const std::string &line) { + int pos = 0; + int row = 0; + int col = 0; + while (pos < line.size()) { + switch (line[pos]) { + case 'w': + col -= 2; + break; + case 'e': + col += 2; + break; + case 'n': { + --row; + ++pos; + switch (line[pos]) { + case 'w': + --col; + break; + case 'e': + ++col; + break; + } + break; + } + case 's': { + ++row; + ++pos; + switch (line[pos]) { + case 'w': + --col; + break; + case 'e': + ++col; + break; + } + break; + } + } + ++pos; + } + auto it = kFlipped.find(row); + if (it != kFlipped.end()) { + auto it2 = it->second.find(col); + if (it2 != it->second.end()) { + it->second.erase(it2); + --kFlippedCount; + return; + } + } + kFlipped[row].insert(col); + ++kFlippedCount; +} + +std::string run(const std::string &input) { + // Your code goes here + std::istringstream iss(input); + for (std::string line; std::getline(iss, line);) { + Flip(line); + } + return std::to_string(kFlippedCount); +} + +int main(int argc, char **argv) { + if (argc < 2) { + std::cout << "Missing one argument" << std::endl; + exit(1); + } + + clock_t start = clock(); + auto answer = run(argv[1]); + + std::cout << "_duration:" << float(clock() - start) * 1000.0 / CLOCKS_PER_SEC + << "\n"; + std::cout << answer << "\n"; + return 0; +} diff --git a/day-24/part-2/skasch.cpp b/day-24/part-2/skasch.cpp new file mode 100644 index 00000000..069c3190 --- /dev/null +++ b/day-24/part-2/skasch.cpp @@ -0,0 +1,142 @@ +#include +#include +#include +#include +#include +#include +#include + +static std::unordered_map> kFlipped; +static int kFlippedCount = 0; +static constexpr std::array, 6> kNeighbors = { + {{0, -2}, {-1, -1}, {-1, 1}, {0, 2}, {1, 1}, {1, -1}}}; +static constexpr int kCycles = 100; + +bool Contains(int row, int col) { + auto it = kFlipped.find(row); + if (it != kFlipped.end()) { + return it->second.find(col) != it->second.end(); + } + return false; +} + +std::pair FindPos(const std::string &line) { + int pos = 0; + int row = 0; + int col = 0; + while (pos < line.size()) { + switch (line[pos]) { + case 'w': + col -= 2; + break; + case 'e': + col += 2; + break; + case 'n': { + --row; + ++pos; + switch (line[pos]) { + case 'w': + --col; + break; + case 'e': + ++col; + break; + } + break; + } + case 's': { + ++row; + ++pos; + switch (line[pos]) { + case 'w': + --col; + break; + case 'e': + ++col; + break; + } + break; + } + } + ++pos; + } + return {row, col}; +} + +void Flip(int row, int col) { + auto it = kFlipped.find(row); + if (it != kFlipped.end()) { + auto it2 = it->second.find(col); + if (it2 != it->second.end()) { + it->second.erase(it2); + --kFlippedCount; + return; + } + } + kFlipped[row].insert(col); + ++kFlippedCount; +} + +int CountBlackNeighbors(int row, int col) { + int cnt = 0; + for (const auto &[dr, dc] : kNeighbors) { + if (Contains(row + dr, col + dc)) { + ++cnt; + } + } + return cnt; +} + +void Animate() { + std::unordered_map> to_flip; + for (const auto &[row, cols] : kFlipped) { + for (const int col : cols) { + int cnt = CountBlackNeighbors(row, col); + if (cnt == 0 || cnt > 2) { + to_flip[row].insert(col); + } + for (const auto &[dr, dc] : kNeighbors) { + if (Contains(row + dr, col + dc)) { + continue; + } + if (CountBlackNeighbors(row + dr, col + dc) == 2) { + to_flip[row + dr].insert(col + dc); + } + } + } + } + for (const auto &[row, cols] : to_flip) { + for (const int col : cols) { + Flip(row, col); + } + } +} + +std::string run(const std::string &input) { + // Your code goes here + std::istringstream iss(input); + for (std::string line; std::getline(iss, line);) { + auto [row, col] = FindPos(line); + Flip(row, col); + } + for (int cycle = 0; cycle < kCycles; ++cycle) { + Animate(); + } + return std::to_string(kFlippedCount); +} + +int main(int argc, char **argv) { + if (argc < 2) { + std::cout << "Missing one argument" << std::endl; + exit(1); + } + + clock_t start = clock(); + auto answer = run(argv[1]); + + std::cout << "_duration:" << float(clock() - start) * 1000.0 / CLOCKS_PER_SEC + << "\n"; + std::cout << answer << "\n"; + return 0; +}