-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Blaz Kranjc
committed
Dec 11, 2020
1 parent
9c0433c
commit 3481a48
Showing
5 changed files
with
253 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
LLLLLLLLLL.LLLL.LLLLLLL.LLLLLLL..LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LL.LLLLLLL | ||
LLLL.LLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLL | ||
LL.LLLLLLLLLLLLLLLLLLLL..LLLLLL..LLLLLLL.LLLLLLL.LLLLLL.LLLL.LLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLL | ||
LLLL.LLLLL.LLL.LLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLL.LLLLLL.LLLLLLLLLLLL.LLLLLLLLL.LLLL.LLLLLLL.LL | ||
LLLLLLLLLL.LLLL.LLLLLLL.LLLLLLL.LLLLLLLL..LLLLLL.LLLLLL.LLLL.LLLLLLL.LLLLLLLLL.LLLL.LLLLLLLLLL | ||
LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLL..LLLLLLLLL | ||
LLLLLLLLLL.LLLL.LLLLLLL.LLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLL..LLLLLLLLLL.LLLL | ||
LLLLLLLLLL.LLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLL..LLLL.LLLLLLLLLLLLLLL.LLL.LLLLLLLLLLLLL | ||
LLLLLLLLLL.LL.L.LLLLLLL.LLLLLL..LLLLLLLL.LLLLLLL.L.LLLL.LLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL | ||
LLLL.LLLLL.LLLL.L.LLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLL.LLL.LLLL..LLLLLLLLL | ||
L..LL.L.LL.........LLL...LLL.........LL..LL.L..LL..L...L..L....LL.LL.L.LL.L..L...LLL......LL.L | ||
LL.LLLLLLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL | ||
LLLLLLLLLL.LLLL.LLLLLLL.LLLLLLL.LLLLL.LLLLLLLLLLLLLLLLL.LLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL | ||
LLLLLLLLLL.LLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLL | ||
LLLLLLLLLL.LLLLLLLLLLLLLL.LLLL.LLLLLLL.L.LLLLLLL.LLLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLL | ||
LLLLLLLLLL.LLLL.LLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLL.LLLLLL.LLLL.LLLLLLL.LLLLLLLLL.LLLL.LLLLLLLLLL | ||
LLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLL | ||
LLLLLLLLLL.LLLL.L.LLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLL.LL.LLLLLLLLLLLL.L.LLLLLLL.LLLL.LLLLLLLLLL | ||
LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLL.LL.LLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL | ||
LLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLL | ||
...L..L.LL......L..L..LL..LLL..L.L.L....L.LLLLL...L...L....L..L..........L..LL.LL.L........LL. | ||
LLLLLLLLLLLLLLL.LLLLL.L.LLLLLLL.LLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLL | ||
LLLLLLLLLL.LLLL.LLLLLLLLLLLLLLL.LLL.LLLL.LLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL | ||
LLLLLLLLLL.LLLL..LLLLLL.LLLLLLL.LLLLLLLL.LLLLLLL.LLLLLL.LLLL.LLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLL | ||
.LLLLLLLLL.LLLL..LLLLLL.LLLLLL..LLLLL.LL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLL | ||
LLLLL.LLLL.LLLLLLLLLLL..LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LL.L.LLLLLLL..LLLLLLLL.LLLL.LLLLLLLLLL | ||
LLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLL.L.LLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLL.LL.LLLLLLLLLLLLLLL | ||
LLLLLLLL.L.LLLL.LLLLLLL.LLLLLLL.LLLLLLLLLLL.LLLL..LLLLL..LLL.LLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLL | ||
.LL..LLL.LLL..LL.LL....LLLL.....LLLL..LLLL.L.L...........L...L.LLLLLL..LL..LL.LL.L.....LL.L... | ||
LLLLLLLL.LLLLLL.LLLLLLLLLL.L.LLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL..LLLLLL.LLLLLLLLLLL.LL.LLLLLLLLLL | ||
LLLLLLLLLLLLLLL.LLLLLLL.LLLLLLL.LLL.LLLL.LLLLLLL.LLLLLL.LLLL.LLLLLLL.LLLLLLLLL.LLLL.LLLLLLLLLL | ||
LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLL..LLLLLL.LLLLLL.LLLL.LLLLLLL.LLLLLLLLL.LLLL.LLLLLLLLLL | ||
LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLL..LLLLLL.LLLLLLLLLLLL.LLLLLLLLL.LLLL.LLLLLLLLLL | ||
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLL.LLLL.LLLLL.LLL.LLLL.LLLLLLL.LL | ||
...............L.....L.....L....L.L....L.L.L.L.L.L..L..LL..L.......L.LLL.L.L.L...L..L.L.L..LLL | ||
LLLLLLLL.LLLLLL.LLLLLLL.LLLLLLL..LLLLLLLLLLLLLLL..LLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLL..LLLLLLLLL | ||
L.LLLLLLLL.LLLLLLLLLLLL.LLLLL.L.LL.LLLLL.LLLLLLL.LLLLLL.LLLL.LLLLLLL.LLLLL.LLL.LLLL.LLLLLLLL.L | ||
LLLLLLLLLL.LLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLL.LLLLLLLLLL | ||
LLLLLLLLLL.LLLL.LLLLLLL..LLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL | ||
LLLLLLLLLL.LLLL..LLLLLL.LLLLLLL.LLLLLLLLL.LL.LLL.LLLLLLLLLLL.LLLLLL..LLLLLL.LL.LLLLLLLLLLLLLLL | ||
LLLLLLLLLL.LLLL.L.LLLLL.LLLLLLL.LLLLLLLL.L.LLLLL.LLLLLL.LLLL.LLLLL.LLLLLLLLLLL.L..L.LLLLLLLLLL | ||
LLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLL.LLLL.LLLLLLLLLL | ||
LLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLL.L.LLLLLLLLLLLLLLLLL.LLLLLLL.LLLL.LLLL.LLLL.L.LLLLLLLL | ||
.LLL..L.L.LL.L.LL.LL.LLL.L..L.L.....L....L...L.L......L.LL....L.LL..L.......L..L...L..L...LLL. | ||
LLLLLLLLLL.LLLL.LLLLLLL.LLLLLL..LLLLLLLL.LLLLLLL.LLLLLL.LLLLLLLLLLLL.L.LLLLLLL..LLLL.LLLLLLLLL | ||
L..LLLLLLLLLLLL.LLLLLLL.LLLLLLL.LLLLL.LL.LLLLLLLLLLLLLLLLLLL.LLL.LLL.LL.LLLLLL.LLLL.LLLLLLLLLL | ||
LLLLLLLLLL.LLLL.LLLLLLL.LLLLLLL..LLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL | ||
LLLLLLLLLL.LLLL.LLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLL.LLLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLL.LL | ||
LLL.LLLLLL.LLLL.LLLLLLL.LLLLLLLLLLLLLLL..LLLLLLLLLLLLLLLLLL..LLLLLLL.LLLLLLLLL.LL.LLLLLL.LLLLL | ||
LLL.LLLLLL.LLLL.LLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLL | ||
..L...LLL......L....L..LL..LLLLL..L...L..LL.L.L....L...L.LL..L..L.LLL.....L.L...L......L.LL..L | ||
LL.LLLLLLL.LLLL.LLLL.LL.LLLLLLL..LLLLLLL.LLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLL...LLL.L.LLLLLLLL | ||
LLLLLLLLLL.L.LL.L.LLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLL.L.LLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLL.LL | ||
LLLLLLLLLL.LLLL.LLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LL.LLLLLLLLL.LLLLLLLLLLLLLLL | ||
LLLLLLLLLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLL | ||
L.LLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLL.LLLLLLLLL.LLLL.LLLLLLLLLL | ||
LLLL.LLLLL.LLLL.LLLLLLL.LLLLLLL.LLLLLLLLLLLLL.LL.LLLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLL | ||
LL......LL...L......L.L...LL..L.L...LL.L........L.LL.LL.LL...L...LL.....L..LL.L....L.L..LLL..L | ||
LLLLLLLLLL.LLLL.L.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLL.LLLLLL.LL.LLLL.LLLLLLLLLL | ||
LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLL.LLLLLL.LLLL.LLLLLLL.LLLLLLLLL.LLLLL.LLLLL.LLL | ||
LLLL.LL.LL.LLLL.LLLLLLLLLL..LLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.L.LLLLLLLL | ||
LLLL.LLLLL.LLLL.LLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL | ||
LLLLLLLLLL.LLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLL..LLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLL | ||
LLLLLLLLLL.LLLL.LLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLL.LLLLLLLLLL.LLL.LLLLLLL.LLLLLLLLL. | ||
LLLLLLLLLL.LLLL.LLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.L..LLLLLLLLLLL.LLL.LLLLLL | ||
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLL.LLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL | ||
LLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLL.LL.LLLL.LLLLLL..LLLLLLLLL.LLLL.LLLLLLLLLL | ||
.....LL..LL.......L.L.....L.....L....L..L.L...L.L.L.L...L.L..L.LLL.............L...........L.L | ||
L.LLLLLLLL.LLLL.LLLLLLLLLLLLLLL.LLLL.LLLLLLLLLL.LLLLLLL.LLLL.LLLLLLL.LLLLLLLLL.LLLL.LLLLLLLLLL | ||
LLLLLLLLLL.LLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLL..LLLLLLLLLLLLLLLLLLLLL.LL.L.L.LLLLLLLL | ||
LLLLLLLLLL.LLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLL.LLLLLL.LLLLLL..LLLLLLLLLL | ||
LLLLLLLLLL.LLLLLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLL.LLLLLL.LLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL | ||
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL..LLLLLL.LLLLLL.LLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL | ||
LLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLLLLLL.LLL.LLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLL | ||
.LLL.....L...L.LLL.L.....L.L........L..LL.L.L.LL.....L..L.L.LL.LLLLLL..LL...L..L...LL.L.LL.... | ||
LLLLLLLLLL.LLLLLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLL.LLLLLL.LLLL.LLLLL.L.LLLLLLLLL.LLLL.LLLLLLL.LL | ||
LLLLLLLL.LLLLLLLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLL.LLLLLL.LLLL.LL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLL | ||
LLLLLLLLLL.LLLL.LLLLLLL.LL.LLLL.LLLLLLLL.LLLLLLL.LLLLLL.LLLL...LLLLL.LLLLLLLLL.LLLL.LLLLLLLLLL | ||
LLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLL.LLLLLL.LLL | ||
LLLLLLLLL..LLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLL | ||
.L..L.L.LL..........L..L.............LLLL..L.......LL....L..L.......L.........L..L.L..LL....LL | ||
LLLLLLLLLL.LLLL.LLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLL.LLLLLLL.LLLL.LLLL.LLLL.LLLLLLLLLL | ||
LLLLLLLLLL.LLLL.LLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLL | ||
LLLLLLLLLL.LLLL.LLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLL.LLLLLLL.LL | ||
LLLLLLLLLL.LLLL.LLL.LLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL | ||
LLLLL.LLLL.LLLL.LLLLLLL.LLLLLLL.LLLLLLLL.LLLLL.L.LLLLLLL.LLL.LLLLLLL.LLLLLLLLL.LLLL.LLLLLLLLLL | ||
..L.....L......L....L..LLL..L.L..L....L..LL....L.L........LL...L.......L..L.L.L..LL..L.L.....L | ||
LLLLLLLLLL.LLLL.LLLLLLL.LLLLLLL.LL.LLLLLLLLLLLLL.LLLLLL.LLLLLL.LLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL | ||
LLLLLLLLLL.LLLL.LLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLL..LLLLLLLLLL | ||
LLLLLLLLLL.LLLLLLLLLLLL.LLLLLLL.LLLLLLLL.LL..LLL.LLLLLL.LLLL.LLLLLLL.LLLLLLLL..LL.L.LLLLLLL.LL | ||
LLLLLLLLLL.LLLL.LLLLLLL.LLLLLLLLLLLLLLLL..LLL.LLLLLLLLLLLLLL.LLL.LLL.LLL.LLLLLLLLLLLLLLLLLLLL. | ||
LLLLLLLLLL.LL.L.LLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLL | ||
LLLLLLLLLL.LLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLL.LLLL.LLLLLLL.LLLLLLLLLLL.LL.LLLLLLLLLL |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -23,3 +23,4 @@ aoc2020(7) | |
aoc2020(8) | ||
aoc2020(9) | ||
aoc2020(10) | ||
aoc2020(11) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,159 @@ | ||
#include "input_file_loader.h" | ||
|
||
#include <range/v3/all.hpp> | ||
#include <fmt/core.h> | ||
#include <utility> | ||
|
||
template <typename T> | ||
class PaddedVector2D | ||
{ | ||
public: | ||
PaddedVector2D(std::size_t n_cols, T m_padding_value, std::vector<T> raw) | ||
: m_raw{ std::move(raw) } | ||
, m_n_cols{ n_cols } | ||
, m_padding_value{ std::move(m_padding_value) } | ||
{} | ||
|
||
const T& at(int row, int column) const | ||
{ | ||
if (row < 0 || row > rows() - 1 || column < 0 || column > cols() - 1) { | ||
return m_padding_value; | ||
} else { | ||
return m_raw[index(row, column)]; | ||
} | ||
} | ||
|
||
T& at(int row, int column) | ||
{ | ||
if (row < 0 || row > rows() - 1 || column < 0 || column > cols() - 1) { | ||
return m_padding_value; | ||
} else { | ||
return m_raw[index(row, column)]; | ||
} | ||
} | ||
|
||
std::size_t rows() const | ||
{ | ||
return m_raw.size() / m_n_cols; | ||
} | ||
|
||
std::size_t cols() const | ||
{ | ||
return m_n_cols; | ||
} | ||
|
||
const std::vector<T>& raw() const | ||
{ | ||
return m_raw; | ||
} | ||
|
||
private: | ||
std::size_t index(int row, int column) const | ||
{ | ||
return m_n_cols * row + column; | ||
}; | ||
|
||
std::vector<T> m_raw; | ||
std::size_t m_n_cols; | ||
T m_padding_value; | ||
}; | ||
|
||
enum class SeatState { | ||
Empty, | ||
Occupied, | ||
Missing | ||
}; | ||
|
||
PaddedVector2D<SeatState> parse(std::istream &&is) { | ||
std::vector<SeatState> result; | ||
std::size_t column_size = 0; | ||
for (std::string line; std::getline(is, line);) { | ||
if (column_size == 0) column_size = line.size(); | ||
ranges::transform( | ||
line, | ||
std::back_inserter(result), | ||
[](char c) { return c == 'L' ? SeatState::Empty : SeatState::Missing; }); | ||
} | ||
|
||
return PaddedVector2D{ column_size, SeatState::Empty, std::move(result) }; | ||
} | ||
|
||
constexpr std::array neighbours { | ||
std::pair{-1, -1}, | ||
std::pair{-1, 0}, | ||
std::pair{-1, 1}, | ||
std::pair{0, -1}, | ||
std::pair{0, 1}, | ||
std::pair{1, -1}, | ||
std::pair{1, 0}, | ||
std::pair{1, 1}, | ||
}; | ||
|
||
constexpr auto count_neighbours_1 = [](const PaddedVector2D<SeatState>& data, int row, int column) | ||
{ | ||
return ranges::count( | ||
neighbours | ||
| ranges::views::transform([&data, row, column](auto p) { return data.at(p.first + row, p.second + column); }), | ||
SeatState::Occupied); | ||
}; | ||
|
||
constexpr auto next_state_1 = [](SeatState old, int neighbours) { | ||
if (old == SeatState::Occupied && neighbours >= 4) | ||
return SeatState::Empty; | ||
else if (old == SeatState::Empty && neighbours == 0) | ||
return SeatState::Occupied; | ||
else | ||
return old; | ||
}; | ||
|
||
constexpr auto count_neighbours_2 = [](const PaddedVector2D<SeatState>& data, int row, int column) | ||
{ | ||
return ranges::count( | ||
neighbours | ||
| ranges::views::transform([&data, row, column](auto p) { | ||
auto r = p.first + row; | ||
auto c = p.second + column; | ||
while (data.at(r, c) == SeatState::Missing) { | ||
r += p.first; | ||
c += p.second; | ||
} | ||
return data.at(r, c); | ||
}), | ||
SeatState::Occupied); | ||
}; | ||
|
||
constexpr auto next_state_2 = [](SeatState old, int neighbours) { | ||
if (old == SeatState::Occupied && neighbours >= 5) | ||
return SeatState::Empty; | ||
else if (old == SeatState::Empty && neighbours == 0) | ||
return SeatState::Occupied; | ||
else | ||
return old; | ||
}; | ||
|
||
template <auto next_state, auto count_neighbours> | ||
PaddedVector2D<SeatState> simulate_until_steady(PaddedVector2D<SeatState> arrangement) | ||
{ | ||
int diff = 0; | ||
auto old = arrangement; | ||
do { | ||
diff = 0; | ||
for (int row = 0; row < arrangement.rows(); ++row) { | ||
for (int column = 0; column < arrangement.cols(); ++column) { | ||
const auto old_value = old.at(row, column); | ||
const auto new_value = next_state(old_value, count_neighbours(old, row, column)); | ||
if (old_value != new_value) { ++diff; } | ||
arrangement.at(row, column) = new_value; | ||
} | ||
} | ||
std::swap(arrangement, old); | ||
} while (diff > 0); | ||
return old; | ||
} | ||
|
||
int main(int argc, char **argv) | ||
{ | ||
auto data = parse(load_input(argc, argv)); | ||
fmt::print("Part 1: {}\n", ranges::count(simulate_until_steady<next_state_1, count_neighbours_1>(data).raw(), SeatState::Occupied)); | ||
fmt::print("Part 2: {}\n", ranges::count(simulate_until_steady<next_state_2, count_neighbours_2>(data).raw(), SeatState::Occupied)); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters