LISP, нахождение самого длинного слова
Формулировка задачи:
Доброго времени суток!
Такой вопрос: нужно запрограммировать функцию, которая принимает на вход текст и возвращает длину самого длинного слова, состоящего из цифр и само это слово, если таковых несколько, то вернуть последнее.
Есть программа, которая выполняет данную задачу:
Однако она работает только, если ей на вход подаётся список, т.е.:
если: (max-length-number '(aaa bbb 55 42)), то всё верно (ответ: 2, 42)
если: (max-length-number '("aaa bbb 55 42")), то выдаёт (0, NIL) вместо 2, 42.
Подскажите пожалуйста как можно исправить, чтобы данная программа работала с текстом.
Листинг программы
- (defun max-length-number (w
- &aux
- (m (loop for a in w
- when (numberp a) maximize
- (length (write-to-string a)))))
- (when m (list m (find-if
- #'(lambda (a)
- (and (numberp a)
- (= (length (write-to-string a))
- m)))
- w :from-end t)))
- )
Решение задачи: «LISP, нахождение самого длинного слова»
textual
Листинг программы
- (defun split (s &aux ac (m (make-string-output-stream)))
- (loop for a across s
- if (or (char= a #\Space)
- (char= a #\Tab)
- (char= a #\Newline)) 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
Объяснение кода листинга программы
- Находим самое длинное число в строке, состоящее только из цифр.
- В этой функции используется функция
all-digit-p
, которая проверяет, состоит ли символ из цифр. - Функция
max-length
возвращает наибольшую длину числа из списка чисел. - В этой функции используется функция
find-if
, которая ищет первый элемент, удовлетворяющий заданному условию. - В функции
all-digit-p
используется циклloop
для проверки каждого символа строки. - Функция
digit-char-p
проверяет, является ли символ цифрой. - Функция
max-length-number
вызывает функциюmax-length
для списка чисел, полученных с помощью функцииsplit
. - В функции
split
используется циклloop
для перебора каждого символа строки. - Если символ является пробелом, табуляцией или переводом строки, он добавляется в список.
- В конце функция
split
добавляет в список строку, полученную из выходного потока. - Функция
get-output-stream-string
получает строку из выходного потока. - Функция
push
добавляет новый элемент в конец списка. - Функция
nreverse
изменяет порядок элементов в списке, чтобы самые длинные числа были в начале. - Функция
loop
используется для перебора каждого числа в списке. - Если число является строкой, состоящей только из цифр, функция
length
находит его длину. - Функция
max-length
возвращает наибольшую длину числа из списка чисел. - Если наибольшая длина не равна нулю, функция
find-if
ищет первое число, длина которого равна максимальной длине. - Функция
list
создает новый список из найденного числа и его длины. - Функция
split
вызывается для разделения строки на список чисел. - Функция
max-length-number
вызывается для нахождения самого длинного числа в строке.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д