Работа с текстом в Лисп - 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

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

  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