internal List <AdapterArrangement> ComputeArrangements() { int previousJoltage = 0; AdapterArrangement first = new AdapterArrangement(new List <int> { previousJoltage }); Dictionary <string, AdapterArrangement> arrangements = new Dictionary <string, AdapterArrangement> { { first.Key, first } }; foreach (int joltage in joltages) { List <AdapterArrangement> newArrangements = new List <AdapterArrangement>(); foreach (string key in arrangements.Keys) { AdapterArrangement arrangement = arrangements[key]; newArrangements.AddRange(arrangement.NewArrangements(joltage)); if (arrangement.CanAppend(joltage)) { arrangement.Append(joltage); } } foreach (AdapterArrangement newArrangement in newArrangements) { if (!arrangements.ContainsKey(newArrangement.Key)) { arrangements.Add(newArrangement.Key, newArrangement); } } previousJoltage = joltage; } return(arrangements.Select(x => x.Value).ToList()); }
internal List <AdapterArrangement> ComputeArrangements2() { joltages.Insert(0, 0); int minJoltage = joltages.Min(); int maxJoltage = joltages.Max(); AdapterArrangement first = new AdapterArrangement(new List <int> { minJoltage }); Dictionary <string, AdapterArrangement> arrangements = new Dictionary <string, AdapterArrangement> { { first.Key, first } }; for (int joltage = minJoltage; joltage < maxJoltage; joltage++) { if (joltages.Contains(joltage)) { Dictionary <int, bool> nextJoltages = new Dictionary <int, bool> { { joltage + 1, joltages.Contains(joltage + 1) }, { joltage + 2, joltages.Contains(joltage + 2) }, { joltage + 3, joltages.Contains(joltage + 3) } }; Dictionary <string, AdapterArrangement> nextArrangements = new Dictionary <string, AdapterArrangement>(); foreach (AdapterArrangement arrangement in arrangements.Select(x => x.Value)) { if (arrangement.MaxJoltage == joltage) { foreach (int nextJoltage in nextJoltages.Where(x => x.Value).Select(x => x.Key)) { AdapterArrangement newArrangement = arrangement.Clone(); newArrangement.Append(nextJoltage); nextArrangements.Add(newArrangement.Key, newArrangement); } } else { nextArrangements.Add(arrangement.Key, arrangement); } } arrangements = nextArrangements; } } return(arrangements.Select(x => x.Value).ToList()); }
internal List <AdapterArrangement> NewArrangements(int joltage) { List <AdapterArrangement> newArrangements = new List <AdapterArrangement>(); AdapterArrangement testArrangement = new AdapterArrangement(arrangement); testArrangement.RemoveLast(); while (testArrangement.ArrangementCount() > 0) { if (!testArrangement.CanAppend(joltage)) { break; } AdapterArrangement newArrangement = new AdapterArrangement(testArrangement.arrangement); newArrangement.Append(joltage); newArrangements.Add(newArrangement); testArrangement.RemoveLast(); } return(newArrangements); }