2

この単純な画像形式(PPM)で、Intのランダムな2次元配列を印刷することをいじっています

0 1 0 0 1
1 0 0 1 0
0 1 1 0 0
0 1 1 1 0
0 0 0 1 0

以下は私のコードです。これは機能しますが、このような単純な操作にはコードが多すぎるようです。これを行うより良い方法はありますか?

import System.Random
import Data.Array.IArray

main = do
  g <- newStdGen
  let img = listArray ((0,0),(5,5)) ( myRands g ) :: Array (Int,Int) Int
  putStrLn $ printArray img

myRands :: RandomGen g => g -> [Int]
myRands g = randomRs (0,1) g

make2dRange :: Int -> Int -> Int -> Int -> [(Int,Int)]
make2dRange x1 y1 x2 y2 = range ((x1,y1),(x2,y2))

printArray :: ( Array (Int,Int) Int ) -> String
printArray arr = unlines rows
  where rows = map (unwords . map (show . (!) arr)) rowIndices 
        rowIndices = map ( \y -> make2dRange 0 y 5 y ) [0..5]

もちろん、明らかなこと以外に(たとえば、配列の次元はハードコードされています)

4

2 に答える 2

0

あたり: http://lambda.haskell.org/platform/doc/current/packages/split-0.2.2/doc/html/Data-List-Split.html#v%3achunksOf

chunksOf :: Int -> [e] -> [[e]]

chunksOf n は、リストを長さ n の部分に分割します。n がリストの長さを均等に分割しない場合、最後のピースは短くなります。n <= 0 の場合、chunksOf nl は空のリストの無限リストを返します。

chunksOf を使用すると、私の実装は..

printArray arr = mapM_ (putStrLn . unwords) $ map (map show) $ chunksOf 5 arr

利用方法:

Prelude System.Random Data.List Data.List.Split> printArray [0..25]
0 1 2 3 4
5 6 7 8 9
10 11 12 13 14
15 16 17 18 19
20 21 22 23 24
25
于 2013-09-09T22:18:36.830 に答える