summary refs log tree commit diff
path: root/22.18/main.cpp
blob: f4fbcea220396e5d079b65ed454b871c2b097e21 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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));
}