(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 "~%")))
ytakenaka
#6305()
[
Common Lisp
]
Rating0/0=0.00
(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 "~%")))Rating0/0=0.00-0+
[ reply ]