Haskell - 将坐标列表转换为ASCII图形?

时间:2013-12-17 11:45:05

标签: haskell

我试图完成一项任务。这是任务的最后一个问题,我已经进行了一段时间,但进展甚微。我需要将图像转换为ASCII图形,其中

type Point = (Int, Int)
type Image = [Point]

我必须编写一个带Image的函数并返回一个String。输出应该是“。| ... \ n.xxx。\ n- + x - \ n。| ... \ n”,使用putStr输出时看起来像

.|...
.xxx.
-+x--
.|...

原点用+表示,轴|和 - ,以及点'x'。

图形应始终在坐标周围有一个1点边框,因此当我打印图形时,我需要知道坐标的边界。我有一个功能来获得这些。

我还编写了一个函数split,它接受一个String和一个整数,并在每第n个间隔插入\ n。我想解决问题的方法是创建一个空白图表,其中包含轴的正确位置,然后将空白图表传递给新函数以插入点。

任何人都可以帮助我吗?如果它含糊不清,我可以提供您可能需要的更多详细信息。

2 个答案:

答案 0 :(得分:1)

以下是需要考虑的一些事项:

  • 从功能上讲,什么是图像?暂时忽略边界,图像是从坐标到此坐标上显示的任何函数的函数。尝试为图像提供类型签名。如果您使用type将其称为FImage,则可获得积分。把这些功能想象成你的主要对象(记住,功能是一等公民)。
  • 实施轴,FImage。请注意,您不需要任何界限。那不是很好吗?
  • 实施一个带有FImagePoint的函数,并生成一个FImage,其x位于正确的位置。
  • 从点列表中找出界限。一如既往,始终先思考:这是什么类型的签名?
  • 给定FImage和界限,产生最终String。您可能希望在此处使用列表推导。
  • 把它们放在一起。这里隐藏着一个折叠!其中一个论点是点数列表。什么是其他参数(基本情况和组合函数)。在Haskell专业知识的这个级别,不要过于担心它是foldl还是foldr,两者都有效(如果类型匹配)。
  • 完成: - )

快乐学习!

答案 1 :(得分:0)

很高兴看到人们诚实地将他们的问题标记为作业。

  • 如果你知道图像的尺寸,你知道如何遍历坐标吗?
  • 您知道如何按照图片中的外观顺序对点列表进行排序吗?
  • 鉴于这一切,你知道如何按照出现的顺序组织每个坐标和点列表的处理吗?