пятница, 11 октября 2013 г.

Задачка от Dzone: Sudoku Checker

Задача:
Write a program that will accept a 2D array and check if it contains a 100% correct Sudoku solution. For those unfamiliar with the rules, check out http://www.sudoku.name/rules/ .  
Моё решение на Scala:
 

package solver

object SudokuSolver {
  type Sudoku = IndexedSeq[IndexedSeq[Int]]
  
  def toSudoku( s: String): Sudoku  =
   s.split("\n").toVector.map(_.split(" ").map(_.toInt).toVector)

   def check( sudoku:  Sudoku )=
   linesCorrect(sudoku) && rowsCorrect(sudoku) && blocksCorrect(sudoku)
   
    private def isCorrect( splitMethod: Sudoku=>Sudoku) ={
   s:Sudoku => splitMethod(s).filter( isCombinationWrong).isEmpty
   }
   
   private val blocksCorrect = isCorrect(splitToBlocks)
   private val rowsCorrect = isCorrect(splitToRows)
   private val linesCorrect = isCorrect(splitToLines)  
   
   private def splitToLines( sudoku: Sudoku) = sudoku
  
   private def splitToRows( sudoku: Sudoku) =
  for( i <- 0 to 8 )
   yield( for(j<-0 to 8) yield( sudoku(j)(i) ) )
   
  private def splitToBlocks( sudoku: Sudoku) =
  for( i <- 0 to 8 by 3; j <- 0 to 8 by 3 )
   yield( for(ii <- 0 to 2; jj<- 0 to 2 )
    yield(sudoku(i+ii)(j+jj)) )
    
  private def isCombinationWrong( comb: IndexedSeq[Int]) = comb.min != 1  || comb.max != 9 || comb.toSet.size != 9
}

Комментариев нет:

Отправить комментарий