using System; using System.Collections.Generic; using System.IO; namespace D12._2 { class Rules : Dictionary { } 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; int last = 0; int prev = 0; int cycleresult = 0; int prevcycleresult = 0; int gen = 0; while (true) { string nstate = ""; for (int j = -2; j < state.Length + 2; ++j) nstate += getState(state, j, ruleset); left -= 2; state = nstate; last = CalcResult(state, left); cycleresult = last - prev; gen++; if (cycleresult == prevcycleresult) break; prevcycleresult = cycleresult; prev = last; } var result = (50000000000 - gen) * cycleresult + last; Console.WriteLine($"The result is {result}"); } private static int CalcResult(string state, int l) { int left = l; int result = 0; foreach (char c in state) { if (c == '#') result += left; left++; } return 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]; } } }