private static void SolveTable1(Table1 table1)
        {
            for (int i = 0; i < table1.Columns.Count - 1; i++)
            {
                for (int j = 0; j < table1.Columns[i].Groups.Count - 1; j++)
                {
                    for (int k = 0; k < table1.Columns[i].Groups[j].Records.Count; k++)
                    {
                        var term1 = table1.Columns[i].Groups[j].Records[k];
                        for (int l = 0; l < table1.Columns[i].Groups[j + 1].Records.Count; l++)
                        {
                            var term2 = table1.Columns[i].Groups[j + 1].Records[l];
                            var res   = Data.QuineMcCluskey.Table1.Loop.CompareItems(term1, term2);
                            if (res == null)
                            {
                                continue;
                            }

                            // Mark records as used
                            term1.Used = term2.Used = true;

                            if (table1.Columns[i + 1].Groups[j].Records.Any(r => res.Data.SequenceEqual(r.Data)))
                            {
                                continue;
                            }

                            table1.Columns[i + 1].Groups[j].Records.Add(res);
                        }
                    }
                }
            }
        }
        private static Table1 CreateTable1(IEnumerable <int> minterms)
        {
            var table = new Table1();

            // If there are no minterms at all, return empty table
            if (!minterms.Any())
            {
                return(table);
            }

            // Convert to binary
            var bin_minterms = minterms.Select(m => new
            {
                Binary  = Convert.ToString(m, 2),
                Decimal = m
            });

            // Compute number of bits
            var bits = bin_minterms.Max(m => m.Binary.Length);

            // Pad the binary numbers, convert to logic states
            var bin_minterms_padded = bin_minterms
                                      .Select(m => new
            {
                Binary = m.Binary.PadLeft(bits, '0').Select(b =>
                {
                    switch (b)
                    {
                    case '0':
                        return(LogicState.False);

                    case '1':
                        return(LogicState.True);

                    default:
                        return(LogicState.DontCare);
                    }
                }),
                m.Decimal
            });

            for (int i = 0; i <= bits; i++)
            {
                var column = new Data.QuineMcCluskey.Table1.Column();
                for (int j = 0; j < bits - i + 1; j++)
                {
                    column.Groups.Add(new Data.QuineMcCluskey.Table1.Group());
                }

                table.Columns.Add(column);
            }

            foreach (var minterm in bin_minterms_padded)
            {
                table
                .Columns[0]
                .Groups[minterm.Binary.Count(n => n == LogicState.True)]
                .Records.Add(new Data.QuineMcCluskey.Table1.Loop(new[] { minterm.Decimal }, minterm.Binary.ToArray()));
            }

            return(table);
        }