fork(1) download
  1. ; water jugs puzzle
  2.  
  3. (define (water-jugs-verbose fcap tcap target)
  4. (let loop ((fjug 0) (tjug 0) (steps 0))
  5. (display "step: ") (display steps)
  6. (display "; fjug: ") (display fjug)
  7. (display "; tjug: ") (display tjug)
  8. (cond ((= fjug target)
  9. (display "; done; target in fjug") (newline)
  10. steps)
  11. ((= tjug target)
  12. (display "; done; target in tjug") (newline)
  13. steps)
  14. ((= tjug tcap) ; "to" jug full; empty it
  15. (display "; tjug full; empty it") (newline)
  16. (loop fjug 0 (+ steps 1)))
  17. ((zero? fjug)
  18. (display "; fjug empty; fill it") (newline)
  19. (loop fcap tjug (+ steps 1)))
  20. (else
  21. (display "; pour fjug into tjug") (newline)
  22. (let ((x (min (- tcap tjug) fjug)))
  23. (loop (- fjug x) (+ tjug x) (+ steps 1)))))))
  24.  
  25. (define (water-jugs fcap tcap target)
  26. (let loop ((fjug 0) (tjug 0) (steps 0))
  27. (cond ((or (= fjug target) (= tjug target)) steps)
  28. ((= tjug tcap) (loop fjug 0 (+ steps 1)))
  29. ((zero? fjug) (loop fcap tjug (+ steps 1)))
  30. (else (let ((x (min (- tcap tjug) fjug)))
  31. (loop (- fjug x) (+ tjug x) (+ steps 1)))))))
  32.  
  33. (define (jugs x y target)
  34. (if (positive? (modulo target (gcd x y))) #f
  35. (min (water-jugs x y target) (water-jugs y x target))))
  36.  
  37. (water-jugs-verbose 3 5 4) (newline)
  38. (water-jugs-verbose 5 3 4) (newline)
  39. (display (jugs 3 5 4)) (newline)
Success #stdin #stdout 0.02s 8800KB
stdin
Standard input is empty
stdout
step: 0; fjug: 0; tjug: 0; fjug empty; fill it
step: 1; fjug: 3; tjug: 0; pour fjug into tjug
step: 2; fjug: 0; tjug: 3; fjug empty; fill it
step: 3; fjug: 3; tjug: 3; pour fjug into tjug
step: 4; fjug: 1; tjug: 5; tjug full; empty it
step: 5; fjug: 1; tjug: 0; pour fjug into tjug
step: 6; fjug: 0; tjug: 1; fjug empty; fill it
step: 7; fjug: 3; tjug: 1; pour fjug into tjug
step: 8; fjug: 0; tjug: 4; done; target in tjug

step: 0; fjug: 0; tjug: 0; fjug empty; fill it
step: 1; fjug: 5; tjug: 0; pour fjug into tjug
step: 2; fjug: 2; tjug: 3; tjug full; empty it
step: 3; fjug: 2; tjug: 0; pour fjug into tjug
step: 4; fjug: 0; tjug: 2; fjug empty; fill it
step: 5; fjug: 5; tjug: 2; pour fjug into tjug
step: 6; fjug: 4; tjug: 3; done; target in fjug

6