問題
以下のように中心に1を置き、右回りで2,3,...と数字を置いていく。
5x5の正方形になった時点で、赤く示した対角成分の数の和は101となっている。
同様に、この正方形を1001x1001まで巻いていった場合、対角成分の数の和はいくつになるか?
回答
一巻きすると、1->3->7->9と2ずつ増加する。
次の一巻きでは、9->13->17->21->25と4ずつ増加する。
同様にn巻き目では2*nずつ4回増加する。
正方形が1001x1001になった時点では500巻き目なので、こうして構成した増加していく数列の和を求めることにする。
-- 一巻きするときの増分の列
zoubun :: [[Int]]
zoubun = [replicate 4 n|n<-[2,4..]]
main = do
print $ foldl1 (+) $ scanl (+) 1 $ concat $ take 500 zoubun
感想
増分のルールを見いだすのがちょっとややこしいが、ここまでの他の問題に比べれば簡単なほうかも。
最近、別投稿のコメントで教えてもらったscanl関数が早速役に立ちました。