1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
(defun check (given fraction min max)
  (let ((center (floor (/ (+ min max) 2))))
    (if (or (equal center min) (equal center max))
    (/ (check-near given fraction (cons min max)) fraction)
    (if (> (* given fraction) center)
        (check given fraction center max)
        (check given fraction min center)))))

(defun check-near (given fraction list)
  (if (> (- given (/ (car list) fraction))
     (- (/ (cdr list) fraction) given))
      (cdr list)
      (car list)))

(defun rationalize-list (given)
  (let (list)
    (loop for i from 1 to 9 do
     (let ((ans (check given i 0 (* (1+ i) given))))
       (and (not (find ans list))
        (push ans list))))
    (sort list
      #'(lambda(x y)(< (abs (- x given))
               (abs (- given y)))))))

(defun print-rationalize-list (given)
  (let ((list (rationalize-list given)))
    (format t "~s => " given)
    (loop for v in list do
     (multiple-value-bind (f r) (floor v)
       (if (zerop r)
           (format t "~d/1 " v)
           (format t "~d " v))))
       (format t "~%")))