summary refs log tree commit diff
diff options
context:
space:
mode:
authordzwdz2022-12-18 11:46:34 +0100
committerdzwdz2022-12-18 11:46:34 +0100
commit566eb99fee1450feec1482680cd37383f3040724 (patch)
tree2ffdb67c474b990ef7183d598a31e238c43288df
parentccc7912daa19de575f2f248520a3ca947281c97e (diff)
day 18 part 1
-rw-r--r--22.18/main.cpp83
1 files changed, 83 insertions, 0 deletions
diff --git a/22.18/main.cpp b/22.18/main.cpp
new file mode 100644
index 0000000..f4fbcea
--- /dev/null
+++ b/22.18/main.cpp
@@ -0,0 +1,83 @@
+#include <cstdio>
+#include <string>
+#include <unordered_set>
+using namespace std;
+
+struct Vec3
+{
+	int x, y, z;
+
+	bool operator==(const Vec3& o) const {
+		return o.x == x && o.y == y && o.z == z;
+	}
+
+	int& operator[](int idx) {
+		switch (idx) {
+		case 0: return x;
+		case 1: return y;
+		case 2: return z;
+		default:
+			throw "whatever";
+		}
+	}
+
+	Vec3 operator+(const Vec3& o) const {
+		return {
+			x + o.x,
+			y + o.y,
+			z + o.z,
+		};
+	}
+};
+
+/* from nullprogram */
+uint32_t
+lowbias32(uint32_t x)
+{
+	x ^= x >> 16;
+	x *= 0x7feb352dU;
+	x ^= x >> 15;
+	x *= 0x846ca68bU;
+	x ^= x >> 16;
+	return x;
+}
+
+template<>
+struct std::hash<Vec3>
+{
+	size_t operator()(Vec3 const& v) const noexcept {
+		int h = 0;
+		h = lowbias32(h ^ v.x);
+		h = lowbias32(h ^ v.y);
+		h = lowbias32(h ^ v.z);
+		return h;
+	}
+};
+
+int
+partOne(unordered_set<Vec3> const& map)
+{
+	int total = 0;
+	for (auto &v : map) {
+		for (int axis = 0; axis < 3; axis++) {
+			for (auto ad : {-1, 1}) {
+				Vec3 vd = v;
+				vd[axis] += ad;
+				if (map.count(vd) == 0) total++;
+			}
+		}
+	}
+	return total;
+}
+
+int
+main()
+{
+	int x, y, z;
+	unordered_set<Vec3> map;
+	while (scanf("%d,%d,%d ", &x, &y, &z) == 3) {
+		Vec3 v = {x, y, z};
+		map.insert(v);
+	}
+	printf("%d\n", partOne(map));
+}