diff options
| author | Sebastiano Tronto <sebastiano@tronto.net> | 2024-12-04 08:07:57 +0100 |
|---|---|---|
| committer | Sebastiano Tronto <sebastiano@tronto.net> | 2024-12-04 08:07:57 +0100 |
| commit | 59892b65a9810044ca7f135e39c8d44094224c85 (patch) | |
| tree | eaaeefa9253f2828bf17fe79ac2f690fe9bd708c /2024/04/day04b.cpp | |
| parent | 4aebede600c180b51d0b6ded0e42ec8a4223283e (diff) | |
| download | aoc-59892b65a9810044ca7f135e39c8d44094224c85.tar.gz aoc-59892b65a9810044ca7f135e39c8d44094224c85.zip | |
Day 4 2024
Diffstat (limited to '2024/04/day04b.cpp')
| -rw-r--r-- | 2024/04/day04b.cpp | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/2024/04/day04b.cpp b/2024/04/day04b.cpp new file mode 100644 index 0000000..3d338d8 --- /dev/null +++ b/2024/04/day04b.cpp | |||
| @@ -0,0 +1,114 @@ | |||
| 1 | #include <algorithm> | ||
| 2 | #include <iostream> | ||
| 3 | #include <sstream> | ||
| 4 | #include <string> | ||
| 5 | #include <string_view> | ||
| 6 | #include <vector> | ||
| 7 | using namespace std; | ||
| 8 | |||
| 9 | enum class Direction { U, D, R, L, UR, UL, DR, DL }; | ||
| 10 | Direction all_directions[] = { | ||
| 11 | Direction::U, Direction::D, Direction::R, Direction::L, | ||
| 12 | Direction::UR, Direction::UL, Direction::DR, Direction::DL | ||
| 13 | }; | ||
| 14 | |||
| 15 | pair<int, int> step(pair<int, int> p, Direction d) { | ||
| 16 | auto [i, j] = p; | ||
| 17 | |||
| 18 | switch (d) { | ||
| 19 | case Direction::U: | ||
| 20 | return make_pair(i-1, j); | ||
| 21 | case Direction::D: | ||
| 22 | return make_pair(i+1, j); | ||
| 23 | case Direction::R: | ||
| 24 | return make_pair(i, j+1); | ||
| 25 | case Direction::L: | ||
| 26 | return make_pair(i, j-1); | ||
| 27 | case Direction::UR: | ||
| 28 | return make_pair(i-1, j+1); | ||
| 29 | case Direction::UL: | ||
| 30 | return make_pair(i-1, j-1); | ||
| 31 | case Direction::DR: | ||
| 32 | return make_pair(i+1, j+1); | ||
| 33 | case Direction::DL: | ||
| 34 | return make_pair(i+1, j-1); | ||
| 35 | } | ||
| 36 | |||
| 37 | return make_pair(-999,-999); | ||
| 38 | } | ||
| 39 | |||
| 40 | class Board { | ||
| 41 | public: | ||
| 42 | int M, N; | ||
| 43 | |||
| 44 | Board(vector<string> &lines) { | ||
| 45 | N = lines.size(); | ||
| 46 | M = 0; | ||
| 47 | for (string l : lines) | ||
| 48 | M = max(M, (int)l.size()); | ||
| 49 | cells = new char[M * N]; | ||
| 50 | for (int i = 0; i < N; i++) | ||
| 51 | for (int j = 0; j < M; j++) | ||
| 52 | cells[N*i + j] = j < (int)lines[i].size() ? | ||
| 53 | lines[i][j] : out_of_bound; | ||
| 54 | } | ||
| 55 | |||
| 56 | string word_at(int i, int j, Direction d, int l) { | ||
| 57 | string ret = ""; | ||
| 58 | auto p = make_pair(i, j); | ||
| 59 | for (int k = 0; k < l; k++, p = step(p, d)) | ||
| 60 | ret += (*this)[p]; | ||
| 61 | return ret; | ||
| 62 | } | ||
| 63 | |||
| 64 | ~Board() { | ||
| 65 | delete []cells; | ||
| 66 | } | ||
| 67 | |||
| 68 | private: | ||
| 69 | const char out_of_bound = '.'; | ||
| 70 | char *cells; | ||
| 71 | |||
| 72 | char operator[](pair<int, int> p) { | ||
| 73 | auto [i, j] = p; | ||
| 74 | if (i >= N || i < 0 || j >= M || j < 0) | ||
| 75 | return out_of_bound; | ||
| 76 | return cells[N*i + j]; | ||
| 77 | } | ||
| 78 | }; | ||
| 79 | |||
| 80 | int main() { | ||
| 81 | string line; | ||
| 82 | vector<string> lines; | ||
| 83 | while (getline(cin, line)) | ||
| 84 | lines.push_back(line); | ||
| 85 | |||
| 86 | Board board(lines); | ||
| 87 | int tot = 0; | ||
| 88 | for (int i = 0; i < board.N; i++) { | ||
| 89 | for (int j = 0; j < board.M; j++) { | ||
| 90 | int tmp = 0; | ||
| 91 | auto p = make_pair(i, j); | ||
| 92 | auto [x, y] = step(p, Direction::UL); | ||
| 93 | string wUL = board.word_at(x, y, Direction::DR, 3); | ||
| 94 | tmp += wUL == "MAS"; | ||
| 95 | |||
| 96 | pair<int&, int&>(x, y) = step(p, Direction::UR); | ||
| 97 | string wUR = board.word_at(x, y, Direction::DL, 3); | ||
| 98 | tmp += wUR == "MAS"; | ||
| 99 | |||
| 100 | pair<int&, int&>(x, y) = step(p, Direction::DL); | ||
| 101 | string wDL = board.word_at(x, y, Direction::UR, 3); | ||
| 102 | tmp += wDL == "MAS"; | ||
| 103 | |||
| 104 | pair<int&, int&>(x, y) = step(p, Direction::DR); | ||
| 105 | string wDR = board.word_at(x, y, Direction::UL, 3); | ||
| 106 | tmp += wDR == "MAS"; | ||
| 107 | |||
| 108 | if (tmp == 2) tot++; | ||
| 109 | } | ||
| 110 | } | ||
| 111 | cout << tot << endl; | ||
| 112 | |||
| 113 | return 0; | ||
| 114 | } | ||
