Assignment: 6 - School of Computer Science Student WWW Server

CS 135 Winter 2015
Troy Vasiga
Assignment: 6
Due:
Language level:
Allowed recursion:
Files to submit:
Tuesday, February 24, 2015 9:00pm
Beginning Student with List Abbreviations
Pure Structural Recursion, Structural Recursion with an Accumulator
recursion.rkt,
student.rkt,
phone.rkt,
a06bonus.rkt
Warmup exercises: HtDP 12.2.1, 13.0.3, 13.0.4, 13.0.7, 13.0.8
Practise exercises: HtDP 12.4.1, 12.4.2, 13.0.5, 13.0.6
• Unless specifically asked in the question, you are not required to provide a data definition or
a template in your solutions for any of the data types described in the questions. However,
you may find it helpful to write them yourself and use them as a starting point.
• In your solutions, if you create any data types yourself that are beyond the question descriptions, or data types discussed in the notes, your program file should include a data definition
and a template (named my-<type>-fn for your particular <type>) for these cases.
• Unless otherwise stated, if X is a known type then you may assume that (listof X) is also a
known type.
• You may use the abbreviation (list . . .) or quote notation for lists when defining constants for
examples and tests.
• In this assignment you will not be penalized for having an inefficient implementation (e.g.
using append). Your Code Complexity/Quality grade will be determined by how clear your
approach to solving the problem is.
• You may reuse the provided examples, but you should ensure you have an appropriate number
of examples and tests.
• Your solutions must be entirely your own work.
• For this and all subsequent assignments, unless otherwise stated, you should include the
design recipe for all functions, including helper functions, as discussed in class.
• Solutions will be marked for both correctness and good style as outlined in the Style Guide.
• You may not use the Racket functions reverse, member?, or equal?, in any of your solutions,
unless stated otherwise.
• You must use the cond special form, and are not allowed to use if in any of your solutions.
• You may only use the list functions that have been discussed in the notes, unless explicitly
allowed in the question.
Here are the assignment questions you need to submit.
1. Place your solutions to the following questions in recursion.rkt
CS 135 — Winter 2015
Assignment 6
1
(a) Write the function after-n which consumes three parameters: the natural number n, the
symbol to search for, v, and a list of symbols. The function after-n produces the list of
symbols which occur after the nth occurrence of v in the consumed list. If v does not
appear in the list at least n times, produce empty. For example,
(after-n 2 ’a (list ’a ’b ’a ’e ’n ’d)) ⇒ (list ’e ’n ’d)
(after-n 0 ’z (list ’a ’b ’a ’e ’n ’d)) ⇒ (list ’a ’b ’a ’e ’n ’d).
(b) Write the function list-posn which consumes a list of lists of integers and a Posn (with
both fields being positive integers), and produces an integer or false. The integer that
is produced is the yth element of the xth list in the consumed list of lists. If there is no
such element, the function produces false. For example:
(list-posn (list (list 1 2 3) (list 4 5) (list 6 7 8)) (make-posn 2 1)) ⇒ 4
(list-posn (list (list 1 2 3) (list 4 5) (list 6 7 8)) (make-posn 1 4)) ⇒ false
(c) Write the function every-nth which consumes a list and a positive integer n, and produces
a list containing every nth element from the original list, where the first element in the
list is at index 1. For example:
(every-nth (list 1 2 3 4 5 6 7 8 9) 3) ⇒ (list 3 6 9)
(every-nth (list 1 2 3 4) 1) ⇒ (list 1 2 3 4)
(d) Write the function mult-score which consumes two lists of the same length. The first
consumed list has the responses to multiple choice questions, where the response is one
of ’A, ’B, ’C, ’D, ’E, ’blank. The second list has the correct answers to the corresponding
questions, where each answer will be one of ’A, ’B, ’C, ’D or ’E. The score for each
question is:
• 5 if the answer is correct;
• 2 if the answer is blank;
• 0 if the answer is incorrect.
The function mult-score should produce the total score, producing 0 if both lists are
empty.
2. Place your answers for this question in the file student.rkt.
(a) Write the function tallest which consumes a list of symbols (representing first names of
students) and a list of positive numbers (representing the corresponding height of the
students). You can assume that both lists are the same length and both are non-empty.
The function should produce the name of the student who is the tallest: in the case of a
tie, produce the name of the first student in the list with that maximal height. For this
part, you must use pure structural recursion.
(b) Write the function shortest which consumes a list of symbols (representing first names
of students) and a list of positive numbers (representing the corresponding height of the
students). You can assume that both lists are the same length and both are non-empty.
The function should produce the name of the student who is the shortest: in the case
of a tie, produce the name of the first student in the list with that minimal height. For
CS 135 — Winter 2015
Assignment 6
2
this part, you must use accumulative recursion. Hint: write an accumulative helper
function (with more parameters than shortest) that keeps track of the information you
know so far as you progress down the list. That is, your main function does not need to
use accumulative recursion, but your helper function should.
(c) Write the function student-al which consumes a list of distinct symbols (representing
first names of students) and a list of positive numbers (representing the corresponding
height of the students). You can assume that the lists have the same length. The function
student-al should produce an association list (i.e., a list of lists) with the keys being the
student names (symbols) and the values being the height of the corresponding student
(positive numbers). The order of the keys should be the same as the consumed list of
names.
(d) Write the function basketball which consumes an association list as created in the
previous part (i.e., a list of lists, with the keys being the names as symbols, and the
values being the numerical height of the students) and a positive height and produces
the list of names (i.e., symbols) for those students that are at least as tall as the given
height, in the same order that the names appear in the consumed list.
3. Many businesses use a mnemonic for their telephone number: FedEx uses “1-800-GoFedEx”
and Bell uses “1-888-SKY-DISH” for satellite TV support. In the file phone.rkt:
(a) Define an association-list named phone-letters that maps characters to digits. For
example, #\a is the key for the value 2. Use the following mapping: abc → 2, de f → 3,
ghi → 4, jkl → 5, mno → 6, pqrs → 7, tuv → 8, and wxyz → 9. That is, the keys a,
b, and c all map to the same value (which is duplicated in the association list). The
association-list should be sorted in alphabetical ordering by the keys, and contain only
26 keys. Note the extra letters for 7 and 9.
(b) Write the function mnemonic->num. It consumes a string and an association list giving a
mapping between characters and digits. It produces a natural number by substituting each
character in the string with the appropriate digit from the association list. For uppercase
letters, they should produce the value associated with the corresponding lowercase
version. For example, (mnemonic->num "GoFedEx" phone-letters) produces 4633339.
If any character (or its lowercase version) does not appear in the given association list,
the function should produce the value false. If the string is empty, the function should
produce 0. Hint: you should modify the lookup-al function from slide 06-57, and use it
as a helper function for mnemonic->num.
Restrictions: You may use string->list, char-downcase (to make characters lowercase),
char-alphabetic? and the familiar list functions from class (first, rest, cons, list, etc.).
You may not use list->string, reverse or string->number.
Using accumulative recursion will be helpful.
This concludes the list of questions for which you need to submit solutions. As always, check your
email for the basic test results after making a submission.
CS 135 — Winter 2015
Assignment 6
3
4. 5% Bonus: Write the inverse of mnemonic->num. That is, write num->possible-mnemonics.
It consumes a natural number and an association list and produces all the possible mnemonics
for that number as a list of lowercase strings, sorted in alphabetic order. For example,
(define dig-to-char (list
; partial association list, used just for brevity in testing
(list 4 (list #\g #\h #\i))
(list 6 (list #\m #\n #\o))
(list 5 (list #\j #\k #\l))))
(num->possible-mnemonics 5 dig-to-char)
⇒ (list "j" "k" "l")
(num->possible-mnemonics 75 dig-to-char)
⇒ empty
(num->possible-mnemonics 46 dig-to-char)
⇒ (list "gm" "gn" "go" "hm" "hn" "ho" "im" "in" "io")
Note the “go”, as in “GoFedEx”, in the last example.
You can use any built-in function in Beginning Student with List Abbreviations.
Put your solution in a06bonus.rkt.
Enhancements: Reminder—enhancements are for your interest and are not to be handed in.
A cellular automaton is a way of describing the evolution of a system of cells (each of which can
be in one of a small number of states). This line of research goes back to John von Neumann, a
mathematician who had a considerable influence on computer science just after the Second World
War. Stephen Wolfram, the inventor of the Mathematica math software system, has a nice way of
describing simple cellular automata. Wolfram believes that more complex cellular automata can
serve as a basis for a new theory of real-world physics (as described in his book “A New Kind
of Science”, which is available online). But you don’t have to accept that rather controversial
proposition to have fun with the simpler type of automata.
The cells in Wolfram’s automata are in a one-dimensional line. Each cell is in one of two states:
white or black. You can think of the evolution of the system as taking place at clock ticks. At one
tick, each cell simultaneously changes state depending on its state and those of its neighbours to the
left and right. Thus the next state of a cell is a function of the current state of three cells. There are
thus 8 (23 ) possibilities for the input to this function, and each input produces one of two values;
thus there are 28 or 256 different automata possible.
CS 135 — Winter 2015
Assignment 6
4
If white is represented by 0, and black by 1, then
each automaton can be represented by an 8-bit binary number, or an integer between 0 and 255. Wolfram calls these “rules”. Rule 0, for instance, states
that no matter what the states of the three cells are,
the next state of the middle cell is white, or 0. But
Rule 1 says that in the case where all three cells are
white (the input is 000, which is zero in binary), the
next state of the middle cell is black (because the
zeroth digit of 1, or the digit corresponding to the
number of 20 s in 1, is 1, meaning black). In the
other seven cases, the next state is white.
This is all made clearer by the pictures at the following URL, from which the picture at the right is taken:
http://mathworld.wolfram.com/CellularAutomaton.html
Some of these rules, such as rule 30, generate unpredictable and apparently chaotic behaviour
(starting with as little as one black cell with an infinite number of white cells to left and right); in
fact, this is used as a random number generator in Mathematica.
You can use DrRacket to investigate cellular automata and draw or animate their evolution, using
the io.ss, draw.ss, image.ss, or world.ss teachpacks. Write a function that takes a rule
number and a configuration of cells (a fixed-length list of states, of a size suitable for display) and
computes the next configuration.
CS 135 — Winter 2015
Assignment 6
5