Изменить порядок букв в каждом слове файла на противоположный - Lisp

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

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

Помогите, пожалуйста, написать программку на лиспе для решения след задания: "В данном текстовом файле изменить порядок букв в каждом слове на противоположный". например: "абв гд ежз" -> "вба дг зже"

Решение задачи: «Изменить порядок букв в каждом слове файла на противоположный»

textual
Листинг программы
(defun nfoo (string)
  (prog (word-start word-end (i 0))
    find-word-start
      (when (>= i (length string)) (go end))
      (when (alpha-char-p (aref string i))
        (go set-word-start))
      (incf i)
      (go find-word-start)
    set-word-start
      (setf word-start i)
      (go word-start-set)
    word-start-set
      (go find-word-end)
    find-word-end
      (when (or (= (1+ i) (length string))
                (not (alpha-char-p (aref string (1+ i)))))
        (go set-word-end))
      (incf i)
      (go find-word-end)
    set-word-end
      (setf word-end i)
      (go word-end-set)
    word-end-set
      (incf i 2)
      (go reverse-word)
    reverse-word
      (when (>= word-start word-end) (go word-reversed))
      (rotatef (aref string word-start) (aref string word-end))
      (incf word-start)
      (decf word-end)
      (go reverse-word)
    word-reversed
      (go find-word-start)
    end
      (return string)))
 
(defun foo (string)
  (nfoo (copy-seq string)))

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

В полном объёме данный код реализовать задачу не сможет, так как в нём не учтена смена порядка букв в каждом слове файла на противоположный. Однако, можно усмотреть некоторые попытки реализации этой задачи в функциях nfoo и foo. Рассмотрим их по порядку:

  1. Функция nfoo пытается найти все слова в строке и изменить их порядок на противоположный. Однако, в данном коде реализован только алгоритм поиска слов в строке, но не их перестановка.
  2. Функция foo является оберткой функции nfoo, она вызывает nfoo на копии строки. То есть, если в исходной строке было несколько слов, то после вызова функции foo каждое слово будет изменено на обратное, но все слова будут идти в том же порядке, что и в исходной строке. Таким образом, данный код не является полным решением поставленной задачи.

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

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