fork download
  1. ; test scores
  2.  
  3. (define (take n xs)
  4. (let loop ((n n) (xs xs) (ys '()))
  5. (if (or (zero? n) (null? xs))
  6. (reverse ys)
  7. (loop (- n 1) (cdr xs)
  8. (cons (car xs) ys)))))
  9.  
  10. (define (sum xs) (apply + xs))
  11.  
  12. (define scores '(("Alice" 84) ("Bob" 92) ("Alice" 93)
  13. ("Bob" 47) ("Charlie" 73) ("Dennis" 59) ("Eve" 91)
  14. ("Alice" 78) ("Charlie" 85) ("Eve" 68) ("Alice" 100)
  15. ("Charlie" 84) ("Dennis" 92) ("Eve" 85) ("Dennis" 83)
  16. ("Alice" 92) ("Bob" 68) ("Bob" 79) ("Dennis" 79)
  17. ("Alice" 84) ("Bob" 89) ("Charlie" 69) ("Charlie" 67)
  18. ("Charlie" 92) ("Dennis" 73) ("Eve" 79) ("Eve" 84)))
  19.  
  20. (define (score scores)
  21. (let ((ht (make-hash-table)))
  22. (do ((scores scores (cdr scores)))
  23. ((null? scores))
  24. (hash-set! ht (caar scores)
  25. (cons (cadar scores)
  26. (hash-ref ht (caar scores) (list)))))
  27. (hash-fold
  28. (lambda (k v b)
  29. (cons (list k (/ (sum (take 5 (sort v >))) 5.)) b))
  30. (list) ht)))
  31.  
  32. (display (score scores))
Success #stdin #stdout 0.04s 8656KB
stdin
Standard input is empty
stdout
((Charlie 80.6) (Dennis 77.2) (Alice 90.6) (Bob 75.0) (Eve 81.4))