fork download
  1. ; pounds shillings pence
  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 (normalize schema number)
  9. (let loop ((ss (reverse schema))
  10. (ns (reverse number))
  11. (result (list)) (carry 0))
  12. (drop-while zero?
  13. (cond ((null? ns)
  14. (if (zero? carry) result
  15. (cons carry result)))
  16. ((null? ss)
  17. (cons (+ carry (car ns)) result))
  18. (else (loop (cdr ss) (cdr ns)
  19. (cons (modulo (+ (car ns) carry) (car ss)) result)
  20. (let* ((x (+ (car ns) carry))
  21. (q (quotient x (car ss)))
  22. (r (remainder x (car ss))))
  23. (if (negative? r) (- q 1) q))))))))
  24.  
  25. (display (normalize '(20 12) '(15 26 13))) (newline)
  26. (display (normalize '(20 12) '(1 -2 7))) (newline)
  27.  
  28. (define (plus/minus schema op x y)
  29. (let loop ((xs (reverse x))
  30. (ys (reverse y))
  31. (result (list)))
  32. (cond ((and (null? xs) (null? ys))
  33. (normalize schema result))
  34. ((null? xs)
  35. (loop xs (cdr ys) (cons (car ys) result)))
  36. ((null? ys)
  37. (loop (cdr xs) ys (cons (car xs) result)))
  38. (else (loop (cdr xs) (cdr ys)
  39. (cons (op (car xs) (car ys)) result))))))
  40.  
  41. (display (plus/minus '(20 12) + '(8 12 10) '(7 14 3))) (newline)
  42. (display (plus/minus '(20 12) - '(8 12 10) '(7 14 3))) (newline)
  43. (display (plus/minus '(20 12) - '(7 14 3) '(8 12 10))) (newline); your code goes here
Success #stdin #stdout 0.04s 8656KB
stdin
Standard input is empty
stdout
(16 7 1)
(18 7)
(16 7 1)
(18 7)
(-1 1 5)