Difference between revisions of "FP Homework 2"

From Marek Běhálek Wiki
Jump to navigation Jump to search
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>
  
== 2 - Ticktacktoe ==
+
== 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]]])
##.............#.............##
..##...........#...........##..
....##.........#.........##....
.....###.......#.......###.....
........##.....#.....##........
..........###..#..###..........
.............#####.............
###############################
.............#####.............
..........###..#..###..........
........##.....#.....##........
.....###.......#.......###.....
....##.........#.........##....
..##...........#...........##..
##.............#.............##