コード例 #1
0
ファイル: Stage2.cs プロジェクト: mikedoug/advent-of-code
        public List <Mask2> Minus(Mask2 Other)
        {
            var builders = new List <StringBuilder>();

            builders.Add(new StringBuilder());

            for (var i = 0; i < MaskString.Length; i++)
            {
                if (MaskString[i] != 'X')
                {
                    if (MaskString[i] != Other.MaskString[i] && Other.MaskString[i] != 'X')
                    {
                        // If there is ever a bit they differ on, then the subtraction removes nothing
                        return(new List <Mask2>()
                        {
                            this
                        });
                    }
                    foreach (var builder in builders)
                    {
                        builder.Append(MaskString[i]);
                    }
                }
                else
                {
                    if (Other.MaskString[i] == 'X')
                    {
                        foreach (var builder in builders)
                        {
                            builder.Append('X');
                        }
                    }
                    else
                    {
                        for (var j = 0; j < builders.Count - 1; j++)
                        {
                            builders[j].Append('X');
                        }
                        builders.Add(new StringBuilder(builders[builders.Count - 1].ToString()));
                        builders[builders.Count - 2].Append(Other.MaskString[i] == '0' ? '1' : '0');
                        builders[builders.Count - 1].Append(Other.MaskString[i]);
                    }
                }
            }

            // Discard the last entry as the other always includes it
            builders.RemoveAt(builders.Count - 1);
            return(builders.Select(builder => new Mask2(builder.ToString())).ToList());
        }