public List <string> Evaluate(Grid grid, PencilMarks pencilMarks) { var result = new List <string>(); foreach (var row in grid.Rows()) { var marks = row .EmptyColumns() .Select(c => pencilMarks.Marks(c, row.RowNumber)) .GroupBy(c => c) .Where(c => c.Key.Count() > 1 && c.Count() == c.Key.Count()); foreach (var group in marks) { var subset = group.Key; foreach (var columnNumber in row.EmptyColumns()) { var marksInCell = pencilMarks.Marks(columnNumber, row.RowNumber); if (!marksInCell.SequenceEqual(subset)) { foreach (var digit in subset) { if (pencilMarks.TryRubOutMark(columnNumber, row.RowNumber, digit) > 0) { result.Add($"DisjointSubset (row) rubbed out {digit} from {columnNumber},{row.RowNumber}. Subset was {{{string.Join(',', subset)}}}"); } } } } } } return(result); }
private static void RemoveMark(PencilMarks pencilMarks, char digit, List <string> results, int columnNumber, int rowNumber) { if (pencilMarks.TryRubOutMark(columnNumber, rowNumber, digit) > 0) { results.Add($"Using CandidateLines removed pencilmark {digit} from {columnNumber},{rowNumber}"); } ; }