fork download
  1. ; ladder range
  2.  
  3. (define left '(0 1 4 9 16 25 36 49 64 81 100))
  4. (define right '(0 3 14 15 23 24 25 49 57 92 100))
  5.  
  6. (define slopes
  7. (map (lambda (left right) (- right left))
  8. left right))
  9.  
  10. (define intercepts left)
  11.  
  12. (display slopes) (newline)
  13. (display intercepts) (newline)
  14.  
  15. (define (lt? idx x y)
  16. (let ((slope (list-ref slopes idx))
  17. (intercept (list-ref intercepts idx)))
  18. (positive? (- (+ (* slope x) intercept) y))))
  19.  
  20. (display (lt? 7 0.5 50)) (newline)
  21. (display (lt? 8 0.5 50)) (newline)
  22.  
  23. (define (ladder x y)
  24. (when (or (lt? 0 x y) (not (lt? 10 x y)))
  25. (error 'ladder "out of bounds"))
  26. (let loop ((lo 0) (hi (- (length left) 1)))
  27. (let ((mid (quotient (+ lo hi) 2)))
  28. (cond ((= (- hi lo) 1) (values lo hi))
  29. ((lt? mid x y) (loop lo mid))
  30. (else (loop mid hi))))))
  31.  
  32. (call-with-values
  33. (lambda () (ladder 0.5 50))
  34. (lambda (lo hi)
  35. (display lo) (newline)
  36. (display hi) (newline)))
  37.  
  38. (call-with-values
  39. (lambda () (ladder 0.25 25))
  40. (lambda (lo hi)
  41. (display lo) (newline)
  42. (display hi) (newline)))
Success #stdin #stdout 0.01s 42848KB
stdin
Standard input is empty
stdout
(0 2 10 6 7 -1 -11 0 -7 11 0)
(0 1 4 9 16 25 36 49 64 81 100)
#f
#t
7
8
5
6