; test scores

(define (take n xs)
  (let loop ((n n) (xs xs) (ys '()))
    (if (or (zero? n) (null? xs))
        (reverse ys)
        (loop (- n 1) (cdr xs)
              (cons (car xs) ys)))))

(define (sum xs) (apply + xs))

(define scores '(("Alice" 84) ("Bob" 92) ("Alice" 93)
  ("Bob" 47) ("Charlie" 73) ("Dennis" 59) ("Eve" 91)
  ("Alice" 78) ("Charlie" 85) ("Eve" 68) ("Alice" 100)
  ("Charlie" 84) ("Dennis" 92) ("Eve" 85) ("Dennis" 83)
  ("Alice" 92) ("Bob" 68) ("Bob" 79) ("Dennis" 79)
  ("Alice" 84) ("Bob" 89) ("Charlie" 69) ("Charlie" 67)
  ("Charlie" 92) ("Dennis" 73) ("Eve" 79) ("Eve" 84)))

(define (score scores)
  (let ((ht (make-hash-table)))
    (do ((scores scores (cdr scores)))
        ((null? scores))
      (hash-set! ht (caar scores)
        (cons (cadar scores)
              (hash-ref ht (caar scores) (list)))))
    (hash-fold
      (lambda (k v b)
        (cons (list k (/ (sum (take 5 (sort v >))) 5.)) b))
      (list) ht)))

(display (score scores))