「右上向き対角線が 1^2, 3^2, 5^2, ... と並んでいるのを利用する手もある」との助言をいただいたので、
それをヒントに別解に挑戦。
別解1
まずはこんな感じで解いてみた。
let list = [((n-2)^2+1)..n^2]で、ひとつの四角形の四辺を構成する数値のリストを作っている。
n=3のとき[2,3,4,5,6,7,8,9]、 n=5のとき[10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]
sumDiag'では、その中から四隅になる数値のみ抽出して総和を出している。
リストの中から等間隔で4つの数値を取り出すため、まず間隔を(length list `div` 4) - 1で算出し、
その間隔分dropしてから先頭を取る、という処理を再帰で行っている。
これにより、 n=3のとき[3,5,7,9]、 n=5のとき[13,17,21,25]が抽出される。
それらを足して、答えが求められる。
こうして説明してみるとやりたい事はできているが、
コードを見ると冗長というかよく分からない処理をゴチャゴチャしている感がある…。
別解2
さらに助言をいただいた。
「右上が n^2 である枠の他の3隅は n^2-(n-1), n^2-2*(n-1), n^2-3*(n-1) なのでその4つを合わせると 4*n^-6*(n-1)」
…うーむ、なるほど。
おおっ、こういう事か…!
自分では思いつかなかったけど凄く短いコードになった。

Copyright© 2011-2021 Shunsuke Otani All Right Reserved .