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

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

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

Доброго времени суток! Такой вопрос: нужно запрограммировать функцию, которая принимает на вход текст и возвращает длину самого длинного слова, состоящего из цифр и само это слово, если таковых несколько, то вернуть последнее. Есть программа, которая выполняет данную задачу:
Листинг программы
  1. (defun max-length-number (w
  2. &aux
  3. (m (loop for a in w
  4. when (numberp a) maximize
  5. (length (write-to-string a)))))
  6. (when m (list m (find-if
  7. #'(lambda (a)
  8. (and (numberp a)
  9. (= (length (write-to-string a))
  10. m)))
  11. w :from-end t)))
  12. )
Однако она работает только, если ей на вход подаётся список, т.е.: если: (max-length-number '(aaa bbb 55 42)), то всё верно (ответ: 2, 42) если: (max-length-number '("aaa bbb 55 42")), то выдаёт (0, NIL) вместо 2, 42. Подскажите пожалуйста как можно исправить, чтобы данная программа работала с текстом.

Решение задачи: «LISP, нахождение самого длинного слова»

textual
Листинг программы
  1. (defun split (s &aux ac (m (make-string-output-stream)))
  2.   (loop for a across s
  3.         if (or (char= a #\Space)
  4.                (char= a #\Tab)
  5.                (char= a #\Newline)) do
  6.                (push (get-output-stream-string m) ac)
  7.                else do (write-char a m))
  8.   (push (get-output-stream-string m) ac)
  9.   (nreverse ac))
  10.  
  11. (defun max-length (w &aux (m (loop for a in w
  12.                                    when (all-digit-p a)
  13.                                    maximize (length a))))
  14.   (when (and m (plusp m))
  15.     (list m (find-if
  16.              #'(lambda (a)
  17.                  (and (all-digit-p a)
  18.                       (= (length a)
  19.                          m)))
  20.              w :from-end t))))
  21.  
  22. (defun all-digit-p (s)
  23.   (loop for c across s always (digit-char-p c)))
  24.  
  25. (defun max-length-number (s)
  26.   (max-length (split s)))
  27.  
  28. > (max-length-number "aa 333 bb 555 77")
  29. (3 "555")
  30. > (max-length-number "77")
  31. (2 "77")
  32. > (max-length-number "aa")
  33. NIL
  34. > (max-length-number "")
  35. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы