その行/列の1の数が偶数でない場合、リストのリストで(1から0に)変化する関数が必要です。私はこれらの機能を実行しました:
1) リスト内の行が偶数かどうかを確認します。
parityLine :: [[Int]] -> [Bool]
parityLine [] =[]
parityLine (x:xs)
|sum(x) `mod` 2 == 0 = True:(parityLine(xs))
|otherwise = False:(parityLine(xs))
2) リストのリストで対応する要素を合計します。
sumPositions :: [[Int]] -> [Int]
sumPositions [] = []
sumPositions (x:xs) = foldl (zipWith (+)) (repeat 0) (x:xs)
3) リスト内の列が偶数かどうかを確認します。
parityColumn :: [Int] -> [Bool]
parityColumn [] = []
parityColumn (x:xs)
|head(x:xs) `mod` 2 == 0 = True:parityColumn(xs)
|otherwise = False:parityColumn(xs)
4) 操作または 2 つのブール値リストを使用します。
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
を行う [[Int]]->[[Int]] に関数を変更することです:
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 行目の 3 列目が False であることがわかります。そのため、1 の数が偶数になるように 1 を修正する必要があります。そのリストに複数の False がある場合、これらの 1 の 1 つだけを修正します。
その結果、関数が次の値をcorrect
返すようにします。
[[0,0,1,1],
[1,0,0,1],
[0,1,0,1],
[1,1,1,1]]
ありがとう。