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