diff options
author | Joe Zhao <ztuowen@gmail.com> | 2016-01-28 09:56:24 -0700 |
---|---|---|
committer | Joe Zhao <ztuowen@gmail.com> | 2016-01-28 09:56:24 -0700 |
commit | fffef3e49db9f65cae3f0f99703ba01ae0d008bf (patch) | |
tree | faee07ed11b39a1fb5f80623354c5dc20e510bb2 /SudokuOriginal.hs | |
download | haskbox-fffef3e49db9f65cae3f0f99703ba01ae0d008bf.tar.gz haskbox-fffef3e49db9f65cae3f0f99703ba01ae0d008bf.tar.bz2 haskbox-fffef3e49db9f65cae3f0f99703ba01ae0d008bf.zip |
init
Diffstat (limited to 'SudokuOriginal.hs')
-rw-r--r-- | SudokuOriginal.hs | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/SudokuOriginal.hs b/SudokuOriginal.hs new file mode 100644 index 0000000..2f03d5a --- /dev/null +++ b/SudokuOriginal.hs @@ -0,0 +1,35 @@ +module SudokuOriginal where + +import Data.List +import Control.Applicative +import SudokuHelper + +numlist = [1..9] + +pertake eve l cur [] = [] +pertake eve l cur (x:xs) + | eve == cur = x:(pertake eve l 1 xs) + | otherwise = if cur < l then x:rest else rest + where rest = (pertake eve l (cur+1) xs) + +block pos all = take 9 $ pertake 9 3 0 $ drop (x*9+y) all + where x = i - mod i 3 + y = j - mod j 3 + i = div pos 9 + j = mod pos 9 + +line pos all = take 9 $ drop (pos - (mod pos 9)) all + +col pos all = pertake 9 1 0 $ drop (mod pos 9) all + +get pos all = (map head).group.sort.concat $ + ([block, line, col] <*> [pos]) <*> [all] + +solve :: Int -> [Int] -> [[Int]] +solve 81 all = [all] +solve pos all = if head (drop pos all) == 0 then concatMap (solve (pos+1)) + [ take pos all ++ (i:(drop (pos+1) all)) | i<-avail ] + else solve (pos+1) all + where avail = [i |i<-numlist, not $ elem i $ get pos all] + +solveStr = head . (solve 0) |