private void RemoveGene(int i)
        {
            Array.Copy(Genes, i + 1, Genes, i, GenesLength - (i + 1));
            var move = new TMove();

            move.Decode((int)Genes[GenesLength - 1]);
            move.Axis = (move.Axis + 1) % 3;
            Genes[GenesLength - 1] = move.Encode();
        }
        public void Correct()
        {
            for (int i = 0; i < GenesLength; i++)
            {
                var move = new TMove();
                move.Decode((int)Genes[i]);

                for (int j = i - 1; j >= 0; j--)
                {
                    var pMove = new TMove();
                    pMove.Decode((int)Genes[j]);

                    if (move.Axis != pMove.Axis)
                    {
                        break;
                    }

                    if (move.SegNo == pMove.SegNo)
                    {
                        RemoveGene(i);
                        i--;
                        var angle = (pMove.Angle + move.Angle + 2) % 4;

                        if (angle == 0)
                        {
                            RemoveGene(j);
                            i--;
                        }
                        else
                        {
                            pMove.Angle = angle - 1;
                            Genes[j]    = pMove.Encode();
                        }

                        break;
                    }
                }
            }
        }