From 8add759b5d28c0cb7dab2f6d09dd1f6c8f27f04f Mon Sep 17 00:00:00 2001 From: Bananymous Date: Sat, 23 Dec 2023 18:46:43 +0200 Subject: [PATCH] AOC2023: Implement day17 part1 --- userspace/aoc2023/CMakeLists.txt | 1 + userspace/aoc2023/day17/CMakeLists.txt | 22 +++ userspace/aoc2023/day17/a.out | Bin 0 -> 39016 bytes userspace/aoc2023/day17/main.cpp | 202 +++++++++++++++++++++++++ 4 files changed, 225 insertions(+) create mode 100644 userspace/aoc2023/day17/CMakeLists.txt create mode 100755 userspace/aoc2023/day17/a.out create mode 100644 userspace/aoc2023/day17/main.cpp diff --git a/userspace/aoc2023/CMakeLists.txt b/userspace/aoc2023/CMakeLists.txt index f10e8d4f..1bb94e84 100644 --- a/userspace/aoc2023/CMakeLists.txt +++ b/userspace/aoc2023/CMakeLists.txt @@ -19,6 +19,7 @@ set(AOC2023_PROJECTS day14 day15 day16 + day17 full ) diff --git a/userspace/aoc2023/day17/CMakeLists.txt b/userspace/aoc2023/day17/CMakeLists.txt new file mode 100644 index 00000000..f43e3047 --- /dev/null +++ b/userspace/aoc2023/day17/CMakeLists.txt @@ -0,0 +1,22 @@ +cmake_minimum_required(VERSION 3.26) + +project(aoc2023_day17 CXX) + +set(SOURCES + main.cpp +) + +add_executable(aoc2023_day17 ${SOURCES}) +target_compile_options(aoc2023_day17 PUBLIC -O2 -g) +target_link_libraries(aoc2023_day17 PUBLIC libc ban) + +add_dependencies(aoc2023_day17 libc-install ban-install) + +add_custom_target(aoc2023_day17-install + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/aoc2023_day17 ${BANAN_AOC2023_BIN}/day17 + DEPENDS aoc2023_day17 + DEPENDS aoc2023_always +) + +add_dependencies(aoc2023 aoc2023_day17) +add_dependencies(aoc2023-install aoc2023_day17-install) diff --git a/userspace/aoc2023/day17/a.out b/userspace/aoc2023/day17/a.out new file mode 100755 index 0000000000000000000000000000000000000000..0b089d1d9c4e1c1ce0bc948fd049f4d5fe36a259 GIT binary patch literal 39016 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 L?34^CQRV*u4@Pb3 literal 0 HcmV?d00001 diff --git a/userspace/aoc2023/day17/main.cpp b/userspace/aoc2023/day17/main.cpp new file mode 100644 index 00000000..462162c4 --- /dev/null +++ b/userspace/aoc2023/day17/main.cpp @@ -0,0 +1,202 @@ +#include +#include +#include + +#include +#include +#include + +using i8 = int8_t; +using i16 = int16_t; +using i32 = int32_t; +using i64 = int64_t; + +using u8 = uint8_t; +using u16 = uint16_t; +using u32 = uint32_t; +using u64 = uint64_t; + +struct Position +{ + i64 x; + i64 y; + + bool operator==(const Position& other) const + { + return x == other.x && y == other.y; + } +}; + + +namespace BAN +{ + template<> + struct hash + { + hash_t operator()(const Position& position) const + { + return hash()(((u64)position.x << 32) | (u64)position.y); + } + }; +} + +BAN::Vector> parse_grid(FILE* fp) +{ + BAN::Vector> grid; + + char buffer[256]; + while (fgets(buffer, sizeof(buffer), fp)) + { + BAN::StringView line(buffer); + ASSERT(line.back() == '\n'); + line = line.substring(0, line.size() - 1); + if (line.empty()) + break; + + MUST(grid.emplace_back(line.size())); + for (size_t i = 0; i < line.size(); i++) + grid.back()[i] = line[i] - '0'; + } + + return grid; +} + +//static constexpr i64 MIN_STEPS = 4; +//static constexpr i64 MAX_STEPS = 10; +template +i64 solve_general(FILE* fp) +{ + struct Block + { + // heatloss[x][y]: + // x: direction + // y: steps left in that direction + i64 heatloss[4][MAX_STEPS + 1]; + i8 entered_from = -1; + }; + + const auto grid = parse_grid(fp); + + // initially mark everything very large, except (0, 0) + BAN::Vector> heatloss_map; + MUST(heatloss_map.resize(grid.size())); + for (size_t y = 0; y < grid.size(); y++) + { + MUST(heatloss_map[y].resize(grid[y].size())); + for (size_t x = 0; x < grid[y].size(); x++) + for (size_t dir = 0; dir < 4; dir++) + for (size_t step = 0; step <= MAX_STEPS; step++) + heatloss_map[y][x].heatloss[dir][step] = 1'000'000'000; + } + for (size_t dir = 0; dir < 4; dir++) + for (size_t step = 0; step <= MAX_STEPS; step++) + heatloss_map[0][0].heatloss[dir][step] = 0; + + BAN::HashSet visited; + BAN::HashSet pending; + MUST(pending.insert({ 0, 0 })); + + while (!pending.empty()) + { + auto position = *pending.begin(); + pending.remove(position); + + Position offsets[4] = { { -1, 0 }, { 0, -1 }, { 1, 0 }, { 0, 1 } }; + + for (i8 dir = 0; dir < 4; dir++) + { + auto target = position; + + i64 path_heatloss = 0; + + auto is_target_in_bounds = + [&](const Position& target) + { + if (target.y < 0 || target.y >= (i64)grid.size()) + return false; + if (target.x < 0 || target.x >= (i64)grid.front().size()) + return false; + return true; + }; + + i64 target_distance = (heatloss_map[position.y][position.x].entered_from == dir) ? 1 : MIN_STEPS; + for (i64 i = 0; i < target_distance; i++) + { + target.x += offsets[dir].x; + target.y += offsets[dir].y; + if (!is_target_in_bounds(target)) + break; + path_heatloss += grid[target.y][target.x]; + } + if (!is_target_in_bounds(target)) + continue; + + auto& target_heatloss = heatloss_map[target.y][target.x]; + + bool target_updated = false; + for (i8 new_dir = 0; new_dir < 4; new_dir++) + { + // Don't allow going backwards + if (new_dir == dir + 2 || dir == new_dir + 2) + continue; + + for (i64 step = target_distance; step <= MAX_STEPS; step++) + { + i64 possible_heatloss = heatloss_map[position.y][position.x].heatloss[dir][step] + path_heatloss; + i64 new_dir_max_step = (new_dir == dir) ? step - target_distance : MAX_STEPS; + for (i64 i = 0; i <= new_dir_max_step; i++) + { + if (possible_heatloss >= target_heatloss.heatloss[new_dir][i]) + continue; + target_heatloss.heatloss[new_dir][i] = possible_heatloss; + target_heatloss.entered_from = dir; + target_updated = true; + } + } + } + if (target_updated || !visited.contains(target)) + MUST(pending.insert(target)); + } + + MUST(visited.insert(position)); + } + + i64 result = INT64_MAX; + for (size_t dir = 0; dir < 4; dir++) + for (size_t step = 0; step <= MAX_STEPS; step++) + result = BAN::Math::min(result, heatloss_map.back().back().heatloss[dir][step]); + return result; +} + +i64 puzzle1(FILE* fp) +{ + return solve_general<1, 3>(fp); +} + +i64 puzzle2(FILE* fp) +{ + return solve_general<4, 10>(fp); +} + +int main(int argc, char** argv) +{ + const char* file_path = "/usr/share/aoc2023/day17_input.txt"; + + if (argc >= 2) + file_path = argv[1]; + + FILE* fp = fopen(file_path, "r"); + if (fp == nullptr) + { + perror("fopen"); + return 1; + } + + printf("puzzle1: %" PRId64 "\n", puzzle1(fp)); + + fseek(fp, 0, SEEK_SET); + + printf("puzzle2: %" PRId64 "\n", puzzle2(fp)); + + fclose(fp); +}