Имея два кувшина емкостью 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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4 из 5
Похожие ответы