Работа с текстом в Лисп - Lisp (229424)

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

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

Здравствуйте! Помогите пожалуйста! Запрограммировать на языке Коммон Лисп функцию, которая принимает на вход текст и возвращает два значения: длину самого длинного слова, состоящего только из цифр и само это слово. Если таких слов несколько, функция должна вернуть последнее из них.

Решение задачи: «Работа с текстом в Лисп»

textual
Листинг программы
  1. (defun split (s &optional (c #\Space)
  2.               &aux ac (m (make-string-output-stream)))
  3.   (loop for a across s
  4.         if (char= a c) do
  5.         (push (get-output-stream-string m) ac)
  6.         else do (write-char a m))
  7.   (push (get-output-stream-string m) ac)
  8.   (nreverse ac))
  9.  
  10. (defun max-length (w
  11.                    &aux
  12.                    (m (loop for a in w
  13.                             when (all-digit-p a) maximize
  14.                             (length a))))
  15.   (when (and m (plusp m)) (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. В функции split разделяем строку s на отдельные символы, используя пробел в качестве разделителя.
  2. Создаем пустой список ac, который будет содержать результаты разделения.
  3. Создаем строку-выходной поток m, используемую для накопления результатов разделения.
  4. Проходим по каждому символу в s.
  5. Если текущий символ равен пробелу, то добавляем текущий символ в начало списка ac.
  6. Если текущий символ не является пробелом, то записываем его в m.
  7. После завершения цикла, добавляем последнюю часть m в начало списка ac.
  8. Возвращаем список ac, отсортированный в обратном порядке.
  9. В функции max-length ищем максимальную длину числа в строке w.
  10. Создаем пустой список m, который будет содержать максимальную длину числа.
  11. Проходим по каждому символу в w.
  12. Если текущий символ является числом, то увеличиваем значение m, если оно меньше текущего значения длины числа.
  13. Если m больше нуля, то возвращаем m и число, длина которого соответствует m.
  14. Если m равно нулю, то возвращаем nil.
  15. В функции all-digit-p проверяем, состоит ли строка s только из цифр.
  16. Создаем пустой список m, который будет содержать значение t (истина), если строка s состоит только из цифр.
  17. Проходим по каждому символу в s.
  18. Если текущий символ является цифрой, то добавляем t в начало списка m.
  19. Возвращаем значение m.
  20. В функции max-length-number вызываем функцию max-length с аргументом split s, где s - это строка, которую нужно разделить.
  21. Возвращаем результат функции max-length. Пример использования:
  22. > (max-length-numberaa 333 bb 555 77) - Вернет (3555) Здесь функция max-length-number разделяет строку aa 333 bb 555 77 на отдельные символы и находит максимальную длину числа, равную 3, соответствующую числу 555.
  23. > (max-length-number77) - Вернет (277) Здесь функция max-length-number разделяет строку 77 на отдельные символы и находит максимальную длину числа, равную 2, соответствующую числу 77.
  24. > (max-length-numberaa) - Вернет nil Здесь функция max-length-number разделяет строку aa на отдельные символы и не находит чисел, поэтому возвращает nil.
  25. > (max-length-number ``) - Вернет nil Здесь функция max-length-number разделяет пустую строку на отдельные символы и не находит чисел, поэтому возвращает nil.

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


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

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

9   голосов , оценка 4 из 5

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

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

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