Exemplo n.º 1
0
        public void Part1(string input)
        {
            var banks = new Mem(input);
            var set   = new HashSet <string> {
                banks.ToString()
            };
            int result = 0;

            while (true)
            {
                var mx = banks.GetMax();
                banks.Data[mx.ix] = 0;
                int each = mx.max / banks.N;
                if (each > 0)
                {
                    banks.AddToEach(each);
                }
                int rem = mx.max % banks.N;
                if (rem > 0)
                {
                    banks.Distribute(mx.ix + 1, rem);
                }

                result++;
                var str = banks.ToString();
                if (set.Contains(str))
                {
                    break;
                }
                set.Add(str);
            }

            Console.WriteLine("Result: " + result);
        }
Exemplo n.º 2
0
        public void Part2(string input)
        {
            var banks = new Mem(input);
            var set   = new Dictionary <string, int> {
                { banks.ToString(), 0 }
            };
            int count = 0, result;

            while (true)
            {
                var mx = banks.GetMax();
                banks.Data[mx.ix] = 0;
                int each = mx.max / banks.N;
                if (each > 0)
                {
                    banks.AddToEach(each);
                }
                int rem = mx.max % banks.N;
                if (rem > 0)
                {
                    banks.Distribute(mx.ix + 1, rem);
                }

                count++;


                var str = banks.ToString();
                if (set.TryGetValue(str, out int prev))
                {
                    result = count - prev;
                    break;
                }

                set.Add(str, count);
            }

            Console.WriteLine("Result: " + result);
        }