私はScalaを学んでいます(関数型プログラミングの新人です)。 私はスードクチェッカーを作成しました(後で、あなたは実際にスードクで数字を設定できるゲーム、そしておそらく自動スドクソルバーです)。Scalaでのsudokuの解読
行と列が正しいかどうかを確認することは、機能的な方法でうまく機能します。
3x3の正方形が正しいかどうかをチェックしても、かなり醜い方法を書いています(下のコードを参照)。
どうすればこの簡単でより多くのScala'ishを解決できるかについてのヒントを教えてください。
私は、.slice(from、until)、.splitAt(until)、.sliding(size、step)のメソッドを見つけて、再び 'transpose'を使って何かをしようとしました。私は 'これを行うには働く(より)機能的な方法を思い付くことはできませんが。ここで
class Sudoku(){
val sudoku =
Array(
Array(0, 5, 0, 3, 0, 9, 0, 2, 6),
Array(3, 8, 9, 4, 2, 0, 1, 5, 7),
Array(4, 0, 6, 1, 0, 0, 0, 8, 9),
Array(0, 1, 3, 7, 9, 8, 0, 0, 4),
Array(0, 0, 8, 0, 0, 0, 5, 0, 0),
Array(0, 6, 0, 0, 0, 3, 0, 0, 0),
Array(0, 0, 1, 9, 3, 0, 0, 4, 0),
Array(9, 3, 5, 6, 4, 0, 8, 0, 1),
Array(0, 0, 2, 8, 7, 0, 0, 0, 5)
)
def checkSudoku(): Unit ={
println(check(sudoku))
}
private def check(sudoku: Array[Array[Int]]): Boolean = checkRows(sudoku) && checkCols(sudoku) && checkSquars(sudoku)
private def checkCols(sudoku: Array[Array[Int]]) = checkRows(sudoku.transpose)
private def checkRows(sudoku: Array[Array[Int]]): Boolean = sudoku.forall(row => checkRow(row))
private def checkRow(row: Array[Int]): Boolean = row.distinct.length == row.length
private def checkSquars(sudoku: Array[Array[Int]]): Boolean ={
val squared : Array[Array[Int]] = Array.ofDim[Int](1,3)
for(i <- 0 to (sudoku.length-1)/3) {
for(o <- 0 to (sudoku(i).length-1)/3) {
squared((i*3)+o) = sudoku(0+(i*3)).slice(0+(o*3), 3+(o*3)) ++ sudoku(1+(i*3)).slice(0+(o*3), 3+(o*3)) ++ sudoku(2+(i*3)).slice(0+(o*3), 3+(o*3))
}
}
squared.forall(row => checkRow(row))
}
}
val sudoku = new Sudoku()
sudoku.checkSudoku();
checkRowメソッドはどこですか? – nmat
以下のcheckRows()メソッド プライベートdef checkRow(row:Array [Int]):Boolean = row.distinct.length == row.length – Kevin