public long Generate(long generations) { for (long generation = 0; generation < generations; generation++) { var newGeneration = new BitArray(Potteries.Length); foreach (var i in Enumerable.Range(0, Potteries.Length - 5)) { var part = Potteries.CopySlice(i, 5); foreach (var pattern in SpreadPatterns) { if (part.AreFirstFiveBitsEqual(pattern.Pots)) { newGeneration[i + 2] = pattern.Outcome; } } } Potteries = newGeneration; var sum = GetSum(); var sumDifference = sum - _previousSum; if (_previousDifference == sumDifference) { return(sum + (generations - generation - 1) * sumDifference); } _previousSum = sum; _previousDifference = sumDifference; } return(GetSum()); }
public long GetSum() => Potteries.Cast <bool>().Select((b, i) => b ? i - ZeroIndex : 0).Sum();
public override string ToString() => new string(Potteries.Cast <bool>().Select(b => b ? '#' : '.').ToArray());