리스트의리스트에서 그 라인/컬럼의 수가 1이 아닐 때 (1에서 0으로) 변경하는 함수를 원한다. 나는 이러한 기능을 수행 한 :하스켈이리스트의 원소를 검색한다.
sumPositions :: [[Int]] -> [Int]
sumPositions [] = []
sumPositions (x:xs) = foldl (zipWith (+)) (repeat 0) (x:xs)
:
parityLine :: [[Int]] -> [Bool]
parityLine [] =[]
parityLine (x:xs)
|sum(x) `mod` 2 == 0 = True:(parityLine(xs))
|otherwise = False:(parityLine(xs))
2) 목록 목록에서 해당 요소를 합계 : 목록에있는 줄도 또는하지 않은 경우
1) 본다
parityColumn :: [Int] -> [Bool]
parityColumn [] = []
parityColumn (x:xs)
|head(x:xs) `mod` 2 == 0 = True:parityColumn(xs)
|otherwise = False:parityColumn(xs)
4) 동작 또는 두 개의 부울 목록으로합니까 : 목록의 열은 짝수 또는하지 않은 경우 3) 본다 :
bol :: [Bool] -> [Bool] -> [[Bool]]
bol [] _ = []
bol (x:xs) (y:ys)= (map (||x) (y:ys)):(bol xs (y:ys))
5) 올바른 목록 :
correct :: [[Int]] -> [[Bool]]
correct [] = []
correct (x:xs)=(bol(parityLine (x:xs))(parityColumn(sumPositions(x:xs))))
그래서 내가 원하는 것을 할 수있는 기능 correct
을 변경하는 것입니다 [지능]] -> [[지능]] 않습니다이 :
My Int list(x:xs) With my correct function applied
[[0,0,1,1], [[True,True,True,True],
[1,0,1,1], [True,True,False,True],
[0,1,0,1], [True,True,True,True]
[1,1,1,1]] [True,True,True,True]]
이제 제 2 행의 세 번째 열에 False가 표시되는 것을 볼 수 있습니다. 따라서 숫자 1을 정정해야만 1의 수가됩니다. 그 목록에 하나 이상의 False가있는 경우,이 중 하나만 수정하고 싶습니다.
[[0,0,1,1],
[1,0,0,1],
[0,1,0,1],
[1,1,1,1]]
감사 :
은 결과, 그 기능을correct
반환합니다.
당신이 달성하고자하는 전체 결과는 무엇입니까? 당신의 설명은 단지 1의 수가 짝수가 아니지만 코드가 더 구체적인 목표를 제시한다면 1 (임의?) 1을 0으로 바꾸고 싶다고 말합니다. 모든 행과 열이 짝수 개의 행을 가지도록 입력을 수정 하시겠습니까? –
또한 최소 요구 사항이 있습니까? 즉 가능한 한 적은 수의 1을 0으로 바꾸고 싶습니까? 왜냐하면, 지금 당신의 올바른 함수는 행복하게 십진수 십 ('[[0,1,0], [1,1,1], [0,1,0]')을 모두 거짓으로 바꿀 것이기 때문입니다. –
matrix [[Bool]]이 False 인 위치에서 [[Int]]의 수를 변경하기 만하면됩니다. 목록 [[Bool]]에 둘 이상의 False가있는 경우 해당 목록 중 하나를 변경하고 싶습니다. – user1887556