Написать функцию с двумя переменными. Первая - собственно, шаблон, вторая - строка для проверки соответствия - Lisp

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

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

Задание: сопоставление введенного шаблона и строки Нужно написать функцию с двумя переменными. первая - собственно, шаблон, вторая - строка для проверки соответствия. Шаблон строится по следующим правилам: символ * заменят любой символ в количестве от 0 до n символ ? заменят только один любой символ количество * и ? в шаблоне неограничено Например, при введенном шаблоне L?*S**P строка LISP будет ему соответствовать Пожалуйста, если есть идеи, подскажите!

Решение задачи: «Написать функцию с двумя переменными. Первая - собственно, шаблон, вторая - строка для проверки соответствия»

textual
Листинг программы
(defun mems (s p)
  (member (car s) (cdr p) :test #'equal))
 
(defun check (p s)
  (cond ((null s) t)
        ((or (equal (car p) (car s))
             (equal (car p) "?"))
         (check (cdr p) (cdr s)))
        ((when (equal (car p) "*")
               (if (mems s p)
                   (if (equal (car s) (cadr s))
                       (check (cdr (mems s p)) (cddr s))
                       (check (cdr (mems s p)) (cdr s)))
                   (check p (cdr s)))))))
 
(defun squeeze (p &optional z)
  (when p (if (equal (car p) "*") 
              (if z
                  (squeeze (cdr p) z)
                  (cons "*" (squeeze (cdr p) t)))
              (cons (car p) (squeeze (cdr p) nil)))))
 
(defun cleave (s)
  (map 'list #'string s))
 
(defun concord (p s)
  (when (> (length s) 0) (check (squeeze (cleave p)) (cleave s))))
 
> (concord "L?*S**P" "LISP")
T
> (concord "L?*S**P" "LCISP")
T
> (concord "L?*S**P" "LISRP")
T
> (concord "L?*S**P" "LLISP")
T
> (concord "L?*S**P" "LISPP")
T
> (concord "L?*S**P" "CLISP")
NIL
> (concord "L?*S**P" "LISPC")
NIL
> (concord "L?*S**P" "")
NIL

Объяснение кода листинга программы

В этом коде представлено несколько функций для работы со строками в языке программирования, возможно, Lisp. Они выполняют следующие действия:

  1. Функция mems ищет все вхождения первого аргумента (шаблона) во втором аргументе (строке для проверки).
  2. Функция check проверяет, соответствует ли первый аргумент (шаблон) второму аргументу (строке для проверки). Если шаблон равен *, то функция рекурсивно вызывается для оставшейся части строки. Если шаблон равен ?, то функция возвращает nil. Если шаблон равен *, то функция проверяет, содержит ли строка символ ?. Если да, то функция возвращает nil. Если нет, то функция вызывается рекурсивно для оставшейся части строки. Если шаблон равен пустой строке, то функция возвращает nil.
  3. Функция squeeze удаляет все вхождения символа * из строки. Если второй аргумент (опциональный) равен nil, то возвращается исходная строка без изменений. Если второй аргумент (опциональный) не равен nil, то он добавляется в начало результата.
  4. Функция cleave разбивает строку на список символов.
  5. Функция concord проверяет, соответствует ли первый аргумент (шаблон) второму аргументу (строке для проверки). Если шаблон равен *, то функция вызывается рекурсивно для оставшейся части строки. Если шаблон равен ?, то функция возвращает nil. Если шаблон равен *, то функция проверяет, содержит ли строка символ ?. Если да, то функция возвращает nil. Если нет, то функция вызывается рекурсивно для оставшейся части строки. Если шаблон равен пустой строке, то функция возвращает nil.

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


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

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

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