Skip to content

Commit bbd37c4

Browse files
committed
Cell class changes:
- removed constructor Cell(int value) - added constructor Cell(int value, int rowIndex, int columnIndex) - added properties RowIndex and ColumnIndex - changed ToString method to also output RowIndex and ColumnIndex SudokuPuzzle class - removed GetCellIndex method.
1 parent 5be9dd8 commit bbd37c4

23 files changed

+91
-139
lines changed

SimpleSudokuSolver.Tests/Model/BlockTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,9 @@ public void ToStringTest()
4343
var toString = block.ToString();
4444
Assert.That(toString, Is.EqualTo($" {newLine} {newLine} {newLine}"));
4545

46-
block.Cells[0, 0] = new Cell(1);
47-
block.Cells[1, 1] = new Cell(5);
48-
block.Cells[2, 2] = new Cell(0);
46+
block.Cells[0, 0] = new Cell(1, 0, 0);
47+
block.Cells[1, 1] = new Cell(5, 1, 1);
48+
block.Cells[2, 2] = new Cell(0, 2, 2);
4949
toString = block.ToString();
5050
Assert.That(toString, Is.EqualTo($"1 {newLine} 5 {newLine} 0{newLine}"));
5151
}

SimpleSudokuSolver.Tests/Model/CellTests.cs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public class CellTests
1010
[Test]
1111
public void EmptyCellTest()
1212
{
13-
var emptyCell = new Cell(0);
13+
var emptyCell = new Cell(0, 0, 0);
1414
Assert.That(emptyCell.Value, Is.EqualTo(0));
1515
Assert.That(emptyCell.HasValue, Is.False);
1616
Assert.That(emptyCell.CanBe, Is.Empty);
@@ -19,29 +19,31 @@ public void EmptyCellTest()
1919
[Test]
2020
public void ValidCellTest()
2121
{
22-
var cell = new Cell(9);
22+
var cell = new Cell(9, 1, 2);
2323
Assert.That(cell.Value, Is.EqualTo(9));
2424
Assert.That(cell.HasValue, Is.True);
2525
Assert.That(cell.CanBe, Is.Empty);
26+
Assert.That(cell.RowIndex, Is.EqualTo(1));
27+
Assert.That(cell.ColumnIndex, Is.EqualTo(2));
2628
}
2729

2830
[Test]
2931
public void InvalidCellTest()
3032
{
31-
Assert.That(() => new Cell(-1), Throws.InstanceOf<ArgumentException>());
32-
Assert.That(() => new Cell(10), Throws.InstanceOf<ArgumentException>());
33+
Assert.That(() => new Cell(-1, 0, 0), Throws.InstanceOf<ArgumentException>());
34+
Assert.That(() => new Cell(10, 0, 0), Throws.InstanceOf<ArgumentException>());
3335
}
3436

3537
[Test]
3638
public void ToStringTest()
3739
{
38-
var cell = new Cell(5);
40+
var cell = new Cell(5, 1, 2);
3941
var toString = cell.ToString();
40-
Assert.That(toString, Is.EqualTo("5"));
42+
Assert.That(toString, Is.EqualTo("[1,2]=5"));
4143

42-
cell = new Cell(0);
44+
cell = new Cell(0, 3, 4);
4345
toString = cell.ToString();
44-
Assert.That(toString, Is.EqualTo("0"));
46+
Assert.That(toString, Is.EqualTo("[3,4]=0"));
4547
}
4648
}
4749
}

SimpleSudokuSolver.Tests/Model/ColumnTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@ public void ToStringTest()
3636
var toString = column.ToString();
3737
Assert.That(toString, Is.EqualTo($" {newLine} {newLine} {newLine} {newLine} {newLine} {newLine} {newLine} {newLine} {newLine}"));
3838

39-
column.Cells[0] = new Cell(1);
40-
column.Cells[3] = new Cell(4);
41-
column.Cells[8] = new Cell(0);
39+
column.Cells[0] = new Cell(1, 0, 0);
40+
column.Cells[3] = new Cell(4, 3, 0);
41+
column.Cells[8] = new Cell(0, 8, 0);
4242
toString = column.ToString();
4343
Assert.That(toString, Is.EqualTo($"1{newLine} {newLine} {newLine}4{newLine} {newLine} {newLine} {newLine} {newLine}0{newLine}"));
4444
}

SimpleSudokuSolver.Tests/Model/RowTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ public void ToStringTest()
3434
var toString = row.ToString();
3535
Assert.That(toString, Is.EqualTo(new string(' ', 17)));
3636

37-
row.Cells[0] = new Cell(1);
38-
row.Cells[3] = new Cell(4);
39-
row.Cells[8] = new Cell(0);
37+
row.Cells[0] = new Cell(1, 0, 0);
38+
row.Cells[3] = new Cell(4, 0, 3);
39+
row.Cells[8] = new Cell(0, 0, 8);
4040
toString = row.ToString();
4141
Assert.That(toString, Is.EqualTo("1 4 0"));
4242
}

SimpleSudokuSolver.Tests/Model/SudokuPuzzleTests.cs

Lines changed: 5 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -128,32 +128,10 @@ public void GetCellIndexTest()
128128
{
129129
var sudokuPuzzle = new SudokuPuzzle(_sudoku);
130130
var cell = sudokuPuzzle.Cells[4, 7];
131-
Assert.That(cell.Value, Is.EqualTo(5));
132-
133-
var cellIndex = sudokuPuzzle.GetCellIndex(cell);
134-
135-
Assert.That(cellIndex.RowIndex, Is.EqualTo(4));
136-
Assert.That(cellIndex.ColumnIndex, Is.EqualTo(7));
137-
}
138-
139-
[Test]
140-
public void GetCellIndexForNullTest()
141-
{
142-
var sudokuPuzzle = new SudokuPuzzle(_sudoku);
143-
var cellIndex = sudokuPuzzle.GetCellIndex(null);
144131

145-
Assert.That(cellIndex.RowIndex, Is.EqualTo(-1));
146-
Assert.That(cellIndex.ColumnIndex, Is.EqualTo(-1));
147-
}
148-
149-
[Test]
150-
public void GetCellIndexForNonExistingCellTest()
151-
{
152-
var sudokuPuzzle = new SudokuPuzzle(_sudoku);
153-
var cellIndex = sudokuPuzzle.GetCellIndex(new Cell(5));
154-
155-
Assert.That(cellIndex.RowIndex, Is.EqualTo(-1));
156-
Assert.That(cellIndex.ColumnIndex, Is.EqualTo(-1));
132+
Assert.That(cell.Value, Is.EqualTo(5));
133+
Assert.That(cell.RowIndex, Is.EqualTo(4));
134+
Assert.That(cell.ColumnIndex, Is.EqualTo(7));
157135
}
158136

159137
[Test]
@@ -183,8 +161,9 @@ public void GetBlockIndexForNullTest()
183161
public void GetBlockIndexForNonExistingCellTest()
184162
{
185163
var sudokuPuzzle = new SudokuPuzzle(_sudoku);
186-
var cellIndex = sudokuPuzzle.GetBlockIndex(new Cell(5));
164+
var cellIndex = sudokuPuzzle.GetBlockIndex(new Cell(0, 0, 0));
187165

166+
// Cell equality is compared by reference (Object.ReferenceEquals)
188167
Assert.That(cellIndex.RowIndex, Is.EqualTo(-1));
189168
Assert.That(cellIndex.ColumnIndex, Is.EqualTo(-1));
190169
}

SimpleSudokuSolver.UI/SudokuBoard.xaml.cs

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,7 @@ private void OnKeyDown(object sender, KeyEventArgs e)
9191
return;
9292

9393
// if value is not correct or solver cannot solve the puzzle (so we do not know if the value is correct), we do not allow it
94-
var cellIndex = SudokuPuzzle.GetCellIndex(_activeCell.Cell);
95-
var solvedValue = SolvedSudokuPuzzle.Cells[cellIndex.RowIndex, cellIndex.ColumnIndex].Value;
94+
var solvedValue = SolvedSudokuPuzzle.Cells[_activeCell.Cell.RowIndex, _activeCell.Cell.ColumnIndex].Value;
9695

9796
var mainViewModel = (MainViewModel)DataContext;
9897
if (solvedValue == 0)
@@ -102,11 +101,11 @@ private void OnKeyDown(object sender, KeyEventArgs e)
102101
}
103102
if (enteredValue != solvedValue)
104103
{
105-
mainViewModel.AppendMessage($"Row {cellIndex.RowIndex + 1} Column {cellIndex.ColumnIndex + 1} Value {enteredValue} [Wrong value entered by user]");
104+
mainViewModel.AppendMessage($"Row {_activeCell.Cell.RowIndex + 1} Column {_activeCell.Cell.ColumnIndex + 1} Value {enteredValue} [Wrong value entered by user]");
106105
return;
107106
}
108107

109-
var solution = new SingleStepSolution(cellIndex.RowIndex, cellIndex.ColumnIndex, enteredValue, "Entered by user");
108+
var solution = new SingleStepSolution(_activeCell.Cell.RowIndex, _activeCell.Cell.ColumnIndex, enteredValue, "Entered by user");
110109
SudokuPuzzle.ApplySingleStepSolution(solution);
111110
_activeCell.NotifyCellValueChanged();
112111
SetSelection(_activeCell);
@@ -228,13 +227,11 @@ private void ChangeActiveCell(int rowOffset, int columnOffset)
228227
}
229228
else
230229
{
231-
var activeCellIndex = SudokuPuzzle.GetCellIndex(_activeCell.Cell);
232-
233-
var proposedRowIndex = activeCellIndex.RowIndex + rowOffset;
230+
var proposedRowIndex = _activeCell.Cell.RowIndex + rowOffset;
234231
var rowIndex = (proposedRowIndex < 0) ? maxIndex :
235232
proposedRowIndex % SudokuPuzzle.NumberOfRowsOrColumnsInPuzzle;
236233

237-
var proposedColumnIndex = activeCellIndex.ColumnIndex + columnOffset;
234+
var proposedColumnIndex = _activeCell.Cell.ColumnIndex + columnOffset;
238235
var columnIndex = (proposedColumnIndex < 0) ? maxIndex :
239236
proposedColumnIndex % SudokuPuzzle.NumberOfRowsOrColumnsInPuzzle;
240237

@@ -280,15 +277,12 @@ private void SetSelection(CellViewModel selectedCellViewModel)
280277
if (SudokuPuzzle == null)
281278
return;
282279

283-
var selectedCellIndex = SudokuPuzzle.GetCellIndex(selectedCellViewModel.Cell);
284-
285280
foreach (var cellViewModel in _cellViewModels)
286281
{
287-
var index = SudokuPuzzle.GetCellIndex(cellViewModel.Cell);
288282
var hasValue = cellViewModel.Cell.HasValue;
289283
var hasSameValue = cellViewModel.Cell.Value == selectedCellViewModel.Cell.Value;
290-
var isInSameRow = selectedCellIndex.RowIndex == index.RowIndex;
291-
var isInSameColumn = selectedCellIndex.ColumnIndex == index.ColumnIndex;
284+
var isInSameRow = selectedCellViewModel.Cell.RowIndex == cellViewModel.Cell.RowIndex;
285+
var isInSameColumn = selectedCellViewModel.Cell.ColumnIndex == cellViewModel.Cell.ColumnIndex;
292286

293287
if (isInSameRow || isInSameColumn || (hasValue && hasSameValue))
294288
{

SimpleSudokuSolver/Model/Cell.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,16 @@ public int Value
2525
}
2626
}
2727

28+
/// <summary>
29+
/// Zero-based row index of cell in the puzzle.
30+
/// </summary>
31+
public int RowIndex { get; }
32+
33+
/// <summary>
34+
/// Zero-based column index of cell in the puzzle.
35+
/// </summary>
36+
public int ColumnIndex { get; }
37+
2838
/// <summary>
2939
/// List of values which are allowed in this cell.
3040
/// Empty if cell has a value.
@@ -33,7 +43,12 @@ public int Value
3343

3444
public bool HasValue => _value > 0;
3545

36-
public Cell(int value) => Value = value;
46+
public Cell(int value, int rowIndex, int columnIndex)
47+
{
48+
Value = value;
49+
RowIndex = rowIndex;
50+
ColumnIndex = columnIndex;
51+
}
3752

3853
public override string ToString() => Formatter.CellToString(this);
3954
}

SimpleSudokuSolver/Model/Formatter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ internal static class Formatter
1010
{
1111
internal static string CellToString(Cell cell)
1212
{
13-
return cell.Value.ToString();
13+
return $"[{cell.RowIndex},{cell.ColumnIndex}]={cell.Value}";
1414
}
1515

1616
internal static string BlockToString(Block block)

SimpleSudokuSolver/Model/SudokuPuzzle.cs

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public SudokuPuzzle(int[,] sudoku)
4646
Columns[j] = new Column(j, NumberOfRowsOrColumnsInPuzzle);
4747
}
4848

49-
var cell = new Cell(sudoku[i, j]);
49+
var cell = new Cell(sudoku[i, j], i, j);
5050
if (!cell.HasValue)
5151
{
5252
cell.CanBe.AddRange(PossibleCellValues);
@@ -156,27 +156,6 @@ public SingleStepSolution UndoLastSingleStepSolution()
156156
return result;
157157
}
158158

159-
/// <summary>
160-
/// Returns zero-based row and column index of the <paramref name="cell"/>.
161-
/// Returns -1 for both row and column index if <paramref name="cell"/> is null or not part of the puzzle.
162-
/// </summary>
163-
public (int RowIndex, int ColumnIndex) GetCellIndex(Cell cell)
164-
{
165-
if (cell == null)
166-
return (-1, -1);
167-
168-
for (int i = 0; i < NumberOfRowsOrColumnsInPuzzle; i++)
169-
{
170-
for (int j = 0; j < NumberOfRowsOrColumnsInPuzzle; j++)
171-
{
172-
if (Cells[i, j] == cell)
173-
return (i, j);
174-
}
175-
}
176-
177-
return (-1, -1);
178-
}
179-
180159
/// <summary>
181160
/// Returns zero-based row and column index of the block which contains the <paramref name="cell"/>.
182161
/// Returns -1 for both row and column index if <paramref name="cell"/> is null or not part of the puzzle.

SimpleSudokuSolver/Strategy/BasicElimination.cs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,27 +19,27 @@ public SingleStepSolution SolveSingleStep(SudokuPuzzle sudokuPuzzle)
1919
foreach (var row in sudokuPuzzle.Rows)
2020
{
2121
var cells = row.Cells;
22-
eliminations.AddRange(GetEliminations(cells, sudokuPuzzle));
22+
eliminations.AddRange(GetEliminations(cells));
2323
}
2424

2525
foreach (var column in sudokuPuzzle.Columns)
2626
{
2727
var cells = column.Cells;
28-
eliminations.AddRange(GetEliminations(cells, sudokuPuzzle));
28+
eliminations.AddRange(GetEliminations(cells));
2929
}
3030

3131
foreach (var block in sudokuPuzzle.Blocks)
3232
{
3333
var cells = block.Cells.OfType<Cell>().ToArray();
34-
eliminations.AddRange(GetEliminations(cells, sudokuPuzzle));
34+
eliminations.AddRange(GetEliminations(cells));
3535
}
3636

3737
return eliminations.Count > 0 ?
3838
new SingleStepSolution(eliminations.Distinct().ToArray(), StrategyName) :
3939
null;
4040
}
4141

42-
private IEnumerable<SingleStepSolution.Candidate> GetEliminations(Cell[] cells, SudokuPuzzle sudokuPuzzle)
42+
private IEnumerable<SingleStepSolution.Candidate> GetEliminations(Cell[] cells)
4343
{
4444
var cellsWithValue = cells.Where(x => x.HasValue).ToArray();
4545
var cellsWithNoValue = cells.Where(x => !x.HasValue).ToArray();
@@ -52,8 +52,7 @@ public SingleStepSolution SolveSingleStep(SudokuPuzzle sudokuPuzzle)
5252
{
5353
if (cellWithNoValue.CanBe.Contains(cellWithValue.Value))
5454
{
55-
var (RowIndex, ColumnIndex) = sudokuPuzzle.GetCellIndex(cellWithNoValue);
56-
eliminations.Add(new SingleStepSolution.Candidate(RowIndex, ColumnIndex, cellWithValue.Value));
55+
eliminations.Add(new SingleStepSolution.Candidate(cellWithNoValue.RowIndex, cellWithNoValue.ColumnIndex, cellWithValue.Value));
5756
}
5857
}
5958
}

0 commit comments

Comments
 (0)