sudoku_solver.jl 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #!/usr/bin/julia
  2. # Trizen
  3. # Date: 08 February 2017
  4. # https://github.com/trizen
  5. # Recursive brute-force Sudoku solver.
  6. # See also:
  7. # https://en.wikipedia.org/wiki/Sudoku
  8. function check(i, j)
  9. id, im = div(i, 9), mod(i, 9)
  10. jd, jm = div(j, 9), mod(j, 9)
  11. jd == id && return true
  12. jm == im && return true
  13. div(id, 3) == div(jd, 3) &&
  14. div(jm, 3) == div(im, 3)
  15. end
  16. const lookup = zeros(Bool, 81, 81)
  17. for i in 1:81
  18. for j in 1:81
  19. lookup[i,j] = check(i-1, j-1)
  20. end
  21. end
  22. function solve_sudoku(callback::Function, grid::Array{Int64})
  23. (function solve()
  24. for i in 1:81
  25. if grid[i] == 0
  26. t = Dict{Int64, Nothing}()
  27. for j in 1:81
  28. if lookup[i,j]
  29. t[grid[j]] = nothing
  30. end
  31. end
  32. for k in 1:9
  33. if !haskey(t, k)
  34. grid[i] = k
  35. solve()
  36. end
  37. end
  38. grid[i] = 0
  39. return
  40. end
  41. end
  42. callback(grid)
  43. end)()
  44. end
  45. function display(grid)
  46. println("Solution: ")
  47. for i in 1:length(grid)
  48. print(grid[i], " ")
  49. i % 3 == 0 && print(" ")
  50. i % 9 == 0 && print("\n")
  51. i % 27 == 0 && print("\n")
  52. end
  53. end
  54. sudoku_board =
  55. [2, 0, 0, 0, 7, 0, 0, 0, 3,
  56. 1, 0, 0, 0, 0, 0, 0, 8, 0,
  57. 0, 0, 4, 2, 0, 9, 0, 0, 5,
  58. 9, 4, 0, 0, 0, 0, 6, 0, 8,
  59. 0, 0, 0, 8, 0, 0, 0, 9, 0,
  60. 0, 0, 0, 0, 0, 0, 0, 7, 0,
  61. 7, 2, 1, 9, 0, 8, 0, 6, 0,
  62. 0, 3, 0, 0, 2, 7, 1, 0, 0,
  63. 4, 0, 0, 0, 0, 3, 0, 0, 0]
  64. if false
  65. sudoku_board = [
  66. 0, 0, 0, 8, 0, 1, 0, 0, 0,
  67. 0, 0, 0, 0, 0, 0, 0, 4, 3,
  68. 5, 0, 0, 0, 0, 0, 0, 0, 0,
  69. 0, 0, 0, 0, 7, 0, 8, 0, 0,
  70. 0, 0, 0, 0, 0, 0, 1, 0, 0,
  71. 0, 2, 0, 0, 3, 0, 0, 0, 0,
  72. 6, 0, 0, 0, 0, 0, 0, 7, 5,
  73. 0, 0, 3, 4, 0, 0, 0, 0, 0,
  74. 0, 0, 0, 2, 0, 0, 6, 0, 0
  75. ]
  76. end
  77. if false
  78. sudoku_board = [
  79. 8, 0, 0, 0, 0, 0, 0, 0, 0,
  80. 0, 0, 3, 6, 0, 0, 0, 0, 0,
  81. 0, 7, 0, 0, 9, 0, 2, 0, 0,
  82. 0, 5, 0, 0, 0, 7, 0, 0, 0,
  83. 0, 0, 0, 0, 4, 5, 7, 0, 0,
  84. 0, 0, 0, 1, 0, 0, 0, 3, 0,
  85. 0, 0, 1, 0, 0, 0, 0, 6, 8,
  86. 0, 0, 8, 5, 0, 0, 0, 1, 0,
  87. 0, 9, 0, 0, 0, 0, 4, 0, 0
  88. ]
  89. end
  90. solve_sudoku(display, sudoku_board)