LISP, нахождение самого длинного слова

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

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

Доброго времени суток! Такой вопрос: нужно запрограммировать функцию, которая принимает на вход текст и возвращает длину самого длинного слова, состоящего из цифр и само это слово, если таковых несколько, то вернуть последнее. Есть программа, которая выполняет данную задачу:
(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)))
)
Однако она работает только, если ей на вход подаётся список, т.е.: если: (max-length-number '(aaa bbb 55 42)), то всё верно (ответ: 2, 42) если: (max-length-number '("aaa bbb 55 42")), то выдаёт (0, NIL) вместо 2, 42. Подскажите пожалуйста как можно исправить, чтобы данная программа работала с текстом.

Решение задачи: «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

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

  1. Находим самое длинное число в строке, состоящее только из цифр.
  2. В этой функции используется функция all-digit-p, которая проверяет, состоит ли символ из цифр.
  3. Функция max-length возвращает наибольшую длину числа из списка чисел.
  4. В этой функции используется функция find-if, которая ищет первый элемент, удовлетворяющий заданному условию.
  5. В функции all-digit-p используется цикл loop для проверки каждого символа строки.
  6. Функция digit-char-p проверяет, является ли символ цифрой.
  7. Функция max-length-number вызывает функцию max-length для списка чисел, полученных с помощью функции split.
  8. В функции split используется цикл loop для перебора каждого символа строки.
  9. Если символ является пробелом, табуляцией или переводом строки, он добавляется в список.
  10. В конце функция split добавляет в список строку, полученную из выходного потока.
  11. Функция get-output-stream-string получает строку из выходного потока.
  12. Функция push добавляет новый элемент в конец списка.
  13. Функция nreverse изменяет порядок элементов в списке, чтобы самые длинные числа были в начале.
  14. Функция loop используется для перебора каждого числа в списке.
  15. Если число является строкой, состоящей только из цифр, функция length находит его длину.
  16. Функция max-length возвращает наибольшую длину числа из списка чисел.
  17. Если наибольшая длина не равна нулю, функция find-if ищет первое число, длина которого равна максимальной длине.
  18. Функция list создает новый список из найденного числа и его длины.
  19. Функция split вызывается для разделения строки на список чисел.
  20. Функция max-length-number вызывается для нахождения самого длинного числа в строке.

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


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

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

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