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); }
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); }