about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLeah Neukirchen <leah@vuxu.org>2017-12-22 21:21:44 +0100
committerLeah Neukirchen <leah@vuxu.org>2017-12-22 21:21:44 +0100
commitb366ef386c4e8884225c7eec3f28a7fc1eee8167 (patch)
treeeed96fb86879bffcd33e19461674f4dfd8746593
parentdcbe8e18e579996e33e4200e4c58eadb2fc17815 (diff)
downloadadventofcode2017-b366ef386c4e8884225c7eec3f28a7fc1eee8167.tar.gz
adventofcode2017-b366ef386c4e8884225c7eec3f28a7fc1eee8167.tar.xz
adventofcode2017-b366ef386c4e8884225c7eec3f28a7fc1eee8167.zip
day21
-rw-r--r--day21108
-rw-r--r--day21.cc90
-rw-r--r--day21.k3
3 files changed, 201 insertions, 0 deletions
diff --git a/day21 b/day21
new file mode 100644
index 0000000..e6db6d2
--- /dev/null
+++ b/day21
@@ -0,0 +1,108 @@
+../.. => #.#/###/#.#
+#./.. => ..#/.../###
+##/.. => .../.##/###
+.#/#. => #.#/##./.#.
+##/#. => #../#.#/..#
+##/## => #.#/#../###
+.../.../... => .###/..##/.#../###.
+#../.../... => ##.#/.###/#.../##.#
+.#./.../... => ..../#.##/..../.#.#
+##./.../... => ..#./#.../#.../.###
+#.#/.../... => ..##/####/#.#./..##
+###/.../... => .##./#.#./###./.#..
+.#./#../... => #..#/..#./...#/#.#.
+##./#../... => ##../.##./##.#/#..#
+..#/#../... => #.##/.##./##.#/.###
+#.#/#../... => ...#/#.##/..#./##..
+.##/#../... => #.#./..#./##.#/.#.#
+###/#../... => #..#/...#/..#./##.#
+.../.#./... => .#.#/#.../.##./.#.#
+#../.#./... => #.#./.##./..../.#.#
+.#./.#./... => .#../#.##/..##/..##
+##./.#./... => ..##/##.#/...#/..#.
+#.#/.#./... => ...#/.##./####/.#..
+###/.#./... => ###./####/...#/####
+.#./##./... => ...#/.#.#/#.#./#.#.
+##./##./... => ..../...#/#.#./...#
+..#/##./... => .##./#.../##.#/.#..
+#.#/##./... => .#../.#../...#/....
+.##/##./... => ..#./.##./####/.#..
+###/##./... => ##../.#.#/##../.#..
+.../#.#/... => ..#./.#../.#../.###
+#../#.#/... => ####/..../#..#/#...
+.#./#.#/... => #.##/##../##.#/##.#
+##./#.#/... => ###./..../#.##/###.
+#.#/#.#/... => ###./.#../#.#./#.#.
+###/#.#/... => ...#/#..#/#.#./..##
+.../###/... => .#../...#/...#/....
+#../###/... => ####/#.../##../.#.#
+.#./###/... => ...#/####/.##./#..#
+##./###/... => .###/##.#/..#./.#..
+#.#/###/... => ####/###./.###/.###
+###/###/... => .#.#/..##/..#./##..
+..#/.../#.. => #.../.###/###./...#
+#.#/.../#.. => ..../#.../##../..#.
+.##/.../#.. => ####/####/...#/####
+###/.../#.. => #.../.#../#.#./#.#.
+.##/#../#.. => ##../..#./.#../##.#
+###/#../#.. => ..../#..#/.###/.###
+..#/.#./#.. => ...#/##../.##./##..
+#.#/.#./#.. => #.##/.###/#.#./##.#
+.##/.#./#.. => ..../..../.#.#/#..#
+###/.#./#.. => ##../.#.#/.#.#/####
+.##/##./#.. => #.##/##.#/####/....
+###/##./#.. => ..../..##/#.#./.###
+#../..#/#.. => #.#./...#/#.##/.###
+.#./..#/#.. => ####/#.##/.#../.###
+##./..#/#.. => .##./..#./.#.#/##.#
+#.#/..#/#.. => .#.#/#.##/##../#...
+.##/..#/#.. => ..../.###/####/.#..
+###/..#/#.. => ##.#/##.#/..##/.#..
+#../#.#/#.. => #.##/###./##../....
+.#./#.#/#.. => ..../###./####/###.
+##./#.#/#.. => ##.#/#.##/##../#.##
+..#/#.#/#.. => .###/#.../.#../##..
+#.#/#.#/#.. => ##../##.#/#.../.##.
+.##/#.#/#.. => ...#/..#./.###/##.#
+###/#.#/#.. => #.../#.##/..##/..##
+#../.##/#.. => #.##/#.../.##./##..
+.#./.##/#.. => #.#./#.../..##/.#..
+##./.##/#.. => .###/.#.#/####/.#.#
+#.#/.##/#.. => ####/.#../##.#/.###
+.##/.##/#.. => .#../##.#/####/#.#.
+###/.##/#.. => #.##/#.../...#/....
+#../###/#.. => ###./.#.#/##../#..#
+.#./###/#.. => #..#/..##/..../....
+##./###/#.. => ..#./#.../...#/###.
+..#/###/#.. => ##../..##/##../#.##
+#.#/###/#.. => ..../..#./.###/##..
+.##/###/#.. => #..#/####/.#.#/.##.
+###/###/#.. => ###./#.##/##.#/.#..
+.#./#.#/.#. => #.../####/#.#./.##.
+##./#.#/.#. => ..##/..../.#.#/##..
+#.#/#.#/.#. => ####/..##/####/#...
+###/#.#/.#. => ##.#/#.#./.##./####
+.#./###/.#. => .#.#/.#.#/##.#/###.
+##./###/.#. => .#../###./#.##/#...
+#.#/###/.#. => #.../.###/.#../.#..
+###/###/.#. => #.#./.##./.###/####
+#.#/..#/##. => .#../#..#/###./#.##
+###/..#/##. => #.#./####/###./###.
+.##/#.#/##. => .#.#/...#/..../#.##
+###/#.#/##. => ...#/..../#.##/####
+#.#/.##/##. => ##../.#../.#.#/##..
+###/.##/##. => #.../#.#./#.#./#.#.
+.##/###/##. => ..../#.##/#.##/..##
+###/###/##. => ####/##.#/#..#/.##.
+#.#/.../#.# => ##.#/.#.#/####/.##.
+###/.../#.# => #..#/.#.#/#.../#..#
+###/#../#.# => ..##/###./.###/..##
+#.#/.#./#.# => #.##/#.#./##../...#
+###/.#./#.# => ..#./.###/..##/#...
+###/##./#.# => #.../...#/..##/.###
+#.#/#.#/#.# => #..#/.#../...#/#..#
+###/#.#/#.# => ###./#.../##../.##.
+#.#/###/#.# => ...#/..#./...#/#..#
+###/###/#.# => ###./####/.###/###.
+###/#.#/### => .###/.#../..../##.#
+###/###/### => #..#/.###/##../.##.
diff --git a/day21.cc b/day21.cc
new file mode 100644
index 0000000..b6bf177
--- /dev/null
+++ b/day21.cc
@@ -0,0 +1,90 @@
+#include <algorithm>
+#include <iostream>
+#include <map>
+#include <vector>
+
+using namespace std;
+
+using pic = vector<vector<char>>;
+
+pic parse(string s) {
+	int n = s.find("/");
+	pic p(n, vector<char>(n, '?'));
+	int y = 0, x = 0;
+	for (char c : s)
+		if (c == '/') {
+			y++;
+			x = 0;
+		} else {
+			p[y][x++] = c;
+		}
+	return p;
+}
+
+pic rotate(pic p) {
+	pic np = p;
+	const int s = size(p);
+	for (int y = 0; y < s; y++)
+		for (int x = 0; x < s; x++)
+			np[x][s-1-y] = p[y][x];
+	return np;
+}
+
+int
+main() {
+	string line;
+
+	vector<pair<pic, pic>> book;
+
+	while (getline(cin, line)) {
+		int i = line.find(" => ");
+		pic k = parse(line.substr(0, i));
+		pic v = parse(line.substr(i + 4));
+
+		for (int i = 0; i < 4; i++, k = rotate(k)) {
+			book.emplace_back(k, v);
+			reverse(begin(k), end(k));
+			book.emplace_back(k, v);
+			reverse(begin(k), end(k));
+		}
+	}
+
+	pic p{{'.','#','.'}, {'.','.','#'}, {'#','#','#'}};
+
+	for (int n = 1; n <= 18; n++) {
+		int s = 2 + size(p) % 2;
+
+		pic np{(size(p)/s)*(s+1), vector<char>((size(p)/s)*(s+1), '?')};
+
+		for (int y = 0; y < size(p); y += s) {
+		for (int x = 0; x < size(p); x += s) {
+			for (auto &[k, v] : book) {
+				if (size(k) != s)
+					goto next;
+
+				for (int iy = 0; iy < s; iy++)
+				for (int ix = 0; ix < s; ix++)
+					if (p[y+iy][x+ix] != k[iy][ix])
+						goto next;
+
+				for (int iy = 0; iy < size(v); iy++)
+				for (int ix = 0; ix < size(v); ix++)
+					np[(y/s)*(s+1)+iy][(x/s)*(s+1)+ix] = v[iy][ix];
+				goto done;
+			next:;
+			}
+		done:;
+		}
+		}
+
+		if (n == 5 || n == 18) {
+			int cnt = 0;
+			for (auto row : np)
+				cnt += count(begin(row), end(row), '#');
+			cout << cnt << endl;
+		}
+
+		p.swap(np);
+	}
+
+}
diff --git a/day21.k b/day21.k
new file mode 100644
index 0000000..a8d3be1
--- /dev/null
+++ b/day21.k
@@ -0,0 +1,3 @@
+d:!/+,/{{(y;x)}[s 1]'p,|:'p:3{+|x}\*s:"#"="/"\'(" "\x)@0 2}'0:`day21
+((+/+/)'18{,/{,/'+d@+x}'(i#)''(i:0N,2+2!#x)#x}\3 3#0,2\143)5 18    / 190 2335049
+\\