Работа с текстом в Лисп - Lisp (229424)
Формулировка задачи:
Здравствуйте!
Помогите пожалуйста!
Запрограммировать на языке Коммон Лисп функцию, которая принимает на вход текст и возвращает два значения: длину самого длинного слова, состоящего только из цифр и само это слово.
Если таких слов несколько, функция должна вернуть последнее из них.
Решение задачи: «Работа с текстом в Лисп»
textual
Листинг программы
(defun split (s &optional (c #\Space) &aux ac (m (make-string-output-stream))) (loop for a across s if (char= a c) do (push (get-output-stream-string m) ac) else do (write-char a m)) (push (get-output-stream-string m) ac) (nreverse ac)) (defun max-length (w &aux (m (loop for a in w when (all-digit-p a) maximize (length a)))) (when (and m (plusp m)) (list m (find-if #'(lambda (a) (and (all-digit-p a) (= (length a) m))) w :from-end t)))) (defun all-digit-p (s) (loop for c across s always (digit-char-p c))) (defun max-length-number (s) (max-length (split s))) > (max-length-number "aa 333 bb 555 77") (3 "555") > (max-length-number "77") (2 "77") > (max-length-number "aa") NIL > (max-length-number "") NIL
Объяснение кода листинга программы
- В функции
split
разделяем строкуs
на отдельные символы, используя пробел в качестве разделителя. - Создаем пустой список
ac
, который будет содержать результаты разделения. - Создаем строку-выходной поток
m
, используемую для накопления результатов разделения. - Проходим по каждому символу в
s
. - Если текущий символ равен пробелу, то добавляем текущий символ в начало списка
ac
. - Если текущий символ не является пробелом, то записываем его в
m
. - После завершения цикла, добавляем последнюю часть
m
в начало спискаac
. - Возвращаем список
ac
, отсортированный в обратном порядке. - В функции
max-length
ищем максимальную длину числа в строкеw
. - Создаем пустой список
m
, который будет содержать максимальную длину числа. - Проходим по каждому символу в
w
. - Если текущий символ является числом, то увеличиваем значение
m
, если оно меньше текущего значения длины числа. - Если
m
больше нуля, то возвращаемm
и число, длина которого соответствуетm
. - Если
m
равно нулю, то возвращаемnil
. - В функции
all-digit-p
проверяем, состоит ли строкаs
только из цифр. - Создаем пустой список
m
, который будет содержать значениеt
(истина), если строкаs
состоит только из цифр. - Проходим по каждому символу в
s
. - Если текущий символ является цифрой, то добавляем
t
в начало спискаm
. - Возвращаем значение
m
. - В функции
max-length-number
вызываем функциюmax-length
с аргументомsplit s
, гдеs
- это строка, которую нужно разделить. - Возвращаем результат функции
max-length
. Пример использования: > (max-length-number
aa 333 bb 555 77)
- Вернет(3
555)
Здесь функцияmax-length-number
разделяет строкуaa 333 bb 555 77
на отдельные символы и находит максимальную длину числа, равную 3, соответствующую числу555
.> (max-length-number
77)
- Вернет(2
77)
Здесь функцияmax-length-number
разделяет строку77
на отдельные символы и находит максимальную длину числа, равную 2, соответствующую числу77
.> (max-length-number
aa)
- Вернетnil
Здесь функцияmax-length-number
разделяет строкуaa
на отдельные символы и не находит чисел, поэтому возвращаетnil
.> (max-length-number ``)
- Вернетnil
Здесь функцияmax-length-number
разделяет пустую строку на отдельные символы и не находит чисел, поэтому возвращаетnil
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д