让您拥有一个功能,让你的尺寸:
dimensions :: Image -> (Point, Point)
返回左上角和右下角。然后我会在排序顺序获得积分:
sortImage :: Image -> Image
,列出各种各样的最大y
和最小x
第一(提示:Data.List.sortBy
是你的朋友)。这实际上并非必要,但它可以让事情稍后变得容易。然后,你可以创建一个空白图像(即只轴和'.'
,或者您可以使用空格了简洁的外观)
blankImage :: (Point, Point) -> [String]
你的尺寸。一定要返回行的列表,你可以稍后用新行加入,但现在让它更容易处理。现在,[String] = [[Char]]
,所以你有一个二维数组的字符。你有一个列表Point
s指示坐标,但你必须改变它们,所以你的左上角坐标现在是(0, 0)
。这样我们就可以在数组上使用正常的索引来设置我们的点。幸运的是,我们已经计算了dimensions
中的偏移值。
然后,您需要一个函数,它将输出blankImage
并使用您现在的偏移量Image
中的值替换字符。由于Point
s为现在指数在blankImage
,这应该是很容易的。
fillImage :: Image -> [String] -> [String]
所以这个过程是:
import Data.List
showImage :: Image -> String
showImage img = intercalate "\n" filled
where
sortedImg = sorteImage img
(upperL, lowerR) = dimensions sortedImg
blank = blankImage (upperL, lowerR)
offsetImg = offsetImage upperL sortedImg
filled = fillImage offsetImg blank
putStrLn $ intercalate "\n" filled
功能intercalate
会加入你的[String]
新线,把它变成一个大的字符串。
我从你的意见,你是新来的Haskell看到,所以我会说,如果你需要更多的帮助,我会提供一些更多的提示,但是它会为你更好首先尝试自己解决这个问题。如果您遇到困难,请发表评论,我会编辑我的答案以帮助您解决问题。
哈斯克尔可有点让你的头部周围,特别是如果你刚刚开始。只是为了澄清你需要一个函数将't = [(0,1),(1,0),(1,1),(2,1)]'变成'“。| ... \ n.xxx 。\ n- + x - \ n。| ... \ n“' – Paperwaste
对于图像大小还有任何已定义的限制,或者我们的功能是否需要自行确定? – Paperwaste
我的意思是更像点的位置。如果其中一点是'(1,1000)',我们的形象将变得非常大。 – Paperwaste