NOTE!
The following applies to each of the problems in phase one of the problem set:
You are required to design each function as a 2-one-of problem.
Provide signature, purpose, stub, cross-product of types table (filled
using your examples (see next paragraph)),
and examples. DO NOT IMPLEMENT THE FUNCTION.
You must include a properly formed cross-product of types comment table to
receive credit for each problem. You must render it as text in a comment
box. It should come after the purpose. You may find it helpful to draw your
cross-product on paper for your design and then use a tool like
http://www.asciiflow.com/#Draw to help you render it.
Use your examples to fill in the cross product of types table. Remember,
the content of the table does not need to be fully-formed code. See the
videos and the 2-One-Of practice problem solutions for examples of what is
acceptable.
After you have filled in the table, you should simplify it.
As part of the simplification, assign a number to each subclass that
produces different answers. Consult the Coursera practice problem solutions
for examples of this.
Problem 1:
Suppose you have rosters for players on two opposing tennis teams, and each
roster is ordered by team rank, with the best player listed first. When both
teams play, the best players of each team play one another,
and the second-best players play one another, and so on down the line. When
one team has more players than the other, the lowest ranking players on
the larger team do not play.
In this problem you will begin to design a function that takes two lists of
players and produces a list of matches, according to the approach described
above. DO NOT IMPLEMENT THE FUNCTION.
;; Player is String
;; interp. the name of a tennis player.
(define P0 "Maria")
(define P2 "Serena")
#;
(define (fn-for-player p)
(... p))
;; Roster is one of:
;; - empty
;; - (cons Player Roster)
;; interp. a team roster, ordered from best player to worst.
(define R0 empty)
(define R1 (list "Eugenie" "Gabriela" "Sharon" "Aleksandra"))
(define R2 (list "Maria" "Nadia" "Elena" "Anastasia" "Svetlana"))
#;
(define (fn-for-roster r)
(cond [(empty? r) (...)]
[else
(... (fn-for-player (first r))
, (fn-for-roster (rest r)))]))
(define-struct match (p1 p2))
;; Match is (make-match Player Player)
;; interp. a match between player p1 and player p2, with same team rank
(define M0 (make-match "Eugenie" "Maria"))
(define M1 (make-match "Gabriela" "Nadia"))
#;
(define (fn-for-match m)
(... (match-p1 m) (match-p2 m)))
;; ListOfMatch is one of:
;; - empty
;; - (cons Match ListOfMatch)
;; interp. a list of matches between one team and another.
(define LOM0 empty)
(define LOM1 (list (make-match "Eugenie" "Maria")
(make-match "Gabriela" "Nadia")))
#;
(define (fn-for-lom lom)
(cond [(empty? lom) (...)]
[else
(... (fn-for-match (first lom))
(fn-for-lom (rest lom)))]))
Solution:
;; Roster Roster -> ListOfMatch
;; given two team rosters produce a list of matches for all pairwise ranks.