diff -r 1bd800376e0c -r c02929f2647c progs/lecture4.scala --- a/progs/lecture4.scala Wed Dec 02 01:15:14 2020 +0000 +++ b/progs/lecture4.scala Mon Dec 07 01:25:41 2020 +0000 @@ -271,40 +271,47 @@ |1..5...92 |..7.9.41.""".stripMargin.replaceAll("\\n", "") -candidates(game0, (0, 0)) + type Pos = (Int, Int) val EmptyValue = '.' val MaxValue = 9 +def pretty(game: String): String = + "\n" + (game.grouped(MaxValue).mkString("\n")) + +pretty(game0) + + val allValues = "123456789".toList val indexes = (0 to 8).toList - def empty(game: String) = game.indexOf(EmptyValue) def isDone(game: String) = empty(game) == -1 -def emptyPosition(game: String) = - (empty(game) % MaxValue, empty(game) / MaxValue) - +def emptyPosition(game: String) = { + val e = empty(game) + (e % MaxValue, e / MaxValue) +} def get_row(game: String, y: Int) = indexes.map(col => game(y * MaxValue + col)) def get_col(game: String, x: Int) = indexes.map(row => game(x + row * MaxValue)) -get_row(game0, 0) +//get_row(game0, 0) +//get_row(game0, 1) +//get_col(game0, 0) def get_box(game: String, pos: Pos): List[Char] = { def base(p: Int): Int = (p / 3) * 3 val x0 = base(pos._1) val y0 = base(pos._2) val ys = (y0 until y0 + 3).toList - (x0 until x0 + 3).toList.flatMap(x => ys.map(y => game(x + y * MaxValue))) + (x0 until x0 + 3).toList + .flatMap(x => ys.map(y => game(x + y * MaxValue))) } -//get_row(game0, 0) -//get_row(game0, 1) -//get_col(game0, 0) + //get_box(game0, (3, 1)) @@ -313,26 +320,25 @@ game.updated(pos, value) def toAvoid(game: String, pos: Pos): List[Char] = - (get_col(game, pos._1) ++ get_row(game, pos._2) ++ get_box(game, pos)) + (get_col(game, pos._1) ++ + get_row(game, pos._2) ++ + get_box(game, pos)) def candidates(game: String, pos: Pos): List[Char] = allValues.diff(toAvoid(game, pos)) //candidates(game0, (0,0)) -def pretty(game: String): String = - "\n" + (game.sliding(MaxValue, MaxValue).mkString("\n")) def search(game: String): List[String] = { if (isDone(game)) List(game) else { val cs = candidates(game, emptyPosition(game)) - cs.map(c => search(update(game, empty(game), c))).toList.flatten + cs.map(c => search(update(game, empty(game), c))).flatten } } -List(List("sol1"), List("sol2", "sol3")).flatten - +pretty(game0) search(game0).map(pretty) val game1 = """23.915...