Spring 2023 Ruby Exam

Problem 1

Write method sum_tween to accept three parameters: an array of numbers, a lower bound, and an upper bound. It returns the sum of the numbers between the inclusive bounds. For example, sum_tween([1, -5, 8, 9, 20], 8, 10) → 17.

Do not use a loop or each statement.

Problem 2

Write a class UndoValue that represents a value that changes over time and can be reverted to an earlier state. It has the following public methods:

Problem 3

Write a method count_words that accepts a string of words separated by single spaces. It counts how many times each word appears, and returns the counts in a hash keyed on the words. For example, count_words("i had had enough"){"i" => 1, "had" => 2, "enough" => 1}.

Do not use a loop or each statement.

Problem 4

Write method neighbors3 that accepts an array and an index. It returns a comma-separated string of the three values nearest to the index. If values are cut off from the beginning or end, an ellipsis appears in their place. For example:

Assume that the array has at least three elements.

Problem 5

Write a class Person that has a constructor that accepts a first name and a last name. It has getters first and last. It also has a method username that generates a username, which is the person's last name followed by their first initial, all in lowercase.

Write also a top-level method read_people that accepts the path to a file as its only parameter. Inside the file is text of this form:

Jacobs,Harriet
Dewey,John
Kosemura,Akira
...
Jacobs,Harriet
Dewey,John
Kosemura,Akira
...

The number of lines in the file is arbitrary. The method reads in the file and returns an array of Person.

Write also a top-level method read_usernames that accepts the path to a file of the same format described earlier. It returns an array of the people's usernames.

Problem 6

Write a method wordgrid that accepts an array of strings, all of the same length. It prints to standard output the letters in the cells of a grid surrounded by lines made of hyphens and pipes. For example, wordgrid(['abc', 'def', 'ghi', 'jkl']) displays this output:

-------
|a|b|c|
-------
|d|e|f|
-------
|g|h|i|
-------
|j|k|l|
-------
-------
|a|b|c|
-------
|d|e|f|
-------
|g|h|i|
-------
|j|k|l|
-------