Problem 166

http://projecteuler.net/index.php?section=problems&id=166

方陣のような問題(同じ数字が何度出てもかまわない)
brute force でもできるが、それでは面白くない。
とりあえず、数字をmod 2 して考えると自明解のほかに

1 0 0 0 
0 0 1 0 
0 0 0 1 
0 1 0 0

が存在することが分かる。
上や、上の回転などしたものを解から引いても、まだ各和は等しい。

main = print.sum.map (product.map count) $ genGrid

count xs | u < l = 0
         | otherwise = u-l+1
    where l = -minimum (0:xs)
          u = 9-maximum (0:xs)

genGrid = do a <- [-9..9]
             b <- [-9..9]
             c <- [-9+max 0 (-a-b)..9+min 0 (-a-b)]
             let diff = [0,-b,-c,a+b,a-c,-b-c]
             d <- [-9+maximum diff..9+minimum diff]
             return [[a,-b-d,-b-c-d],
                     [b,-c-d,a+b-d],
                     [c,c+d,-a+c+d],
                     [d,b+d,-a-b-c]]

計算量は高々19^4≒10^5。まぁ、これなら大丈夫(実際はc,dの範囲は19よりも小さいし)。