Ejemplo n.º 1
0
        void ComputeHashCode()
        {
            _hashCode = (int)(N);
            UpdateHash(ref _hashCode, (long)(Turn));

            Degrees.Clear();
            DegreeChangeIndices.Clear();

            Degrees.AddRange(PotSet.Select(c => new Tuple <int, int>(c, Stacks.Count(s => s.IsBitSet(c)))).Where(x => x.Item2 > 0).OrderBy(x => x.Item2));

            var previousDegree = -1;

            for (int i = 0; i < Degrees.Count; i++)
            {
                var degree = Degrees[i];

                UpdateHash(ref _hashCode, degree.Item2);

                if (degree.Item2 != previousDegree)
                {
                    DegreeChangeIndices.Add(i);
                    previousDegree = degree.Item2;
                }
            }

            DegreeChangeIndices.Add(Degrees.Count);
        }
Ejemplo n.º 2
0
        public SlowBoard(List <long> stacks, long pot)
        {
            Stacks   = stacks;
            Pot      = pot;
            Turn     = Turn.Fixer;
            N        = Stacks.Count;
            Template = new Template(Stacks.Select(s => s.PopulationCount()).ToList());

            PotSet              = Pot.ToSet();
            ColorCount          = PotSet.Count();
            Degrees             = new List <Tuple <int, int> >();
            DegreeChangeIndices = new List <int>();
            ComputeHashCode();
        }