summaryrefslogtreecommitdiff
path: root/SudokuOriginal.hs
diff options
context:
space:
mode:
Diffstat (limited to 'SudokuOriginal.hs')
-rw-r--r--SudokuOriginal.hs35
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)