; 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))
OyB0ZXN0IHNjb3JlcwoKKGRlZmluZSAodGFrZSBuIHhzKQogIChsZXQgbG9vcCAoKG4gbikgKHhzIHhzKSAoeXMgJygpKSkKICAgIChpZiAob3IgKHplcm8/IG4pIChudWxsPyB4cykpCiAgICAgICAgKHJldmVyc2UgeXMpCiAgICAgICAgKGxvb3AgKC0gbiAxKSAoY2RyIHhzKQogICAgICAgICAgICAgIChjb25zIChjYXIgeHMpIHlzKSkpKSkKCihkZWZpbmUgKHN1bSB4cykgKGFwcGx5ICsgeHMpKQoKKGRlZmluZSBzY29yZXMgJygoIkFsaWNlIiA4NCkgKCJCb2IiIDkyKSAoIkFsaWNlIiA5MykKICAoIkJvYiIgNDcpICgiQ2hhcmxpZSIgNzMpICgiRGVubmlzIiA1OSkgKCJFdmUiIDkxKQogICgiQWxpY2UiIDc4KSAoIkNoYXJsaWUiIDg1KSAoIkV2ZSIgNjgpICgiQWxpY2UiIDEwMCkKICAoIkNoYXJsaWUiIDg0KSAoIkRlbm5pcyIgOTIpICgiRXZlIiA4NSkgKCJEZW5uaXMiIDgzKQogICgiQWxpY2UiIDkyKSAoIkJvYiIgNjgpICgiQm9iIiA3OSkgKCJEZW5uaXMiIDc5KQogICgiQWxpY2UiIDg0KSAoIkJvYiIgODkpICgiQ2hhcmxpZSIgNjkpICgiQ2hhcmxpZSIgNjcpCiAgKCJDaGFybGllIiA5MikgKCJEZW5uaXMiIDczKSAoIkV2ZSIgNzkpICgiRXZlIiA4NCkpKQoKKGRlZmluZSAoc2NvcmUgc2NvcmVzKQogIChsZXQgKChodCAobWFrZS1oYXNoLXRhYmxlKSkpCiAgICAoZG8gKChzY29yZXMgc2NvcmVzIChjZHIgc2NvcmVzKSkpCiAgICAgICAgKChudWxsPyBzY29yZXMpKQogICAgICAoaGFzaC1zZXQhIGh0IChjYWFyIHNjb3JlcykKICAgICAgICAoY29ucyAoY2FkYXIgc2NvcmVzKQogICAgICAgICAgICAgIChoYXNoLXJlZiBodCAoY2FhciBzY29yZXMpIChsaXN0KSkpKSkKICAgIChoYXNoLWZvbGQKICAgICAgKGxhbWJkYSAoayB2IGIpCiAgICAgICAgKGNvbnMgKGxpc3QgayAoLyAoc3VtICh0YWtlIDUgKHNvcnQgdiA+KSkpIDUuKSkgYikpCiAgICAgIChsaXN0KSBodCkpKQoKKGRpc3BsYXkgKHNjb3JlIHNjb3Jlcykp