From 0413a04a422e5985ae91a02489cafcb85515ea9f Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Sun, 17 Nov 2024 16:59:53 +0100 Subject: aoc 2015, day 18 --- 2015/src/day18.cpp | 143 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 2015/src/day18.cpp (limited to '2015') diff --git a/2015/src/day18.cpp b/2015/src/day18.cpp new file mode 100644 index 0000000..fa465f4 --- /dev/null +++ b/2015/src/day18.cpp @@ -0,0 +1,143 @@ +#include +#include +#include +#include +#include +using namespace std; + +using puzzle_type = map, bool>; + +auto +read_file(string_view filename) +{ + fstream input{ filename }; + puzzle_type puzzle; + + size_t line = 0; + for ( string str; getline(input, str); ) { + for ( size_t column = 0; column != str.size(); ++column ) { + if ( str[column] == '#' ) { + puzzle[{ column, line }] = true; + } + } + + ++line; + } + + return puzzle; +} + +void +iterate(puzzle_type& puzzle, size_t width) +{ + puzzle_type next; + + for ( size_t line = 0; line != width; ++line ) { + for ( size_t column = 0; column != width; ++column ) { + static const vector> offsets = { + { -1, -1 }, + { 0, -1 }, + { 1, -1 }, + { -1, 0 }, + { 1, 0 }, + { -1, 1 }, + { 0, 1 }, + { 1, 1 } + }; + + size_t count = 0; + for ( const auto& [delta_x, delta_y]: offsets ) { + if ( puzzle[{ column + delta_x, line + delta_y }] ) { + ++count; + } + } + + if ( puzzle[{ column, line }] ) { + if ( count == 2 || count == 3 ) { + next[{ column, line }] = true; + } + } + else { + if ( count == 3 ) { + next[{ column, line }] = true; + } + } + } + } + + puzzle.swap(next); +} + +void +print(puzzle_type puzzle, size_t width) +{ + for ( size_t line = 0; line != width; ++line ) { + for ( size_t column = 0; column != width; ++column ) { + auto value = puzzle[{ column, line }]; + cout << (value ? '#' : '.'); + } + cout << '\n'; + } + cout << endl; +} + +void +part1(puzzle_type puzzle) +{ + static const size_t width = 100; + + for ( int i = 0; i != 100; ++i ) { + iterate(puzzle, width); + } + + long sum = 0; + for ( size_t line = 0; line != width; ++line ) { + for ( size_t column = 0; column != width; ++column ) { + auto value = puzzle[{ column, line }]; + if ( value ) { + ++sum; + } + } + } + cout << sum << endl; +} + +void +enable_corners(puzzle_type& puzzle, size_t width) +{ + puzzle[{ 0, 0 }] = true; + puzzle[{ width - 1, 0 }] = true; + puzzle[{ 0, width - 1 }] = true; + puzzle[{ width - 1, width - 1 }] = true; +} + +void +part2(puzzle_type puzzle) +{ + static const size_t width = 100; + + for ( int i = 0; i != 100; ++i ) { + enable_corners(puzzle, width); + iterate(puzzle, width); + } + enable_corners(puzzle, width); + + long sum = 0; + for ( size_t line = 0; line != width; ++line ) { + for ( size_t column = 0; column != width; ++column ) { + auto value = puzzle[{ column, line }]; + if ( value ) { + ++sum; + } + } + } + cout << sum << endl; +} + +int +main() +{ + auto puzzle = read_file("data/day18.txt"); + part1(puzzle); + part2(puzzle); +} -- cgit v1.3