Имея два кувшина емкостью 3 и 5 л, отмерить 1 л - Lisp
Формулировка задачи:
нужно написать код такого вот задания.
есть два кувшина 3 и 5 литров.пусть они будут х и у,нужно получить z удовлетворяющее условию z<max{x,y}
Решение задачи: «Имея два кувшина емкостью 3 и 5 л, отмерить 1 л»
textual
Листинг программы
- (setq *stack* '((0 0)))
- (setq *check* nil)
- (setq *oplist* '(1B 1S 2B 2S 3B 3S))
- ;; 1 налить из внешнего источника
- ;; 2 перелить в другой сосуд
- ;; 3 вылить
- (defun oper (stat op)
- (let* ((B (car stat))
- (M (cadr stat))
- (R (cond ((EQ op '1B) (if (< B 5) (list 5 M) nil))
- ((EQ op '1S) (if (< M 3) (list B 3) nil))
- ((EQ op '2B) (if (AND (< M 3) (> B 0))
- (if (<= (+ M B) 3) (list 0 (+ M B)) (list (+ M B -3) 3)) nil))
- ((EQ op '2S) (if (AND (> M 0) (< B 5))
- (if (<= (+ M B) 5) (list (+ M B) 0) (list 5 (+ M B -5))) nil))
- ((EQ op '3B) (if (> B 0) (list 0 M) nil))
- ((EQ op '3S) (if (> M 0) (list B 0) nil)))))
- (cond ((null r) nil)
- ((equal r '(0 0)) nil)
- ((equal r '(5 3)) nil)
- (t r))))
- (defun check-stat (stat)
- (OR (= 1 (car stat)) (= 1 (cadr stat))))
- (defun print-op (iop)
- (cond
- ((EQ '1B iop) (prints "Налить большой"))
- ((EQ '1S iop) (prints "Налить малый"))
- ((EQ '2B iop) (prints "Перелить из большого в малый"))
- ((EQ '2S iop) (prints "Перелить из малого в большой"))
- ((EQ '3B iop) (prints "Вылить из большого"))
- ((EQ '3S iop) (prints "Вылить из малого"))
- )
- )
- (defun task ()
- (cond ((null *stack*) 'OK)
- (t
- (let ((stat (car *stack*)) (resop nil))
- (dolist (iop *oplist* t)
- (when (setq resop (oper stat iop))
- (when (not (member resop *check*))
- (setq *stack* (cons resop *stack*))
- (setq *check* (cons resop *check*))
- (print iop) (prints " ") (print-op iop) (prints " ") (printline resop)
- (when (check-stat resop) (stop*))
- (task)
- (setq *stack* (remove resop *stack*))
- )
- )
- )
- ))))
- ;; Запуск
- (task)
- 1B Налить большой (5 0)
- 2B Перелить из большого в малый (2 3)
- 3B Вылить из большого (0 3)
- 2S Перелить из малого в большой (3 0)
- 1S Налить малый (3 3)
- 2S Перелить из малого в большой (5 1)
- ==> STOPSTATE
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д