Solve a Hidato puzzle: Difference between revisions
Content added Content deleted
(→{{header|Haskell}}: Made an edit to avoid a Wiki formatting problem (+ hindent)) |
(Added Kotlin) |
||
Line 1,757: | Line 1,757: | ||
. . . . . . . 5 4 . |
. . . . . . . 5 4 . |
||
. . . . . . . . . .</pre> |
. . . . . . . . . .</pre> |
||
=={{header|Kotlin}}== |
|||
{{trans|Java}} |
|||
<lang scala>// version 1.2.0 |
|||
lateinit var board: List<IntArray> |
|||
lateinit var given: IntArray |
|||
lateinit var start: IntArray |
|||
fun setUp(input: List<String>) { |
|||
val nRows = input.size |
|||
val puzzle = List(nRows) { input[it].split(" ") } |
|||
val nCols = puzzle[0].size |
|||
val list = mutableListOf<Int>() |
|||
board = List(nRows + 2) { IntArray(nCols + 2) { -1 } } |
|||
for (r in 0 until nRows) { |
|||
val row = puzzle[r] |
|||
for (c in 0 until nCols) { |
|||
val cell = row[c] |
|||
if (cell == "_") { |
|||
board[r + 1][c + 1] = 0 |
|||
} |
|||
else if (cell != ".") { |
|||
val value = cell.toInt() |
|||
board[r + 1][c + 1] = value |
|||
list.add(value) |
|||
if (value == 1) start = intArrayOf(r + 1, c + 1) |
|||
} |
|||
} |
|||
} |
|||
list.sort() |
|||
given = list.toIntArray() |
|||
} |
|||
fun solve(r: Int, c: Int, n: Int, next: Int): Boolean { |
|||
if (n > given[given.lastIndex]) return true |
|||
val back = board[r][c] |
|||
if (back != 0 && back != n) return false |
|||
if (back == 0 && given[next] == n) return false |
|||
var next2 = next |
|||
if (back == n) next2++ |
|||
board[r][c] = n |
|||
for (i in -1..1) |
|||
for (j in -1..1) |
|||
if (solve(r + i, c + j, n + 1, next2)) return true |
|||
board[r][c] = back |
|||
return false |
|||
} |
|||
fun printBoard() { |
|||
for (row in board) { |
|||
for (c in row) { |
|||
if (c == -1) |
|||
print(" . ") |
|||
else |
|||
print(if (c > 0) "%2d ".format(c) else "__ ") |
|||
} |
|||
println() |
|||
} |
|||
} |
|||
fun main(args: Array<String>) { |
|||
var input = listOf( |
|||
"_ 33 35 _ _ . . .", |
|||
"_ _ 24 22 _ . . .", |
|||
"_ _ _ 21 _ _ . .", |
|||
"_ 26 _ 13 40 11 . .", |
|||
"27 _ _ _ 9 _ 1 .", |
|||
". . _ _ 18 _ _ .", |
|||
". . . . _ 7 _ _", |
|||
". . . . . . 5 _" |
|||
) |
|||
setUp(input) |
|||
printBoard() |
|||
println("\nFound:") |
|||
solve(start[0], start[1], 1, 0) |
|||
printBoard() |
|||
}</lang> |
|||
{{out}} |
|||
<pre> |
|||
. . . . . . . . . . |
|||
. __ 33 35 __ __ . . . . |
|||
. __ __ 24 22 __ . . . . |
|||
. __ __ __ 21 __ __ . . . |
|||
. __ 26 __ 13 40 11 . . . |
|||
. 27 __ __ __ 9 __ 1 . . |
|||
. . . __ __ 18 __ __ . . |
|||
. . . . . __ 7 __ __ . |
|||
. . . . . . . 5 __ . |
|||
. . . . . . . . . . |
|||
Found: |
|||
. . . . . . . . . . |
|||
. 32 33 35 36 37 . . . . |
|||
. 31 34 24 22 38 . . . . |
|||
. 30 25 23 21 12 39 . . . |
|||
. 29 26 20 13 40 11 . . . |
|||
. 27 28 14 19 9 10 1 . . |
|||
. . . 15 16 18 8 2 . . |
|||
. . . . . 17 7 6 3 . |
|||
. . . . . . . 5 4 . |
|||
. . . . . . . . . . |
|||
</pre> |
|||
=={{header|Mathprog}}== |
=={{header|Mathprog}}== |