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