Имея два кувшина емкостью 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д