2010-11-29 3 views
1

안녕 this 스레드가 이미이 주제를 처리하고 있습니다. 또한 this 스레드가 intrest 일 수 있습니다.하스켈에서 함수 후보를 작성하는 데 도움이 필요합니다

임 함수 스도쿠

data Sudoku = Sudoku { rows :: [[Maybe Int]] } 
deriving (Show, Eq) 

및 위치를 제공

candidates :: Sudoku -> Pos -> [Int] 

를 작성하려고 (type Pos = (Int, Int)) 는 스도쿠 행에 예를 들어 당신이 쓸 수있는 번호를 결정 이미 (1,2,4,7,9, x, x)가 포함되어 있으면 마지막 행에 이미 존재하는 숫자를 쓸 수 없습니다. 또한 다른 문제는 hight와 너비를 검사하여 숫자가 두 번 이상 나오지 않도록합니다 (일반 스도쿠 규칙). 시작하는 방법에 대한 제안은 없습니까?

예 : 스도쿠> 후보 예 (0,2) [4,8]

+3

이 숙제가 있습니까? 하향식 방법론에 대해서는 – Paul

답변

5

나는 대학에서 내 알고리즘 클래스에서이 프로젝트를하고 기억한다. 하스켈에서 학습을 위해서가 아니라 프로덕션을 위해 글을 쓰는 누군가를위한 최선의 충고는 '하향식'이라고 쓰는 것입니다. 먼저이 문제를 해결하기 위해해야 ​​할 일이 무엇인지 물어보십시오. 그런 다음 설명 기능을 사용하여 작성하십시오 (아직 존재하지 않더라도). 그런 다음 필요한 기능을 스텁합니다. 예를 들어, 시작은 수 있습니다 : 당신이 모든 것을 대답 할 때까지이에서

candidates :: Sudoku -> Pos -> [Int] 
candidates s p = union (rowCands s p) (colCands s p) (blockCands s p) 

rowCands :: Sudoku -> Pos -> [Int] 
rowCands = undefined 
colCands :: Sudoku -> Pos -> [Int] 
colCands = undefined 
blockCands :: Sudoku -> Pos -> [Int] 
blockCands = undefined 

, 당신은 단순히 최고 아래로 rowCands 문제를 해결하는 방법을 설명하는 시작합니다. 때로는 union과 유사한 함수를 작성하려고하지만, 이전에 이미 작성된 함수 여야합니다. http://haskell.org/hoogle을 확인해보십시오. 함수 이름을 검색하거나 서명을 입력 할 수도 있습니다. 이미 표준 라이브러리에 이미 쓰여진 union이 있을까요?

자신에게 대답하는 흥미로운 질문은 무엇입니까? undefined 유형은 무엇이며 유형 체크는 무엇입니까? 특별한 키워드는 아닙니다. 단지 미리 정의 된 함수 일뿐입니다.

+0

+1. 나는 그것을 스스로 시도해야 할 것이다. – spade78

0

여기서는 Data.Set을 사용하는 해결책입니다. S.elems을 사용하여 목록을 얻을 수 있지만 스도쿠 해결사를 작성하는 경우 S.size을 찾고있을 수 있습니다.

import qualified Data.Set as S 
import Data.Maybe(catMaybes) 

fullSet = S.fromAscList [1..9] 

fromJustL = S.fromList . concatMaybes 

candidates s x = 
    rowSet s x `S.intersection` colSet s x `S.intersection` cellSet s x 

rowSet s (i,_) = fullSet `S.difference` fromJustL (s !! i) 
colSet s (_,i) = fullSet `S.difference` fromJustL (map (!!i) s) 
cellSet s (i,j) = fullSet `S.difference` fromJustL (concatMap (g j) (g i s)) 
    where 
    g i | i < 3  = take 3 
     | i < 6  = take 3 . drop 3 
     | otherwise = take 3 . drop 6