| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- using System;
- using System.IO;
- using System.Linq;
- using System.Text;
- namespace D18._1
- {
- 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;
- int onNeighbors = DetectNeoghbors(len, input, edgeDetector, lastLineDetector, lastColumn, i);
- if (state == '#')
- {
- if (onNeighbors != 2 && onNeighbors != 3) nstate = '.';
- }
- else
- {
- if (onNeighbors == 3) nstate = '#';
- }
- stepb.Append(nstate);
- edgeDetector = edgeDetector == lastColumn ? 0 : edgeDetector + 1;
- }
- return stepb.ToString();
- }
- private static int DetectNeoghbors(int len, string input, int edgeDetector, int lastLineDetector, int lastColumn, int i)
- {
- int onNeighbors = 0;
- bool onFirstLine = i < len;
- bool onLastLine = i >= lastLineDetector;
- 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;
- }
- }
- }
|