Имея два кувшина емкостью 3 и 5 л, отмерить 1 л - Lisp

Узнай цену своей работы

Формулировка задачи:

нужно написать код такого вот задания. есть два кувшина 3 и 5 литров.пусть они будут х и у,нужно получить z удовлетворяющее условию z<max{x,y}

Решение задачи: «Имея два кувшина емкостью 3 и 5 л, отмерить 1 л»

textual
Листинг программы
  1. (setq *stack* '((0 0)))
  2. (setq *check* nil)
  3. (setq *oplist* '(1B 1S 2B 2S 3B 3S))
  4.  
  5. ;; 1 налить из внешнего источника
  6. ;; 2 перелить в другой сосуд
  7. ;; 3 вылить
  8.  
  9. (defun oper (stat op)
  10.   (let* ((B (car  stat))
  11.          (M (cadr stat))
  12.          (R (cond ((EQ op '1B) (if (< B 5) (list 5 M) nil))  
  13.                   ((EQ op '1S) (if (< M 3) (list B 3) nil))
  14.                   ((EQ op '2B) (if (AND (< M 3) (> B 0))
  15.                                    (if (<= (+ M B) 3) (list 0 (+ M B)) (list (+ M B -3) 3)) nil))  
  16.                   ((EQ op '2S) (if (AND (> M 0) (< B 5))
  17.                                    (if (<= (+ M B) 5) (list (+ M B) 0) (list 5 (+ M B -5))) nil))
  18.                   ((EQ op '3B) (if (> B 0) (list 0 M) nil))
  19.                   ((EQ op '3S) (if (> M 0) (list B 0) nil)))))
  20.           (cond ((null r) nil)
  21.                 ((equal r '(0 0)) nil)
  22.                 ((equal r '(5 3)) nil)
  23.                 (t r))))
  24.    
  25.  
  26. (defun check-stat (stat)
  27.    (OR (= 1 (car stat)) (= 1 (cadr stat))))    
  28.  
  29. (defun print-op (iop)
  30.    (cond
  31.         ((EQ '1B iop) (prints "Налить большой"))
  32.         ((EQ '1S iop) (prints "Налить малый"))
  33.         ((EQ '2B iop) (prints "Перелить из большого в малый"))
  34.         ((EQ '2S iop) (prints "Перелить из малого в большой"))
  35.         ((EQ '3B iop) (prints "Вылить из большого"))
  36.         ((EQ '3S iop) (prints "Вылить из малого"))
  37.    )
  38. )
  39.  
  40. (defun task ()
  41.    (cond ((null *stack*) 'OK)
  42.          (t
  43.            (let ((stat (car *stack*)) (resop nil))
  44.                 (dolist (iop *oplist* t)
  45.                      (when (setq resop (oper stat iop))
  46.                            (when (not (member resop *check*))
  47.                                  (setq *stack* (cons resop *stack*))
  48.                                  (setq *check* (cons resop *check*))
  49.                                  (print iop) (prints " ") (print-op iop) (prints " ") (printline resop)
  50.                                  (when (check-stat resop) (stop*))
  51.                                  (task)
  52.                                  (setq *stack* (remove resop *stack*))
  53.                            )
  54.                      )
  55.                  )
  56.   ))))
  57.  
  58. ;; Запуск
  59.  
  60. (task)
  61.  
  62. 1B Налить большой (5 0)
  63. 2B Перелить из большого в малый (2 3)
  64. 3B Вылить из большого (0 3)
  65. 2S Перелить из малого в большой (3 0)
  66. 1S Налить малый (3 3)
  67. 2S Перелить из малого в большой (5 1)
  68.  
  69. ==> STOPSTATE

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


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

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

9   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы