changeset 28:299a431ac582

day 22
author Jordi Gutiérrez Hermoso <jordigh@octave.org>
date Sun, 31 Dec 2017 17:54:29 -0500
parents 8bfcc543f85f
children f2c11215006d
files 2017/day22.d
diffstat 1 files changed, 58 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/2017/day22.d
@@ -0,0 +1,58 @@
+import std.stdio;
+import std.complex;
+import std.array: array;
+
+// Clean represented by absence
+enum state {weak, infect, flag};
+
+auto parseGrid(string[] lines) {
+  long mid = lines.length/2;
+  state[Complex!double] grid;
+  foreach(int j, line; lines) {
+    foreach(int i, c; line) {
+      if(c == '#') {
+        grid[Complex!double(i-mid, mid-j)] = state.infect;
+      }
+    }
+  }
+  return grid;
+}
+
+auto walkGrid(state[Complex!double] grid, size_t maxiter) {
+  auto
+    pos = Complex!double(0, 0),
+    facing = Complex!double(0, 1),
+    left = Complex!double(0, 1),
+    right = Complex!double(0, -1),
+    back = Complex!double(-1, 0);
+  size_t infected = 0;
+  foreach(_; 0..maxiter) {
+    if(pos in grid) {
+      final switch(grid[pos]) {
+      case state.weak:
+        grid[pos] = state.infect;
+        infected++;
+        break;
+      case state.infect:
+        grid[pos] = state.flag;
+        facing *= right;
+        break;
+      case state.flag:
+        grid.remove(pos);
+        facing *= back;
+        break;
+      }
+    }
+    else {
+      grid[pos] = state.weak;
+      facing *= left;
+    }
+    pos += facing;
+  }
+  return infected;
+}
+
+void main(string[] args) {
+  auto grid = File(args[1]).byLineCopy.array.parseGrid;
+  writeln(grid.walkGrid(10000000));
+}