;; local-design-quiz.rkt
(require 2htdp/image)
(require 2htdp/universe)

; Problem 1:
; 
; Suppose you have rosters for players on two opposing tennis team, 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.
; 
; Design a function that consumes two rosters, and produces true if all players 
; on both teams will play if the teams play each other. 
; No marks will be given to solution that do not use a cross product table. 
; 


;; 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)))]))

(define (all-players-play roster1 roster2)
  (cond
    [(and (empty? roster1) (empty? roster2)) #t]
    [(or (empty? roster1) (empty? roster2)) #f]
    [(not (equal? (first roster1) (first roster2))) #f]
    [(not (equal? (length roster1) (length roster2))) #f]
    [else (all-players-play (rest roster1) (rest roster2))]))


; Problem 2:
; 
; Now write a function that, given two teams, produces the list of tennis matches
; that will be played. 
; 
; Assume that this function will only be called if the function you designed above
; produces true. In other words, you can assume the two teams have the same number
; of players. 
; 

(check-expect (tennis-matches R0 R0) empty)
(check-expect (tennis-matches R0 R1) empty)
(check-expect (tennis-matches R1 R2) (list (make-match "Eugenie" "Maria")
                                          (make-match "Gabriela" "Nadia")
                                          (make-match "Sharon" "Elena")
                                          (make-match "Aleksandra" "Anastasia")))

                                          
(define (make-matches roster1 roster2)
  (cond
    [(empty? roster1) empty]
    [else
     (cons (make-match (first roster1) (first roster2))
           (make-matches (rest roster1) (rest roster2)))]))

(define (tennis-matches roster1 roster2)
  (if (all-players-play roster1 roster2)
      (make-matches roster1 roster2)
      '()))

Ran 3 tests.
1 of the 3 tests failed.

Check failures:
        Actual value '() differs from (list
 (make-match "Eugenie" "Maria")
 (make-match "Gabriela" "Nadia")
 (make-match "Sharon" "Elena")
 (make-match "Aleksandra" "Anastasia")), the expected value.
in local-design-quiz.rkt, line 74, column 0