タイトルがわかりにくいな。
ホントは図を描けばいいのかもしれないけど、まず、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
実行例:
takatoh@apostrophe $ runhaskell block.hs 4 2 [(3,0),(3,1),(3,2),(4,0),(4,1),(4,2),(5,0),(5,1),(5,2)] takatoh@apostrophe $ runhaskell block.hs 1 5 [(0,3),(0,4),(0,5),(1,3),(1,4),(1,5),(2,3),(2,4),(2,5)]
こんな感じ。