fork download
  1. (defun гласная? (char)
  2. "Проверяет, является ли символ гласной буквой."
  3. (member char '(#\а #\у #\о #\ы #\и #\э #\я #\ю #\ё #\е) :test #'char-equal))
  4.  
  5. (defun согласная? (char)
  6. "Проверяет, является ли символ согласной буквой."
  7. (and (graphic-char-p char) ; Check if it's a printable character
  8. (not (гласная? char))))
  9.  
  10. (defun дели-слово (слово)
  11. "Преобразует слово в список его букв."
  12. (coerce (string слово) 'list))
  13.  
  14. (defun дели-слово-рекурсия (начало конец)
  15. "Делит слово на две части (рекурсивно)."
  16. (cond
  17. ((null конец) (list начало nil)) ; List of letters ended
  18. ((согласная? (first конец)) ; If the first character is a consonant
  19. (дели-слово-рекурсия (append начало (list (first конец))) (rest конец))) ; Add the consonant to the beginning
  20. (t (list начало конец)))) ; Otherwise (vowel or end of list) - return beginning and end
  21.  
  22. (defun раздели-слово (слово)
  23. "Основная функция разделения слова."
  24. (let ((буквы (дели-слово слово)))
  25. (дели-слово-рекурсия '() буквы)))
  26.  
  27. (defun первый-слог (слово)
  28. "Возвращает первый слог слова."
  29. (let ((результат (раздели-слово слово)))
  30. (when (first результат)
  31. (coerce (first результат) 'string))))
  32.  
  33. (defun остаток-слова (слово)
  34. "Возвращает часть слова, идущую после первого слога."
  35. (let ((результат (раздели-слово слово)))
  36. (if (second результат)
  37. (coerce (second результат) 'string)
  38. "")))
  39.  
  40. (defun сплетник-слово (слово ключевое-слово)
  41. "Переводит одно слово на 'язык сплетника'."
  42. (let ((слог-слова (первый-слог слово))
  43. (слог-ключа (первый-слог ключевое-слово))
  44. (остаток-слова (остаток-слова слово))
  45. (остаток-ключа (остаток-слова ключевое-слово)))
  46. (list (concatenate 'string (if слог-ключа слог-ключа "") остаток-слова)
  47. (concatenate 'string (if слог-слова слог-слова "") остаток-ключа))))
  48.  
  49. (defun safe-string (arg)
  50. "Преобразует символ или число в строку, или возвращает строку без изменений."
  51. (cond ((stringp arg) arg)
  52. ((symbolp arg) (symbol-name arg))
  53. ((numberp arg) (write-to-string arg))
  54. (t "")))
  55.  
  56. (defun сплетник-предложение-safe (предложение ключевое-слово)
  57. "Безопасная версия для разнородных списков и отсутствия слов."
  58. (let ((ключевое-слово-str (safe-string ключевое-слово)))
  59. (mapcar #'(lambda (слово)
  60. (if (stringp слово) ; Проверяем, что слово - строка
  61. (сплетник-слово слово ключевое-слово-str)
  62. (list слово ключевое-слово-str))) ; Если не строка, просто возвращаем пару
  63. предложение)))
  64.  
  65.  
  66. (defun сплетник-предложение (предложение ключевое-слово)
  67. "Переводит предложение на 'язык сплетника'."
  68. (mapcar #'(lambda (слово) (сплетник-слово слово ключевое-слово)) предложение))
  69.  
  70. ;; Examples:
  71. (let ((предложение '("слово" "переводится" "" 123 :символ nil "на" "язык" "сплетника"))
  72. (ключевое-слово "сплетня"))
  73. (format t "Исходное предложение: ~A~%" предложение)
  74. (format t "Ключевое слово: ~A~%" ключевое-слово)
  75. (format t "Предложение на языке сплетника: ~A~%" (сплетник-предложение-safe предложение ключевое-слово)))
  76.  
  77. (let ((предложение '("мгла" "переводится" "на" "язык" "сплетника"))
  78. (ключевое-слово "сплетня"))
  79. (format t "Исходное предложение: ~A~%" предложение)
  80. (format t "Ключевое слово: ~A~%" ключевое-слово)
  81. (format t "Предложение на языке сплетника: ~A~%" (сплетник-предложение предложение ключевое-слово)))
  82.  
  83. (let ((предложение '("надкусить ломтик колбасы"))
  84. (ключевое-слово "сплетня"))
  85. (format t "Исходное предложение: ~A~%" предложение)
  86. (format t "Ключевое слово: ~A~%" ключевое-слово)
  87. (format t "Предложение на языке сплетника: ~A~%" (сплетник-предложение предложение ключевое-слово)))
  88.  
  89. (let ((предложение '("написать" "программу" "обработки" "текста"))
  90. (ключевое-слово "сплетня"))
  91. (format t "Исходное предложение: ~A~%" предложение)
  92. (format t "Ключевое слово: ~A~%" ключевое-слово)
  93. (format t "Предложение на языке сплетника: ~A~%" (сплетник-предложение предложение ключевое-слово)))
  94.  
  95. (let ((предложение '("отговорила" "роща" "золотая"))
  96. (ключевое-слово "кумир"))
  97. (format t "Исходное предложение: ~A~%" предложение)
  98. (format t "Ключевое слово: ~A~%" ключевое-слово)
  99. (format t "Предложение на языке сплетника: ~A~%" (сплетник-предложение предложение ключевое-слово)))
Success #stdin #stdout #stderr 0.02s 9704KB
stdin
Standard input is empty
stdout
Исходное предложение: (слово переводится  123 СИМВОЛ NIL на язык сплетника)
Ключевое слово: сплетня
Предложение на языке сплетника: 
((сплово слетня) (сплереводится петня) (спл етня) (123 сплетня)
 (СИМВОЛ сплетня) (NIL сплетня) (спла нетня) (сплязык етня)
 (сплетника сплетня))
Исходное предложение: (мгла переводится на язык сплетника)
Ключевое слово: сплетня
Предложение на языке сплетника: 
((спла мглетня) (сплереводится петня) (спла нетня) (сплязык етня)
 (сплетника сплетня))
Исходное предложение: (надкусить ломтик колбасы)
Ключевое слово: сплетня
Предложение на языке сплетника: ((спладкусить ломтик колбасы нетня))
Исходное предложение: (написать программу обработки текста)
Ключевое слово: сплетня
Предложение на языке сплетника: ((сплаписать нетня) (сплограмму претня) (сплобработки етня) (сплекста тетня))
Исходное предложение: (отговорила роща золотая)
Ключевое слово: кумир
Предложение на языке сплетника: ((котговорила умир) (коща румир) (колотая зумир))
stderr
Warning: reserving address range 0x80000c0000...0x1fffffffffff that contains memory mappings. clisp might crash later!
Memory dump:
  0x8000000000 - 0x80000bffff
  0x145e67e00000 - 0x145e680e4fff
  0x145e68215000 - 0x145e68239fff
  0x145e6823a000 - 0x145e683acfff
  0x145e683ad000 - 0x145e683f5fff
  0x145e683f6000 - 0x145e683f8fff
  0x145e683f9000 - 0x145e683fbfff
  0x145e683fc000 - 0x145e683fffff
  0x145e68400000 - 0x145e68402fff
  0x145e68403000 - 0x145e68601fff
  0x145e68602000 - 0x145e68602fff
  0x145e68603000 - 0x145e68603fff
  0x145e68680000 - 0x145e6868ffff
  0x145e68690000 - 0x145e686c3fff
  0x145e686c4000 - 0x145e687fafff
  0x145e687fb000 - 0x145e687fbfff
  0x145e687fc000 - 0x145e687fefff
  0x145e687ff000 - 0x145e687fffff
  0x145e68800000 - 0x145e68803fff
  0x145e68804000 - 0x145e68a03fff
  0x145e68a04000 - 0x145e68a04fff
  0x145e68a05000 - 0x145e68a05fff
  0x145e68a20000 - 0x145e68a23fff
  0x145e68a24000 - 0x145e68a24fff
  0x145e68a25000 - 0x145e68a26fff
  0x145e68a27000 - 0x145e68a27fff
  0x145e68a28000 - 0x145e68a28fff
  0x145e68a29000 - 0x145e68a29fff
  0x145e68a2a000 - 0x145e68a37fff
  0x145e68a38000 - 0x145e68a45fff
  0x145e68a46000 - 0x145e68a52fff
  0x145e68a53000 - 0x145e68a56fff
  0x145e68a57000 - 0x145e68a57fff
  0x145e68a58000 - 0x145e68a58fff
  0x145e68a59000 - 0x145e68a5efff
  0x145e68a5f000 - 0x145e68a60fff
  0x145e68a61000 - 0x145e68a61fff
  0x145e68a62000 - 0x145e68a62fff
  0x145e68a63000 - 0x145e68a63fff
  0x145e68a64000 - 0x145e68a91fff
  0x145e68a92000 - 0x145e68aa0fff
  0x145e68aa1000 - 0x145e68b46fff
  0x145e68b47000 - 0x145e68bddfff
  0x145e68bde000 - 0x145e68bdefff
  0x145e68bdf000 - 0x145e68bdffff
  0x145e68be0000 - 0x145e68bf3fff
  0x145e68bf4000 - 0x145e68c1bfff
  0x145e68c1c000 - 0x145e68c25fff
  0x145e68c26000 - 0x145e68c27fff
  0x145e68c28000 - 0x145e68c2dfff
  0x145e68c2e000 - 0x145e68c30fff
  0x145e68c33000 - 0x145e68c33fff
  0x145e68c34000 - 0x145e68c34fff
  0x145e68c35000 - 0x145e68c35fff
  0x145e68c36000 - 0x145e68c36fff
  0x145e68c37000 - 0x145e68c37fff
  0x145e68c38000 - 0x145e68c3efff
  0x145e68c3f000 - 0x145e68c41fff
  0x145e68c42000 - 0x145e68c42fff
  0x145e68c43000 - 0x145e68c63fff
  0x145e68c64000 - 0x145e68c6bfff
  0x145e68c6c000 - 0x145e68c6cfff
  0x145e68c6d000 - 0x145e68c6dfff
  0x145e68c6e000 - 0x145e68c6efff
  0x556db3aa7000 - 0x556db3b97fff
  0x556db3b98000 - 0x556db3ca1fff
  0x556db3ca2000 - 0x556db3d01fff
  0x556db3d03000 - 0x556db3d31fff
  0x556db3d32000 - 0x556db3d62fff
  0x556db3d63000 - 0x556db3d66fff
  0x556db59fe000 - 0x556db5a1efff
  0x7fffd0ad6000 - 0x7fffd0af6fff
  0x7fffd0b0c000 - 0x7fffd0b0ffff
  0x7fffd0b10000 - 0x7fffd0b11fff