タイトルがわかりにくいな。
ホントは図を描けばいいのかもしれないけど、まず、2次元のリストを考える。で、そのリストの中に3×3のブロックが並んでいると考えてほしい。今日やりたいのは、ある座標(インデックス、0始まり、2次元なので当然2つの整数)を与えたときに、その座標を含むブロックの全座標を列挙したいってこと。
最初、どうやったらいいか悩んだけど、出来てみれば案外簡単だった。
module Main where
import System.Environment (getArgs)
block :: Int -> Int -> [(Int, Int)]
block i j = [(x,y)| x <- section i, y <- section j]
section :: Int -> [Int]
section n = [s..e]
where
s = n div
3 * 3
e = s + 2
main :: IO ()
main = do
args <- getArgs
let i = read (args !! 0) :: Int
let j = read (args !! 1) :: Int
print $ block i j
実行例:
[email protected] $ runhaskell block.hs 4 2 [(3,0),(3,1),(3,2),(4,0),(4,1),(4,2),(5,0),(5,1),(5,2)] [email protected] $ runhaskell block.hs 1 5 [(0,3),(0,4),(0,5),(1,3),(1,4),(1,5),(2,3),(2,4),(2,5)]
こんな感じ。