Exemplo n.º 1
0
        private int PositionAt(FireWall f, int delay)
        {
            int time     = delay + f.Depth;
            int position = time % (2 * (f.Severity - 1));

            return(position);
        }
Exemplo n.º 2
0
        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());
        }