C 版打印特殊矩阵问题的 Haskell 实现
问题描述见 http://bbs.chinaunix.net/thread-1279897-1-1.html
Haskell 实现:
- module Main where
- import System.Environment (getArgs)
- import Data.List (intersperse)
- -- | before or after part
- bafix :: Bool -> Int -> [[Int]]
- bafix isBefore n = map ba [1,3..c]
- where
- ba :: Int -> [Int]
- ba m = prefix ++ middle ++ (reverse prefix)
- where
- prefix = [1..m]
- middle = replicate (n - 2 * m) p
- p = if isBefore then (m+1) else m
- c = floor $ (fromIntegral n) / 2
- -- | Before part
- beforePart :: Int -> [[Int]]
- beforePart n = bafix True n
- -- | After part
- afterPart :: Int -> [[Int]]
- afterPart n = reverse $ bafix False n
- -- | Middle part
- middlePart :: Int -> [[Int]]
- middlePart n = replicate m $ digitPalindrom n
- where
- m = n - 2 * (length [1,3..c])
- c = floor $ (fromIntegral n) / 2
- digitPalindrom :: Int -> [Int]
- digitPalindrom u = [1..c] ++ (reverse [1..f])
- where
- u' = fromIntegral u
- c = ceiling $ u' / 2
- f = floor $ u' / 2
- -- | matrix
- matrix :: Int -> [[Int]]
- matrix n = beforePart n ++ middlePart n ++ afterPart n
- -- | show matrix
- showMatrix :: [[Int]] -> String
- showMatrix nss = unlines $ map (ns -> concat $ intersperse " " $ map show ns) nss
- -- | main
- main = do
- args <- getArgs
- let n = read $ args !! 0
- putStrLn $ showMatrix $ matrix n
复制代码
ACA80110:tmp lee$ ./matrix 7
1 2 2 2 2 2 1
1 2 3 4 3 2 1
1 2 3 4 3 2 1
1 2 3 4 3 2 1
1 2 3 4 3 2 1
1 2 3 3 3 2 1
1 1 1 1 1 1 1ACA80110:tmp lee$ ./matrix 8
1 2 2 2 2 2 2 1
1 2 3 4 4 3 2 1
1 2 3 4 4 3 2 1
1 2 3 4 4 3 2 1
1 2 3 4 4 3 2 1
1 2 3 4 4 3 2 1
1 2 3 3 3 3 2 1
1 1 1 1 1 1 1 1
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论