====Objective:====
Learn the basics of the Julia Language.
----
====Preparation:====
For this lab, you should use at least Julia v.0.4. You may use the binary hosted in Dr. Wingate's home directory, at
''/users/faculty/wingated/cs330/languages/julia-2e358ce975/bin''
or you may install Julia yourself.
----
====Deliverables:====
For this lab, you will need to implement the following functions and data structures in Julia:
* ''area''
* ''in_shape''
* ''greyscale''
* ''invert''
* ''count_person''
* ''average_age''
* ''tree_map''
* ''add_last_name''
* ''eye_colors''
=== Shapes ===
Define the following data structures.
abstract Shape
type Position
x::Real
y::Real
end
type Circ <: Shape
center::Position
radius::Real
end
type Square <: Shape
upper_left::Position
length::Real
end
type Rect <: Shape
upper_left::Position
width::Real
height::Real
end
=== Area ===
function area(shape) ...
Returns the area of the given shape.
where ''Shape'' is some concrete instance of the abstract shape type class. For this a few of the following instead of testing for class member ship it is easier to write three different functions, one for each concrete instance of shape. ie: ''function area(shape::rect)...''
=== In_Shape===
function in_shape(shape::Shape, position::Position) ...
Returns if the position is inside the shape. Assume standard math coordinates where y is positive going up. The bounds are inclusive.
=== Pixel ===
Define the Following type in your code
type Pixel
r::Real
g::Real
b::Real
end
=== Greyscale ==
function greyscale(picture::Array{Pixel,2}) ...
Takes a 2d array of pixels and greys out each pixel. This is done by averaging together the r g b values and then setting r g b to the average.
Hint: Julias map works over multi-dimensional arrays
=== invert ===
function invert(picture::Array{Pixel,2}) ...
Takes a 2d array and pixels and inverts each one. Inverting is done by setting r to `255 - r` and the other two in the same manner.
=== Trees ==
Define the following types in your code
abstract TreeItem
type Person <: TreeItem
name::AbstractString
birthyear::Integer
eyecolor::Symbol
father::TreeItem
mother::TreeItem
end
type Unknown <: TreeItem
end
=== Count Persons ===
function count_persons(tree)
Counts the number of people in the tree. Unknowns do not count as people.
=== Average Age ===
function average_age(tree)
Calculates the average age of the people in the tree. Use this years date 2017. Unknowns do not count as people.
=== tree map ===
function tree_map(f, tree)
Takes a function f and applies it to each known member of the tree. The function f takes one parameter and returns a treeItem. Tree_map will return a *new* tree. Tree_map should leave the original tree unchanged, unless f applies a mutation.
=== add last name===
function add_last_name(name::AbstractString, tree)
Appends name to the end of the name of each member of the tree. You should use tree_map. You do not need to add a space in front of the name.
Hint: Julia uses ''*'' for string concatenation.
=== eye_colors ===
function eye_colors(tree)
Returns a list of all eye colors in the tree. A color can appear more than once. For grading visit the order child, father, mother.
hint: Julia arrays can be appended using the ; for example [a;b;c] will create a list with a, b, and c in it. The empty list [] is ignored.