// #define Day25 #if Day25 var linesSplit = File.ReadAllLines("day25/input"); int rowMax = linesSplit.Length; int colMax = linesSplit[0].Length; var map = new char[linesSplit.Length, linesSplit[0].Length]; var easts = new List(); var souths = new List(); for (int row = 0; row < linesSplit.Length; row++) { for (int col = 0; col < linesSplit[0].Length; col++) { if (linesSplit[row][col] == '>') { map[row, col] = linesSplit[row][col]; easts.Add(new Point(row, col)); } else if (linesSplit[row][col] == 'v') { map[row, col] = linesSplit[row][col]; souths.Add(new Point(row, col)); } } } long step = 0; bool moved = true; while (moved) { moved = false; var nextMap = new char[linesSplit.Length, linesSplit[0].Length]; var nextEasts = new List(); var nextSouths = new List(); foreach (var east in easts) { int checkCol = (east.col + 1) % colMax; if (map[east.row, checkCol] == '\0') { nextMap[east.row, checkCol] = '>'; nextEasts.Add(new Point(east.row, checkCol)); moved = true; } else { nextMap[east.row, east.col] = '>'; nextEasts.Add(new Point(east.row, east.col)); } } foreach (var south in souths) { int checkRow = (south.row + 1) % rowMax; if (nextMap[checkRow, south.col] == '\0' && map[checkRow, south.col] != 'v') { nextMap[checkRow, south.col] = 'v'; nextSouths.Add(new Point(checkRow, south.col)); moved = true; } else { nextMap[south.row, south.col] = 'v'; nextSouths.Add(new Point(south.row, south.col)); } } map = nextMap; easts = nextEasts; souths = nextSouths; step++; } Console.WriteLine(step); record Point(int row, int col); #endif