private int PositionAt(FireWall f, int delay) { int time = delay + f.Depth; int position = time % (2 * (f.Severity - 1)); return(position); }
string Firewall(string input, bool part2) { var inputs = input.Split('\n'); var firewalls = new List <FireWall>(); int maxDepth = 0; int penalty = 0; foreach (var i in inputs) { var depth = Convert.ToInt32(i.Substring(0, i.IndexOf(':'))); var severity = Convert.ToInt32(i.Substring(i.IndexOf(' ') + 1)); var f = new FireWall(depth, severity); firewalls.Add(f); maxDepth = depth; } if (part2) { int delay = 0; while (true) { penalty = 0; delay += 1; foreach (var f in firewalls) { f.Position = PositionAt(f, delay); if (f.Position == 0) { penalty += Math.Max(f.Depth, 1); break; } } if (penalty == 0) { penalty = delay; break; } } } else { penalty = RunFirewalls(firewalls, maxDepth, part2); } return(penalty.ToString()); }