| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- 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;
- }
- }
- }
|