fork download
  1. ; sum distinct items
  2.  
  3. (define (drop-while pred? xs)
  4. (let loop ((xs xs))
  5. (if (or (null? xs) (not (pred? (car xs)))) xs
  6. (loop (cdr xs)))))
  7.  
  8. (define (sum-distinct xs)
  9. (let loop ((xs (sort xs <)) (sum 0))
  10. (cond ((null? xs) sum)
  11. ((and (pair? (cdr xs)) (= (car xs) (cadr xs)))
  12. (loop (drop-while (lambda (x) (= x (car xs))) xs) sum))
  13. (else (loop (cdr xs) (+ sum (car xs)))))))
  14.  
  15. (display (sum-distinct '(4 2 3 1 7 4 2 7 1 7 5))) (newline)
  16.  
  17. (define (sum-distinct xs)
  18. (let loop ((xs xs) (once (list)) (more (list)) (sum 0))
  19. (cond ((null? xs) sum)
  20. ((member (car xs) more)
  21. (loop (cdr xs) once more sum))
  22. ((member (car xs) once)
  23. (loop (cdr xs) once (cons (car xs) more) (- sum (car xs))))
  24. (else (loop (cdr xs) (cons (car xs) once) more (+ sum (car xs)))))))
  25.  
  26. (display (sum-distinct '(4 2 3 1 7 4 2 7 1 7 5))) (newline)
Success #stdin #stdout 0s 7880KB
stdin
Standard input is empty
stdout
8
8