aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Schmucker <ts@its1.de>2024-12-04 12:47:56 +0100
committerThomas Schmucker <ts@its1.de>2024-12-04 12:47:56 +0100
commitea701df2dda12a865e5fe1d17562a13983c2ea69 (patch)
tree9012a5ac69059400f888a59e21a28f144bc3f5ea
parent1e1e3664dba5fffd28f55df19fde648236498c2d (diff)
downloadadvent-of-code-ea701df2dda12a865e5fe1d17562a13983c2ea69.tar.gz
advent-of-code-ea701df2dda12a865e5fe1d17562a13983c2ea69.tar.bz2
advent-of-code-ea701df2dda12a865e5fe1d17562a13983c2ea69.zip
aoc 2024, day4
-rw-r--r--2024/src/day04.cpp99
1 files changed, 99 insertions, 0 deletions
diff --git a/2024/src/day04.cpp b/2024/src/day04.cpp
new file mode 100644
index 0000000..f586afb
--- /dev/null
+++ b/2024/src/day04.cpp
@@ -0,0 +1,99 @@
1#include <fstream>
2#include <iostream>
3#include <map>
4#include <string>
5#include <tuple>
6using namespace std;
7
8map<tuple<size_t, size_t>, char>
9read_file(string_view filename)
10{
11 fstream input{ filename };
12 map<tuple<size_t, size_t>, char> data;
13
14 size_t yPos = 0;
15 for ( string line; getline(input, line); ) {
16 for ( size_t xPos = 0; xPos != line.size(); ++xPos ) {
17 data[{ xPos, yPos }] = line[xPos];
18 }
19 ++yPos;
20 }
21
22 return data;
23}
24
25void
26part1(map<tuple<size_t, size_t>, char> data, size_t size)
27{
28 static const tuple<size_t, size_t> dirs[] = {
29 { -1, -1 },
30 { 0, -1 },
31 { 1, -1 },
32 { 1, 0 },
33 { 1, 1 },
34 { 0, 1 },
35 { -1, 1 },
36 { -1, 0 },
37 };
38 long count = 0;
39 for ( size_t y = 0; y != size; ++y ) {
40 for ( size_t x = 0; x != size; ++x ) {
41 for ( const auto& [dx, dy]: dirs ) {
42 if ( data[{ x, y }] == 'X' &&
43 data[{ x + 1 * dx, y + 1 * dy }] == 'M' &&
44 data[{ x + 2 * dx, y + 2 * dy }] == 'A' &&
45 data[{ x + 3 * dx, y + 3 * dy }] == 'S' ) {
46 ++count;
47 }
48 }
49 }
50 }
51 cout << count << endl;
52}
53
54void
55part2(map<tuple<size_t, size_t>, char> data, size_t size)
56{
57 long count = 0;
58 for ( size_t y = 0; y != size; ++y ) {
59 for ( size_t x = 0; x != size; ++x ) {
60 if ( data[{ x, y }] == 'A' &&
61 data[{ x - 1, y - 1 }] == 'M' &&
62 data[{ x - 1, y + 1 }] == 'M' &&
63 data[{ x + 1, y - 1 }] == 'S' &&
64 data[{ x + 1, y + 1 }] == 'S' ) {
65 ++count;
66 }
67 if ( data[{ x, y }] == 'A' &&
68 data[{ x - 1, y - 1 }] == 'S' &&
69 data[{ x - 1, y + 1 }] == 'M' &&
70 data[{ x + 1, y - 1 }] == 'S' &&
71 data[{ x + 1, y + 1 }] == 'M' ) {
72 ++count;
73 }
74 if ( data[{ x, y }] == 'A' &&
75 data[{ x - 1, y - 1 }] == 'S' &&
76 data[{ x - 1, y + 1 }] == 'S' &&
77 data[{ x + 1, y - 1 }] == 'M' &&
78 data[{ x + 1, y + 1 }] == 'M' ) {
79 ++count;
80 }
81 if ( data[{ x, y }] == 'A' &&
82 data[{ x - 1, y - 1 }] == 'M' &&
83 data[{ x - 1, y + 1 }] == 'S' &&
84 data[{ x + 1, y - 1 }] == 'M' &&
85 data[{ x + 1, y + 1 }] == 'S' ) {
86 ++count;
87 }
88 }
89 }
90 cout << count << endl;
91}
92
93int
94main()
95{
96 auto data = read_file("data/day04.txt");
97 part1(data, 140);
98 part2(data, 140);
99}