プログラミングセンス


またまた例の入社試験ネタですが,座標a(x,y)の4近傍をどういう順序で書くか?という話.対称性を出して,a(x-1,y),a(x+1,y),a(x,y-1),a(x,y+1)とするのが正解,とのことで,なるほど3次元を考慮した場合は拡張がしやすいです.
ちなみに自分は,a(x-1,y),a(x,y-1),a(x+1,y),a(x,y+1)としましたが,3次元になったら結局上と同様の書き方になると思います.だったら最初からそうしとけよと.


自分は以前ゲームプログラミングなんぞをしていましたが,当時は3Dプログラムが出始め(初代プレステやDirect3Dの最初の方)で,あまりそっち系にはのめりこまないうちに今の業界(業務系システム開発)にきてしまいました.どちらかというと画像のエフェクトのほうが馴染み深い感じです.なので,3次元への拡張という思考にならない.そのへんを見事に突かれた気がします.


それはさておき,気になるのは8近傍(3×3近傍)です.これはどう書くのが正解なんでしょうか?
a(x-1,y-1),a(x,y-1),a(x+1,y-1),a(x-1,y),a(x+1,y),a(x-1,y+1),a(x,y+1),a(x+1,y+1)
かな?でも,これって対称なのか?というか,対称ってなんだろう?
対角線で組をつくると対称ってことなら,
a(x-1,y),a(x+1,y),a(x-1,y-1),a(x+1,y+1),a(x,y-1),a(x,y+1),a(x+1,y-1),a(x-1,y+1)
って感じ?う〜ん……微妙.


自分が4近傍のとき書いたパターン,これは左→上→右→下と時計回りになっています.なので8近傍は自然と,
a(x-1,y),a(x-1,y-1),a(x,y-1),a(x+1,y-1),a(x+1,y),a(x+1,y+1),a(x,y+1),a(x-1,y+1)
って感じで直感的に書けます.5×5近傍の場合は内側で1周したあと外側で1周って感じかな?なので,

これは、-1するものを順番に列挙して、次に+1するものを順番に列挙するという考えかた。対称式を扱うときにこういう列挙の仕方をすることがあるが、この場合、(x,y)の周辺3×3を列挙するときにこのままでは拡張し辛い。

というのはよく分からないです(もちろん次元が上がったときの問題があるので,これが正解とは思ってませんが).どうなんでしょう?