This assignment is to be done in Ruby.
You are encouraged to do this in teams of two, both students working together on each function; if you do this, turn in one homework with both names on it.
For all functions, follow the design recipe: each function must have a contract, a good collection of test cases, and a function definition.
For testing, you might want to use this testing framework, written by Chris Dollard. Read the source code to learn how to use it.
In order to get your homeworks graded quickly, I won't actually grade every one of these problems, but rather a sample including problems of various levels of difficulty. The rest are practice. If there's one that you want to make sure I look at, call my attention to it when you turn in the homework.
Within each heading, the problems are arranged more or less in increasing order of difficulty. If one of them really stumps you, try going on to a different heading, and then come back to this problem.
Define a class named Candidate
analogous to
the struct
we defined in homework 2. The class
should have a constructor, getters, and a to_s
method.
Define a method named add-a-vote
in this class
analogous to the function we defined in homework 2. Note
that the function should take no arguments (operating on self
instead),
and should return a new Candidate
rather than modifying self
.
Note: The Array
class has a lot of built-in
methods which will make your life easier. See the Array documentation.
Re-write the add-up
function from
homework 2 as a Ruby function named sum
,
taking in a Ruby array of numbers as its argument. It should produce an error
message if any of the elements aren't numbers.
Re-write sum
as a method of the built-in
Array
class; it should take in no arguments, but rather add up the elements of
self
. It should produce an error message if any of the elements aren't
numbers.
Re-write the substitute
function from
homework 2 as a Ruby function that takes in two strings (old and new)
and an array of strings, and returns an array of strings. This should be easy to do using
a block iterator.
Re-write the winner
function from
homework 2 as a Ruby function that takes in an array of
Candidate
objects. (You may want to use block iterators for this.)
Re-write the scramble
function from homework 3 as a Ruby function that takes in an array.
Hint: It's a one-liner.
Re-do the "river" exercises from homework 2, with Ruby classes instead of Racket structs, and Ruby methods instead of Racket functions.
Rewrite the subsets
function
of homework 3 in Ruby. It should take in
an array (of strings, numbers, symbols, it doesn't matter) and produce
an array of arrays: all the possible subsets of the given array
(with the elements in the same order they were in the given array).
You may assume that the given array has no duplicate elements.
For example,
assert subsets([1,2,3]), [[],[3],[2],[2,3],[1],[1,3],[1,2],[1,2,3]]Hint: You don't have to use iterators over blocks for this, but it might help.
Develop a function doTwice
which takes in an argument
and a block, and returns the result of calling the block on the result of
calling the block on the argument. For example,
doTwice(4) {|x| x*x}should return 256.
Generalize doTwice
to a function iterate
that takes in a natural number n, an X,
and a block with contract "X -> X", and returns the result of calling
the block n successive times. For example,
iterate(5,3) {|x| x*2}should return 96.