Skip to content

Commit

Permalink
Add 2022 day 09 cpp
Browse files Browse the repository at this point in the history
  • Loading branch information
vss2sn committed Dec 9, 2022
1 parent 142e6c2 commit 485ec78
Show file tree
Hide file tree
Showing 5 changed files with 134 additions and 1 deletion.
2 changes: 2 additions & 0 deletions 2022/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
This folder contains solutions to each of the problems in Advent of Code 2022 in C++.

#### Note ####
- The sample puzzles for some days (eg 9) multiple sample inputs. Edit the file before using it.

|Puzzle|C++ Solutions|Input|Sample Input|Puzzle page with solutions|
|:---:|:---:|:---:|:---:|:---:|
Expand All @@ -14,3 +15,4 @@ This folder contains solutions to each of the problems in Advent of Code 2022 in
| <nobr> [Day 6: Tuning Trouble](https://adventofcode.com/2022/day/6) </nobr> | <nobr> [Part 1](/2022/cpp/day_06a.cpp) [Part 2](/2022/cpp/day_06b.cpp) </nobr> | </nobr> [Link](/2022/input/day_06_input) </nobr> | </nobr> [Link](/2022/sample_input/day_06_sample_input) </nobr> | </nobr> [Link](/2022/puzzles/day_06_puzzle) </nobr> |
| <nobr> [Day 7: No Space Left On Device](https://adventofcode.com/2022/day/7) </nobr> | <nobr> [Part 1](/2022/cpp/day_07a.cpp) [Part 2](/2022/cpp/day_07b.cpp) </nobr> | </nobr> [Link](/2022/input/day_07_input) </nobr> | </nobr> [Link](/2022/sample_input/day_07_sample_input) </nobr> | </nobr> [Link](/2022/puzzles/day_07_puzzle) </nobr> |
| <nobr> [Day 8: Treetop Tree House](https://adventofcode.com/2022/day/8) </nobr> | <nobr> [Part 1](/2022/cpp/day_08a.cpp) [Part 2](/2022/cpp/day_08b.cpp) </nobr> | </nobr> [Link](/2022/input/day_08_input) </nobr> | </nobr> [Link](/2022/sample_input/day_08_sample_input) </nobr> | </nobr> [Link](/2022/puzzles/day_08_puzzle) </nobr> |
| <nobr> [Day 9: Rope Bridge](https://adventofcode.com/2022/day/9) </nobr> | <nobr> [Part 1](/2022/cpp/day_09a.cpp) [Part 2](/2022/cpp/day_09b.cpp) </nobr> | </nobr> [Link](/2022/input/day_09_input) </nobr> | </nobr> [Link](/2022/sample_input/day_09_sample_input) </nobr> | </nobr> [Link](/2022/puzzles/day_09_puzzle) </nobr> |
50 changes: 50 additions & 0 deletions 2022/cpp/day_09a.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#include <array>
#include <unordered_set>
#include <fstream>
#include <iostream>
#include <string>

// TODO: Improve hash function

int main(int argc, char * argv[]) {
std::string input = "../input/day_09_input";
if (argc > 1) {
input = argv[1];
}

std::string line;
std::fstream file(input);

std::array<int, 2> point_H = {0, 0};
std::array<int, 2> point_T = {0, 0};
std::unordered_set<int> s;
while(std::getline(file, line)) {
for (int i = 0; i < std::stoi(line.substr(2, line.size() - 2)); i++) {
if (line[0] == 'U') {
point_H[0] += 1;
} else if (line[0] == 'D') {
point_H[0] -= 1;
} else if (line[0] == 'R') {
point_H[1] += 1;
} else {
point_H[1] -= 1;
}

const auto delta = std::array<int,2>{point_H[0] - point_T[0], point_H[1] - point_T[1]};
if (std::abs(delta[0]) == 2 && std::abs(delta[1]) == 0) {
point_T[0] += delta[0]/2;
} else if (std::abs(delta[0]) == 2 && std::abs(delta[1]) == 1) {
point_T[0] += delta[0]/2;
point_T[1] += delta[1];
} else if (std::abs(delta[0]) == 0 && std::abs(delta[1]) == 2) {
point_T[1] += delta[1]/2;
} else if (std::abs(delta[0]) == 1 && std::abs(delta[1]) == 2) {
point_T[0] += delta[0];
point_T[1] += delta[1]/2;
}
s.insert(point_T[0] * 100000 + point_T[1]);
}
}
std::cout << s.size() << '\n';
return 0;
}
64 changes: 64 additions & 0 deletions 2022/cpp/day_09b.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
#include <array>
#include <fstream>
#include <iostream>
#include <string>
#include <unordered_set>

// TODO: Improve hash function

void update_pair(const int k1, const int k2, std::array<std::array<int,2>, 10>& knots) {
const auto delta = std::array<int,2>{knots[k1][0] - knots[k2][0], knots[k1][1] - knots[k2][1]};
if (std::abs(delta[0]) == 2 && std::abs(delta[1]) == 0) {
knots[k2][0] += delta[0]/2;
} else if (std::abs(delta[0]) == 2 && std::abs(delta[1]) == 1) {
knots[k2][0] += delta[0]/2;
knots[k2][1] += delta[1];
} else if (std::abs(delta[0]) == 0 && std::abs(delta[1]) == 2) {
knots[k2][1] += delta[1]/2;
} else if (std::abs(delta[0]) == 1 && std::abs(delta[1]) == 2) {
knots[k2][0] += delta[0];
knots[k2][1] += delta[1]/2;
} else if (std::abs(delta[0]) == 2 && std::abs(delta[1]) == 2) {
knots[k2][0] += delta[0]/2;
knots[k2][1] += delta[1]/2;
}
}

int main(int argc, char * argv[]) {
std::string input = "../input/day_09_input";
if (argc > 1) {
input = argv[1];
}

std::string line;
std::fstream file(input);

std::array<std::array<int, 2>, 10> knots;
for (auto& row : knots) {
for (auto& ele : row) {
ele = 0;
}
}

std::unordered_set<int> s;
while(std::getline(file, line)) {
for (int i = 0; i < std::stoi(line.substr(2, line.size() - 2)); i++) {
if (line[0] == 'U') {
knots[0][0] += 1;
} else if (line[0] == 'D') {
knots[0][0] -= 1;
} else if (line[0] == 'R') {
knots[0][1] += 1;
} else {
knots[0][1] -= 1;
}
for (int i = 0; i < knots.size() - 1; i++) {
update_pair(i, i+1, knots);
}
s.insert(knots[9][0] * 100000 + knots[9][1]);
}
}

std::cout << s.size() << '\n';
return 0;
}
17 changes: 17 additions & 0 deletions 2022/sample_input/day_09_sample_input
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
R 4
U 4
L 3
D 1
R 4
D 1
L 5
R 2

R 5
U 8
L 8
D 3
R 17
D 10
L 25
U 20
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ This repository contains solutions to the Advent of Code puzzles.

| Year | C++ | Python | Link to folders | Link to README.md |
|:----:|:----:|:----:|:----:|:----:|
|2022 |1-8 | - | [Link](/2022/) |[Link](/2022/README.md) |
|2022 |1-9 | - | [Link](/2022/) |[Link](/2022/README.md) |
|2021 |1-25 | - | [Link](/2021/) |[Link](/2021/README.md) |
|2020 |1-25 |1-25 | [Link](/2020/) |[Link](/2020/README.md) |
|2019 |1-25 |1-7 | [Link](/2019/) |[Link](/2019/README.md) |
Expand Down

0 comments on commit 485ec78

Please sign in to comment.