estimator.lisp (899 bytes)
1 (defpackage :est 2 (:use :cl :utils)) 3 (defun est (fn larger? bigger smaller &optional (guess 1)) 4 (let ((r (funcall fn guess))) 5 (cond ((funcall larger? r) (est fn larger? bigger smaller (funcall bigger guess))) 6 ((not (funcall larger? r)) (est fn larger? bigger smaller (funcall smaller guess))) 7 (t guess)))) 8 (defun est-num (fn larger?) 9 (est fn 10 Larger? 11 (lambda (g) (* g (1+ (random 1.0)))) 12 (lambda (g) (* g (random 1.0))) 13 1)) 14 (defun final (str) 15 (aref str (1- (length str)))) 16 (defun zero (str) 17 (char str 0)) 18 (let ((count 0) 19 (acc nil)) 20 (est #'identity #'(lambda (x) 21 (incf count) 22 (push x acc) 23 (if (< 1000 count) (error "~A x: ~A" acc x)) 24 (handler-case (code-char x) 25 (type-error nil nil))) 26 #'(lambda (x) (ceiling (* x (+ (/ 3 2) (random 1.0))))) 27 #'(lambda (x) (ceiling (* x (random 1.0))))) 1000.0)