| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- 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;
- 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];
- }
- }
- }
|