|
|
@@ -0,0 +1,67 @@
|
|
|
+using System;
|
|
|
+using System.Collections.Generic;
|
|
|
+using System.IO;
|
|
|
+
|
|
|
+namespace D12._2
|
|
|
+{
|
|
|
+ class Rules : Dictionary<string, char> { }
|
|
|
+ class Program
|
|
|
+ {
|
|
|
+ static void Main(string[] args)
|
|
|
+ {
|
|
|
+ if (args.Length < 1) return;
|
|
|
+ if (File.Exists(args[0]) == false) return;
|
|
|
+ var file = File.OpenText(args[0]);
|
|
|
+
|
|
|
+ var state = file.ReadLine().Substring(@"initial state: ".Length);
|
|
|
+ file.ReadLine();
|
|
|
+
|
|
|
+ var ruleset = new Rules();
|
|
|
+
|
|
|
+ do
|
|
|
+ {
|
|
|
+ var line = file.ReadLine();
|
|
|
+ if (line == null) break;
|
|
|
+
|
|
|
+ var s = line.Split(" => ");
|
|
|
+ ruleset.Add(s[0], s[1][0]);
|
|
|
+
|
|
|
+ } while (true);
|
|
|
+
|
|
|
+ int left = 0;
|
|
|
+ for (int i = 0; i < 20; ++i)
|
|
|
+ {
|
|
|
+ string nstate = "";
|
|
|
+
|
|
|
+ for (int j = -2; j < state.Length + 2; ++j)
|
|
|
+ nstate += getState(state, j, ruleset);
|
|
|
+
|
|
|
+ left -= 2;
|
|
|
+ state = nstate;
|
|
|
+
|
|
|
+ CalcResult(state, left);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void CalcResult(string state, int l)
|
|
|
+ {
|
|
|
+ int left = l;
|
|
|
+ int result = 0;
|
|
|
+ foreach (char c in state)
|
|
|
+ {
|
|
|
+ if (c == '#') result += left;
|
|
|
+ left++;
|
|
|
+ }
|
|
|
+
|
|
|
+ Console.WriteLine(result);
|
|
|
+ }
|
|
|
+
|
|
|
+ static char getState(string state, int p, Rules rules)
|
|
|
+ {
|
|
|
+ var sb = "";
|
|
|
+ for (var i = -2; i <= 2; ++i)
|
|
|
+ sb += p + i < 0 || p + i >= state.Length ? '.' : state[p + i];
|
|
|
+ return rules[sb];
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|