Difference between revisions of "FP Homework 2"
Line 24: | Line 24: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | The result may differ based on rounding. | + | The result may differ based on rounding. In following example <code>'.'</code> was used for the free spot, <code>'#'</code> for the filled spot. |
<syntaxhighlight lang="Haskell" class="myDark" > | <syntaxhighlight lang="Haskell" class="myDark" > | ||
Line 45: | Line 45: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | == | + | == 1 - Drawing == |
+ | |||
+ | Lets define a new data types representing a point and a line. | ||
+ | <syntaxhighlight lang="Haskell"> | ||
+ | data Point = Point Int Int | ||
+ | data Line = Line Point Point | ||
+ | </syntaxhighlight> | ||
+ | Using these types write a function <code>drawLines</code> that creates a view of defined lines. The first parameter is a tuple (columns, rows) defining the size of the resulting view. Left top corner has a coordinate (0,0). Second argument is a list of lines. | ||
+ | <syntaxhighlight lang="Haskell"> | ||
+ | drawLines :: (Int,Int) -> [Line] -> Result | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | The result may differ based on rounding. In following example <code>'.'</code> was used for the free spot, <code>''</code> for the filled spot. | ||
+ | |||
+ | <syntaxhighlight lang="Haskell" class="myDark" > | ||
+ | Prelude> pp(drawLines (31,15) [Line (Point x y) (Point 15 7)|(x,y)<-concat [[(x,y)|y<-[0,7,14]]|x<-[0,15,30]]]) | ||
+ | ##.............#.............## | ||
+ | ..##...........#...........##.. | ||
+ | ....##.........#.........##.... | ||
+ | .....###.......#.......###..... | ||
+ | ........##.....#.....##........ | ||
+ | ..........###..#..###.......... | ||
+ | .............#####............. | ||
+ | ############################### | ||
+ | .............#####............. | ||
+ | ..........###..#..###.......... | ||
+ | ........##.....#.....##........ | ||
+ | .....###.......#.......###..... | ||
+ | ....##.........#.........##.... | ||
+ | ..##...........#...........##.. | ||
+ | ##.............#.............## | ||
+ | </syntaxhighlight> |
Revision as of 14:40, 20 November 2019
Basic notes
In all exercises you are required to write something to standard output. You can use the same strategy as in Laboratory 7.
Lets define a type for the result:
type Result = [String]
Now, if you want to print this result nicely on the screen, you can use:
pp :: Result -> IO ()
pp x = putStr (concat (map (++"\n") x))
1 - Painting
Lets define a new data types representing a circle and a rectangle.
data Point = Point Int Int
data Shape = Circle Point Int
| Rectangle {topLeft:: Point, bottomRight::Point}
Using these types write a function view
that creates a view of defined shapes. The first parameter is a tuple (columns, rows) defining the size of the resulting view. Left top corner has a coordinate (0,0). Second argument is a list of shapes (either circles or rectangles).
view :: (Int,Int) -> [Shape] -> Result
The result may differ based on rounding. In following example '.'
was used for the free spot, '#'
for the filled spot.
Prelude> pp(view (40,15) [Circle (Point 8 4) 5, Box {topLeft = (Point 15 5), bottomRight = (Point 35 12) }, Circle (Point 30 12) 8] )
....###...###...........................
....#.......#...........................
...##.......##..........................
...#.........#..........................
...#.........#.............#######......
...#.........#.#####################....
...##.......##.#........##.........##...
....#.......#..#.......##..........###..
....###...###..#.......#...........#.#..
......#####....#......##...........#.##.
...............#......#............#..#.
...............#......#............#..#.
...............#####################..#.
......................#...............#.
......................#...............#.
1 - Drawing
Lets define a new data types representing a point and a line.
data Point = Point Int Int
data Line = Line Point Point
Using these types write a function drawLines
that creates a view of defined lines. The first parameter is a tuple (columns, rows) defining the size of the resulting view. Left top corner has a coordinate (0,0). Second argument is a list of lines.
drawLines :: (Int,Int) -> [Line] -> Result
The result may differ based on rounding. In following example '.'
was used for the free spot, for the filled spot.
Prelude> pp(drawLines (31,15) [Line (Point x y) (Point 15 7)|(x,y)<-concat [[(x,y)|y<-[0,7,14]]|x<-[0,15,30]]])
##.............#.............##
..##...........#...........##..
....##.........#.........##....
.....###.......#.......###.....
........##.....#.....##........
..........###..#..###..........
.............#####.............
###############################
.............#####.............
..........###..#..###..........
........##.....#.....##........
.....###.......#.......###.....
....##.........#.........##....
..##...........#...........##..
##.............#.............##