-
Notifications
You must be signed in to change notification settings - Fork 6
/
096 Su Doku.jl
75 lines (57 loc) · 1.49 KB
/
096 Su Doku.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/usr/bin/julia
# Daniel "Trizen" Șuteu
# License: GPLv3
# Date: 08 February 2017
# https://github.com/trizen
# https://projecteuler.net/problem=96
# Runtime: 2.127s
function check(i, j)
id, im = div(i, 9), mod(i, 9)
jd, jm = div(j, 9), mod(j, 9)
jd == id && return true
jm == im && return true
div(id, 3) == div(jd, 3) &&
div(jm, 3) == div(im, 3)
end
const lookup = zeros(Bool, 81, 81)
for i in 1:81
for j in 1:81
lookup[i,j] = check(i-1, j-1)
end
end
function solve_sudoku(callback::Function, grid::Array{Int64})
function solve()
for i in 1:81
if grid[i] == 0
t = Dict{Int64, Bool}()
for j in 1:81
if lookup[i,j]
t[grid[j]] = true
end
end
for k in 1:9
if !haskey(t, k)
grid[i] = k
solve()
end
end
grid[i] = 0
return()
end
end
callback(grid)
end
solve()
end
function euler_096()
fh = open("p096_sudoku.txt")
lines = filter((x)->occursin(r"^[0-9]+$",x), readlines(fh))
total = 0
while length(lines) > 0
grid = splice!(lines, 1:9)
grid = map((c)->parse(Int64, c), split(join(map(chomp, grid)), ""))
solve_sudoku((s)->(total += s[1]*100 + s[2]*10 + s[3]), grid)
end
println(total)
end
euler_096()