From da5d346f8703f3d6676f940968d2569a1d14b4b5 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Tue, 14 Jan 2025 23:17:35 +0100 Subject: aoc 2016, day 8 --- 2016/src/day08.cpp | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 2016/src/day08.cpp (limited to '2016/src') diff --git a/2016/src/day08.cpp b/2016/src/day08.cpp new file mode 100644 index 0000000..ab3fc88 --- /dev/null +++ b/2016/src/day08.cpp @@ -0,0 +1,101 @@ +#include +#include +#include +#include +#include +#include + +using namespace std; + +vector> +read_file(string_view filename) +{ + fstream input{ filename }; + + vector> instr; + + for ( string line; getline(input, line); ) { + size_t value_a = 0; + size_t value_b = 0; + + if ( sscanf(line.c_str(), "rect %zu x %zu", &value_a, &value_b) == 2 ) { + instr.emplace_back('r', value_a, value_b); + } + else if ( sscanf(line.c_str(), "rotate column x=%zu by %zu", &value_a, &value_b) == 2 ) { + instr.emplace_back('x', value_a, value_b); + } + else if ( sscanf(line.c_str(), "rotate row y=%zu by %zu", &value_a, &value_b) == 2 ) { + instr.emplace_back('y', value_a, value_b); + } + } + + return instr; +} + +void +solve(const vector>& instr) +{ + static const size_t width = 50; + static const size_t height = 6; + + map, char> disp; + + auto reverse_y = [&](const size_t y, size_t lhs, size_t rhs) { + while ( lhs < rhs ) { + swap(disp[{ lhs++, y }], disp[{ --rhs, y }]); + } + }; + + auto rotate_y = [&](const size_t y, const size_t num) { + reverse_y(y, 0, width); + reverse_y(y, 0, num); + reverse_y(y, num, width); + }; + + auto reverse_x = [&](const size_t x, size_t lhs, size_t rhs) { + while ( lhs < rhs ) { + swap(disp[{ x, lhs++ }], disp[{ x, --rhs }]); + } + }; + + auto rotate_x = [&](const size_t x, const size_t num) { + reverse_x(x, 0, height); + reverse_x(x, 0, num); + reverse_x(x, num, height); + }; + + for ( const auto& [chr, val_a, val_b]: instr ) { + if ( chr == 'r' ) { + for ( size_t x = 0; x != val_a; ++x ) { + for ( size_t y = 0; y != val_b; ++y ) { + disp[{ x, y }] = '#'; + } + } + } + else if ( chr == 'x' ) { + rotate_x(val_a, val_b); + } + else if ( chr == 'y' ) { + rotate_y(val_a, val_b); + } + } + + // part1 + cout << count_if(disp.begin(), disp.end(), [](auto pos) { return pos.second == '#'; }) << endl; + + // part2 + for ( size_t y = 0; y != height; ++y ) { + for ( size_t x = 0; x != width; ++x ) { + cout << ((disp[{ x, y }] == '#') ? '#' : ' '); + } + cout << endl; + } + cout << endl; +} + +int +main() +{ + auto instr = read_file("data/day08.txt"); + solve(instr); +} -- cgit v1.3