2017-05-18 11 views
1

나는 그 안에 9 개의리스트가있는 매트릭스를 가지고 있습니다. 내 매트릭스의 시각적 표현은 스도쿠입니다.리스트 목록에서 재귀 사용하기

Image of Sudoku

나는 스도쿠의 각 상자 (3 × 3)의 숫자 (또는 요소)을 반환해야합니다. 는 예를 들어,이 그림에서 처음 세 행은

rows = 
[[Just 8, Nothing, Nothing, Just 4, Nothing, Just 6, Nothing, Nothing, Just 7], 
[Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Just 4, Nothing, Nothing], 
[Nothing, Just 1, Nothing, Nothing, Nothing, Nothing, Just 6, Just 5, Nothing]] 

와 내가 내 기능 (전체 스도쿠에 대한 나중에와) 첫 번째 상자에 대한 반환하고자하는

[[Just 8, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Just 1, Nothing], ...] 
같이 표현 될 것이다

제 시도는 다음과 같습니다 : 처음 세 개의 목록에서 처음 세 요소를 가져 와서 반환하는 함수를 만들었습니다.

getEm :: [[a]] -> [a] 
getEm x = concatMap (take 3)(take 3 x) 

는 그때 처음 세 목록

dropEm :: Eq a => [a] -> [a] 
dropEm x = delete itemZ listTwo 
    where 
    listOne = delete itemX x 
    listTwo = delete itemY listOne 
    itemX = (x!!0) 
    itemY = (x!!3) 
    itemZ = (x!!6)` 
여기

내가 함께 붙어하고있는 부분입니다

에서 처음 세 개의 요소를 제거 할 다른 기능을 만들었습니다. 내 목표는 행렬을 사용하는 재귀 함수를 작성한 후 getEm을 사용하여 처음 세 개의 목록 (상자)의 처음 세 요소를 가져와 새 목록 finalList에 추가하는 것입니다. 그런 다음 함수 dropEm은 첫 번째 상자 (처음 세 목록의 처음 세 요소)를 제거한 다음 목록이 비어 있고 처리 할 "상자"가 없을 때까지 전체 프로세스를 반복합니다. 프로세스가 완료되면 함수는 finalList을 반환합니다.

다음은 내가 작성한 기능이지만 작성한 두 가지 기능으로 재귀 부분을 구현하는 방법을 이해하지 못합니다.

boxs m = case startList of 
    [] -> finalList 

    where 
    startList = (chunksOf 3 (concat m)) 
    finalList = [] 
+0

첫 번째 사각형 인 'concatMap (take 3) (3 행 가져 오기)'을 시도해보십시오. –

+0

@ n.m. 그것은 작동하지만, 그것은 단지 첫 번째 사각형입니다. 나머지 칸을 재귀 적으로 구하는 방법은 모두 하나의 목록에 포함됩니다. – 0248881

+0

정말 그렇게하고 싶습니까? 궁극적으로 상자 목록을 얻으려면 간단한 방법이 있습니다. 임의의 박스를 얻으려면,'drop' 함수를 사용하는 것이 좋습니다. –

답변

1

의견 섹션은 아마도 사람들이 볼 수있는 장소가 아니기 때문에 여기에 답을 기재하려고합니다. 예를 들어

import   Data.List  (transpose) 
import   Data.List.Split (chunksOf) 

subSquares :: Int -> [[a]] -> [[[a]]] 
subSquares size = concatMap (chunksOf size) 
       . transpose 
       . map (chunksOf size) 

:

λ > rows = [[(x, y) | x <- [0..8]] | y <- [0..8]] 
λ > subSquares 3 rows 
[[[(0,0),(1,0),(2,0)],[(0,1),(1,1),(2,1)],[(0,2),(1,2),(2,2)]],[[(0,3),(1,3),(2,3)],[(0,4),(1,4),(2,4)],[(0,5),(1,5),(2,5)]],[[(0,6),(1,6),(2,6)],[(0,7),(1,7),(2,7)],[(0,8),(1,8),(2,8)]],[[(3,0),(4,0),(5,0)],[(3,1),(4,1),(5,1)],[(3,2),(4,2),(5,2)]],[[(3,3),(4,3),(5,3)],[(3,4),(4,4),(5,4)],[(3,5),(4,5),(5,5)]],[[(3,6),(4,6),(5,6)],[(3,7),(4,7),(5,7)],[(3,8),(4,8),(5,8)]],[[(6,0),(7,0),(8,0)],[(6,1),(7,1),(8,1)],[(6,2),(7,2),(8,2)]],[[(6,3),(7,3),(8,3)],[(6,4),(7,4),(8,4)],[(6,5),(7,5),(8,5)]],[[(6,6),(7,6),(8,6)],[(6,7),(7,7),(8,7)],[(6,8),(7,8),(8,8)]]] 

어느, 서식이 다시, 제공 : 초기 아이디어 n.m.

[ [ [(0,0),(1,0),(2,0)] 
    , [(0,1),(1,1),(2,1)] 
    , [(0,2),(1,2),(2,2)] 
    ] 
, [ [(0,3),(1,3),(2,3)] 
    , [(0,4),(1,4),(2,4)] 
    , [(0,5),(1,5),(2,5)] 
    ] 
, [ [(0,6),(1,6),(2,6)] 
    , [(0,7),(1,7),(2,7)] 
    , [(0,8),(1,8),(2,8)] 
    ] 
, [ [(3,0),(4,0),(5,0)] 
    , [(3,1),(4,1),(5,1)] 
    , [(3,2),(4,2),(5,2)] 
    ] 
, [ [(3,3),(4,3),(5,3)] 
    , [(3,4),(4,4),(5,4)] 
    , [(3,5),(4,5),(5,5)] 
    ] 
, [ [(3,6),(4,6),(5,6)] 
    , [(3,7),(4,7),(5,7)] 
    , [(3,8),(4,8),(5,8)] 
    ] 
, [ [(6,0),(7,0),(8,0)] 
    , [(6,1),(7,1),(8,1)] 
    , [(6,2),(7,2),(8,2)] 
    ] 
, [ [(6,3),(7,3),(8,3)] 
    , [(6,4),(7,4),(8,4)] 
    , [(6,5),(7,5),(8,5)] 
    ] 
, [ [(6,6),(7,6),(8,6)] 
    , [(6,7),(7,7),(8,7)] 
    , [(6,8),(7,8),(8,8)] 
    ] 
] 

감사합니다. :-)