Skip to content

Instantly share code, notes, and snippets.

@claudio-scandura
Created August 5, 2017 08:03
Show Gist options
  • Save claudio-scandura/47e2818b1f4c2b0a96186edde11fa155 to your computer and use it in GitHub Desktop.
Save claudio-scandura/47e2818b1f4c2b0a96186edde11fa155 to your computer and use it in GitHub Desktop.
Bored on the plane without sudoku I thought of writing my own board.
class SudokuBoard {
val size = 9
private val sudokuRange = 0 until size
val board = sudokuRange.map { _ =>
sudokuRange.map(_ => 'E').toArray
}.toArray
def stringify = board.map(_.mkString("[", ", ", "]")).mkString("\n")
def assign(row: Int, column: Int, value: Char) =
if (isValidMove(row, column, value)) board(row)(column) = value
def isValidMove(row: Int, column: Int, value: Char): Boolean = board(row)(column) match {
case 'E' => allowedInRow(value, row) && allowedInColumn(value, column) && allowedInSubGrid(row, column, value)
case _ => throw new IllegalStateException("Cannot move to occupied cell")
}
private def allowedInRow(value: Char, row: Int) = !board(row).contains(value)
private def allowedInColumn(value: Char, column: Int) = sudokuRange.forall( board(_)(column) != value)
private def allowedInSubGrid(row: Int, column: Int, value: Char) = {
val subGridXRange = subGridRangeOf(row)
val subGridYRange = subGridRangeOf(column)
subGridXRange.forall(row => subGridYRange.forall(board(row)(_) != value))
}
def subGridRangeOf(idx: Int) = idx match {
case x if x < 3 => 0 to 2
case x if x < 6 => 3 until 5
case x if x < 9 => 6 until 9
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment