import List
import Puzzle

type Sudoku = Int

instance Puzzle Sudoku where
  puzzleElm     = [1..sudokuSize]
  vacant        = 0
  candidate b p = puzzleElm \\ nub (concatMap (\ c -> c b p) [col,row,box])

sudokuBase, sudokuSize :: Int
sudokuBase = 3
sudokuSize = sudokuBase ^ 2

col, row, box :: Board Sudoku -> Position -> [Sudoku]
col b (i,_) = transpose b !! i
row b (_,j) = b !! j
box b (i,j) = concat 
            $ map (take sudokuBase) $ map (drop $ (i `div` sudokuBase) * sudokuBase)
            $ take sudokuBase $ drop ((j `div` sudokuBase) * sudokuBase) b

sudoku :: Board Sudoku -> [Board Sudoku]
sudoku = solve

showSudoku :: Board Sudoku -> String
showSudoku = showBoard
readSudoku :: String -> Board Sudoku
readSudoku = readBoard

instance Show (Board Sudoku) where
  show = showBoard 

instance Read (Board Sudoku) where
  readsPrec _ s = [(readSudoku s,"")]

sampledata :: String
sampledata = unlines 
           ["8 0 0 0 3 4 0 5 0"
           ,"0 0 2 0 0 0 0 0 1"
           ,"0 1 0 9 0 0 0 0 0"
           ,"0 0 8 0 0 9 0 0 6"
           ,"5 0 0 0 1 0 0 0 8"
           ,"6 0 0 4 0 0 7 0 0"
           ,"0 0 0 0 0 1 0 7 0"
           ,"2 0 0 0 0 0 1 0 0"
           ,"0 9 0 5 6 0 0 0 2"]

sample :: Board Sudoku
sample = read sampledata










































































































































