096 Su Doku.jl 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #!/usr/bin/julia
  2. # Daniel "Trizen" Șuteu
  3. # License: GPLv3
  4. # Date: 08 February 2017
  5. # https://github.com/trizen
  6. # https://projecteuler.net/problem=96
  7. # Runtime: 2.127s
  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, Bool}()
  27. for j in 1:81
  28. if lookup[i,j]
  29. t[grid[j]] = true
  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. solve()
  45. end
  46. function euler_096()
  47. fh = open("p096_sudoku.txt")
  48. lines = filter((x)->occursin(r"^[0-9]+$",x), readlines(fh))
  49. total = 0
  50. while length(lines) > 0
  51. grid = splice!(lines, 1:9)
  52. grid = map((c)->parse(Int64, c), split(join(map(chomp, grid)), ""))
  53. solve_sudoku((s)->(total += s[1]*100 + s[2]*10 + s[3]), grid)
  54. end
  55. println(total)
  56. end
  57. euler_096()