Programming Praxis 4: Sudoku Solution
Sudoku problems can be perceived as quite complex. Counter-intuitively and from a mathematical standpoint, the solution is actually quite simple. I wrote this solution a while back in Python by pulling together algorithms from a number of sources. But by translating it into Haskell again, I think its acheived a certain Zen-like simplicity and elegance. Or maybe its the homebrew talking.
import Data.List import Data.Maybe check :: Int -> Int -> Bool check i j | (f i)/9 == (f j)/9 = True | mod (i-j) 9 == 0 = True | (f i)/27 == (f j)/27 && (f $ mod i 9)/3 == (f $ mod j 9)/3 = True | otherwise = False where f = fromIntegral solve :: [Int] -> [Int] solve s | elem 0 s = solve $ a ++ [n | n <- [1..9], elem n e == False] ++ b | otherwise = s where a = take i s b = drop (i + 1) s i = fromJust $ elemIndex 0 s e = [s !! j | j <- [0..80], check i j] main = print $ solve [7,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,1,5,0,0,0,0,0,6,3,9,0,2, 0,0,0,1,8,0,0,0,0,4,0,0,9,0,0,7,0,0,0,0,7,5,0,0,0,3,0,7,8,5,0,0,0,0,0, 5,6,0,0,0,0,0,4,0,0,0,0,0,0,1,0,0,2]