using System.Collections.Generic;
using System.Text.RegularExpressions;
internal static class Program
public static Dictionary<int, bool> PrimeCache = new Dictionary<int, bool>();
private static void Main(string[] args)
Console.WriteLine($"The Maximum Total Sum Of Non-Prime Numbers From Top To Bottom Is: {result}");
private static string GetInput()
const string input = @"//triangle values. "
private static string[] TransformInputToArray(this string input)
return input.Split(new[] {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries);
private static int[,] TransformTo2Darray(this string[] arrayOfRowsByNewlines)
var tableHolder = new int[arrayOfRowsByNewlines.Length, arrayOfRowsByNewlines.Length + 1];
for (var row = 0; row < arrayOfRowsByNewlines.Length; row++)
var eachCharactersInRow = arrayOfRowsByNewlines[row].ExtractNumber();
for (var column = 0; column < eachCharactersInRow.Length; column++)
tableHolder[row, column] = eachCharactersInRow[column];
private static int[] ExtractNumber(this string rows)
.Select(m => int.Parse(m.Value)).ToArray();
private static int[,] ResetAllPrimeNumbers(this int[,] tableHolder)
var length = tableHolder.GetLength(0);
for (var i = 0; i < length; i++)
for (var j = 0; j < length; j++)
if (tableHolder[i, j] == 0) continue;
if (IsPrime(tableHolder[i, j]))
private static int WalkThroughTheNode(this int[,] tableHolder)
var tempresult = tableHolder;
var length = tableHolder.GetLength(0);
for (var i = length - 2; i >= 0; i--)
for (var j = 0; j < length; j++)
var c = tempresult[i, j];
var a = tempresult[i + 1, j];
var b = tempresult[i + 1, j + 1];
if ((!IsPrime(c) && !IsPrime(a)) || (!IsPrime(c) && !IsPrime(b)))
tableHolder[i, j] = c + Math.Max(a, b);
return tableHolder[0, 0];
public static bool IsPrime(this int number)
if (PrimeCache.ContainsKey(number))
PrimeCache.TryGetValue(number, out value);
if (!PrimeCache.ContainsKey(number)) PrimeCache.Add(number, true);
if (!PrimeCache.ContainsKey(number)) PrimeCache.Add(number, false);
for (var i = 3; i*i <= number; i += 2)
if (!PrimeCache.ContainsKey(number)) PrimeCache.Add(number, false);
if (!PrimeCache.ContainsKey(number)) PrimeCache.Add(number, check);