C 版打印特殊矩阵问题的 Haskell 实现

发布于 2022-08-05 23:41:07 字数 3222 浏览 10 评论 0

问题描述见 http://bbs.chinaunix.net/thread-1279897-1-1.html

Haskell 实现:

  1. module Main where
  2. import System.Environment (getArgs)
  3. import Data.List (intersperse)
  4. -- | before or after part
  5. bafix :: Bool -> Int -> [[Int]]
  6. bafix isBefore n = map ba [1,3..c]
  7.     where
  8.         ba :: Int -> [Int]
  9.         ba m = prefix ++ middle ++ (reverse prefix)
  10.             where
  11.                 prefix = [1..m]
  12.                 middle = replicate (n - 2 * m) p
  13.                 p      = if isBefore then (m+1) else m
  14.         c      = floor $ (fromIntegral n) / 2
  15. -- | Before part
  16. beforePart :: Int -> [[Int]]
  17. beforePart n = bafix True n
  18. -- | After part
  19. afterPart :: Int -> [[Int]]
  20. afterPart n = reverse $ bafix False n
  21. -- | Middle part
  22. middlePart :: Int -> [[Int]]
  23. middlePart n = replicate m $ digitPalindrom n
  24.     where
  25.         m = n - 2 * (length [1,3..c])
  26.         c = floor $ (fromIntegral n) / 2
  27.         digitPalindrom :: Int -> [Int]
  28.         digitPalindrom u = [1..c] ++ (reverse [1..f])
  29.             where
  30.                 u' = fromIntegral u
  31.                 c  = ceiling $ u' / 2
  32.                 f  = floor   $ u' / 2
  33. -- | matrix
  34. matrix :: Int -> [[Int]]
  35. matrix n = beforePart n ++ middlePart n ++ afterPart n
  36. -- | show matrix
  37. showMatrix :: [[Int]] -> String
  38. showMatrix nss = unlines $ map (ns -> concat $ intersperse " " $ map show ns) nss
  39. -- | main
  40. main = do
  41.     args <- getArgs
  42.     let n = read $ args !! 0
  43.     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 1

ACA80110: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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文