Работа с текстом в Лисп - 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-numberaa 333 bb 555 77)- Вернет(3555)Здесь функцияmax-length-numberразделяет строкуaa 333 bb 555 77на отдельные символы и находит максимальную длину числа, равную 3, соответствующую числу555.> (max-length-number77)- Вернет(277)Здесь функцияmax-length-numberразделяет строку77на отдельные символы и находит максимальную длину числа, равную 2, соответствующую числу77.> (max-length-numberaa)- ВернетnilЗдесь функцияmax-length-numberразделяет строкуaaна отдельные символы и не находит чисел, поэтому возвращаетnil.> (max-length-number ``)- ВернетnilЗдесь функцияmax-length-numberразделяет пустую строку на отдельные символы и не находит чисел, поэтому возвращаетnil.