using System; using System.IO; using System.Linq; using System.Text; namespace D18._2 { class Program { static void Main(string[] args) { const int len = 100; string input = ParseFile(args[0]); for (int i = 0; i < 100; ++i) input = Step(len, input); int litOn = input.Count(c => c == '#'); Console.WriteLine($"The answer is : {litOn}"); } private static string ParseFile(string arg) { var sb = new StringBuilder(); using (var file = File.OpenText(arg)) { while (true) { var line = file.ReadLine(); if (line == null) break; sb.Append(line); } } string input = sb.ToString(); return input; } private static string Step(int len, string input) { int edgeDetector = 0; int totalSize = len * len; int lastLineDetector = len * (len - 1); int lastColumn = len - 1; var stepb = new StringBuilder(); for (int i = 0; i < totalSize; ++i) { char state = input[i]; char nstate = state; bool onFirstLine = i < len; bool onLastLine = i >= lastLineDetector; if ((onFirstLine && edgeDetector == 0) || (onFirstLine && edgeDetector == lastColumn) || (onLastLine && edgeDetector == 0) || (onLastLine && edgeDetector == lastColumn)) { edgeDetector = AppendState(edgeDetector, lastColumn, stepb, '#'); continue; } int onNeighbors = DetectNeoghbors(len, input, edgeDetector, lastColumn, i, onFirstLine, onLastLine); if (state == '#') { if (onNeighbors != 2 && onNeighbors != 3) nstate = '.'; } else { if (onNeighbors == 3) nstate = '#'; } edgeDetector = AppendState(edgeDetector, lastColumn, stepb, nstate); } return stepb.ToString(); } private static int AppendState(int edgeDetector, int lastColumn, StringBuilder stepb, char nstate) { stepb.Append(nstate); edgeDetector = edgeDetector == lastColumn ? 0 : edgeDetector + 1; return edgeDetector; } private static int DetectNeoghbors(int len, string input, int edgeDetector, int lastColumn, int i, bool onFirstLine, bool onLastLine) { int onNeighbors = 0; if (edgeDetector > 0) onNeighbors += input[i - 1] == '#' ? 1 : 0; if (edgeDetector < lastColumn) onNeighbors += input[i + 1] == '#' ? 1 : 0; if (onFirstLine == false) onNeighbors += input[i - len] == '#' ? 1 : 0; if (onLastLine == false) onNeighbors += input[i + len] == '#' ? 1 : 0; if (onFirstLine == false && edgeDetector > 0) onNeighbors += input[i - len - 1] == '#' ? 1 : 0; if (onFirstLine == false && edgeDetector < lastColumn) onNeighbors += input[i - len + 1] == '#' ? 1 : 0; if (onLastLine == false && edgeDetector > 0) onNeighbors += input[i + len - 1] == '#' ? 1 : 0; if (onLastLine == false && edgeDetector < lastColumn) onNeighbors += input[i + len + 1] == '#' ? 1 : 0; return onNeighbors; } } }