aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkaiwu <kaiwu2004@gmail.com>2023-01-05 12:00:21 +0800
committerkaiwu <kaiwu2004@gmail.com>2023-01-05 12:00:21 +0800
commit521b950d6978dc026cfbb83897d2caba2ca942d5 (patch)
tree46359ab11a574a2d543823eb72fd16e4c9f83519
parent46597275fcf3ea04a57bf333571bbd2681fd5605 (diff)
downloadadvent-of-code-521b950d6978dc026cfbb83897d2caba2ca942d5.tar.gz
advent-of-code-521b950d6978dc026cfbb83897d2caba2ca942d5.zip
2022 day24 part1
-rw-r--r--src/2022/day24/aoc.cpp24
-rw-r--r--src/2022/day24/aoc.h88
-rw-r--r--src/2022/day24/input013
3 files changed, 116 insertions, 9 deletions
diff --git a/src/2022/day24/aoc.cpp b/src/2022/day24/aoc.cpp
index 5fd801b..80b233c 100644
--- a/src/2022/day24/aoc.cpp
+++ b/src/2022/day24/aoc.cpp
@@ -2,8 +2,28 @@
namespace aoc2022 {
-std::pair<int, int> day24(line_view) {
- return {0, 0};
+struct pos {
+ int x;
+ int y;
+};
+
+void expedition(int m, pos p, pos target, valley& v, int* max) {
+
+}
+
+std::pair<int, int> day24(line_view file) {
+ valley v{8,6}; //sample
+
+ int height{0};
+ per_line(file, [&v, &height](line_view lv) {
+ v.load(height++, lv);
+ return true;
+ });
+
+ int min{INT32_MAX};
+ expedition(0, {1, 0}, {6, 5}, v, &min); // sample
+
+ return {min, 0};
}
}
diff --git a/src/2022/day24/aoc.h b/src/2022/day24/aoc.h
index 920f69c..455079f 100644
--- a/src/2022/day24/aoc.h
+++ b/src/2022/day24/aoc.h
@@ -1,7 +1,95 @@
#include "common.h"
#include <vector>
+#include <map>
namespace aoc2022 {
+struct blizzard {
+ int x;
+ int y;
+ char c;
+
+ blizzard next(int height, int width) {
+ switch(c) {
+ case '>' : return {x+1 == width - 1 ? 1 : x+1, y, c};
+ case '<' : return {x-1 == 0 ? width - 2 : x-1, y, c};
+ case '^' : return {x, y-1 == 0 ? height - 2: y-1, c};
+ case 'v' : return {x, y+1 == height - 1 ? 1: y+1, c};
+ default: break;
+ }
+ return *this;
+ }
+
+ friend bool operator<(blizzard b1, blizzard b2) {
+ return b1.x < b2.x ? true : b1.x > b2.x ? false : b1.y < b2.y;
+ }
+ friend bool operator==(blizzard b1, blizzard b2) {
+ return b1.x == b2.x && b1.y == b2.y;
+ }
+};
+
+struct valley {
+ int width;
+ int height;
+
+ char* pixel;
+ std::vector<blizzard> blz;
+
+ valley(int w, int h): width(w), height(h) {
+ pixel = (char*) malloc(width * height);
+ }
+
+ char& get(int h, int w) {
+ return *(pixel + h*width + w);
+ }
+
+ void load(int h, line_view lv) {
+ for(size_t i = 0; i < lv.length - 1; i++) {
+ char c = *(lv.line + i);
+ get(h, i) = c;
+ if (c == '<' || c == '>' || c == '^' || c == 'v') {
+ get(h, i) = '.';
+ blz.emplace_back(blizzard{(int) i, h, c});
+ }
+ }
+ }
+
+ void next() {
+ std::vector<blizzard> n{blz.size()};
+ for(size_t i = 0; i < blz.size(); i++) {
+ n[i] = blz[i].next(height, width);
+ }
+ blz = n;
+ }
+
+ void print() {
+ std::map<blizzard, int> m;
+ for (auto& b: blz) {
+ auto p = m.insert({b, 1});
+ if (!p.second) {
+ p.first->second += 1;
+ }
+ }
+
+ for(int y = 0; y < height; y++) {
+ for(int x = 0; x < width; x++) {
+ auto it = m.find(blizzard{x, y, '.'});
+ if (it == m.end()) {
+ printf("%c", get(y, x));
+ }
+ else {
+ if (it->second > 1) {
+ printf("%d", it->second);
+ }
+ else {
+ printf("%c", it->first.c);
+ }
+ }
+ }
+ printf("\n");
+ }
+ }
+};
+
std::pair<int, int> day24(line_view);
}
diff --git a/src/2022/day24/input0 b/src/2022/day24/input0
index 158014b..685dc4f 100644
--- a/src/2022/day24/input0
+++ b/src/2022/day24/input0
@@ -1,7 +1,6 @@
-#.#####
-#.....#
-#>....#
-#.....#
-#...v.#
-#.....#
-#####.#
+#.######
+#>>.<^<#
+#.<..<<#
+#>v.><>#
+#<^v^^>#
+######.#