fork download
  1. (defun гласная? (char)
  2. "Проверяет, является ли символ гласной буквой."
  3. (member char '(#\а #\у #\о #\ы #\и #\э #\я #\ю #\ё #\е) :test #'char-equal))
  4.  
  5. (defun согласная? (char)
  6. "Проверяет, является ли символ согласной буквой."
  7. (and (graphic-char-p char)
  8. (not (гласная? char))))
  9.  
  10. (defun дели-слово (слово)
  11. "Преобразует слово в список его букв."
  12. (coerce (string слово) 'list))
  13.  
  14. (defun дели-слово-рекурсия (начало конец)
  15. "Делит слово на две части (рекурсивно)."
  16. (cond
  17. ((null конец) (list начало nil)) ; Список букв закончился
  18. ((гласная? (first конец)) (list (append начало (list (first конец))) (rest конец))) ; Если гласная, то это конец слога
  19. ((согласная? (first конец)) ; Если первый символ - согласная
  20. (if (null (rest конец)) ; Если это последний символ, тоже завершаем слог
  21. (list (append начало (list (first конец))) nil)
  22. (дели-слово-рекурсия (append начало (list (first конец))) (rest конец))))
  23. (t (list начало конец)))) ; Символ не гласная и не согласная
  24.  
  25. (defun раздели-слово (слово)
  26. "Основная функция разделения слова."
  27. (let ((буквы (дели-слово слово)))
  28. (дели-слово-рекурсия '() буквы)))
  29.  
  30. (defun первый-слог (слово)
  31. "Возвращает первый слог слова."
  32. (let ((результат (раздели-слово слово)))
  33. (when (first результат)
  34. (coerce (first результат) 'string))))
  35.  
  36. (defun остаток-слова (слово)
  37. "Возвращает часть слова, идущую после первого слога."
  38. (let ((результат (раздели-слово слово)))
  39. (if (second результат)
  40. (coerce (second результат) 'string)
  41. "")))
  42.  
  43. (defun сплетник-слово (слово ключевое-слово)
  44. "Переводит одно слово на 'язык сплетника'."
  45. (let ((слог-слова (первый-слог слово))
  46. (слог-ключа (первый-слог ключевое-слово))
  47. (остаток-слова (остаток-слова слово))
  48. (остаток-ключа (остаток-слова ключевое-слово)))
  49. (list (concatenate 'string (if слог-ключа слог-ключа "") остаток-слова)
  50. (concatenate 'string (if слог-слова слог-слова "") остаток-ключа))))
  51.  
  52. (defun safe-string (arg)
  53. "Преобразует символ или число в строку, или возвращает строку без изменений."
  54. (cond ((stringp arg) arg)
  55. ((symbolp arg) (symbol-name arg))
  56. ((numberp arg) (write-to-string arg))
  57. (t "")))
  58.  
  59. (defun сплетник-предложение-safe (предложение ключевое-слово)
  60. "Безопасная версия для разнородных списков и отсутствия слов."
  61. (let ((ключевое-слово-str (safe-string ключевое-слово)))
  62. (mapcar #'(lambda (слово)
  63. (if (stringp слово) ; Проверяем, что слово - строка
  64. (сплетник-слово слово ключевое-слово-str)
  65. (list слово ключевое-слово-str))) ; Если не строка, просто возвращаем пару
  66. предложение)))
  67.  
  68.  
  69. (defun сплетник-предложение (предложение ключевое-слово)
  70. "Переводит предложение на 'язык сплетника'."
  71. (mapcar #'(lambda (слово) (сплетник-слово слово ключевое-слово)) предложение))
  72.  
  73.  
  74. ;; Examples:
  75. (let ((предложение '("слово" "переводится" "" 123 :символ nil "на" "язык" "сплетника"))
  76. (ключевое-слово "сплетня"))
  77. (format t "Исходное предложение: ~A~%" предложение)
  78. (format t "Ключевое слово: ~A~%" ключевое-слово)
  79. (format t "Предложение на языке сплетника: ~A~%" (сплетник-предложение-safe предложение ключевое-слово)))
  80.  
  81. (let ((предложение '("мгла" "переводится" "на" "язык" "сплетника"))
  82. (ключевое-слово "сплетня"))
  83. (format t "Исходное предложение: ~A~%" предложение)
  84. (format t "Ключевое слово: ~A~%" ключевое-слово)
  85. (format t "Предложение на языке сплетника: ~A~%" (сплетник-предложение предложение ключевое-слово)))
  86.  
  87. (let ((предложение '("написать" "программу" "обработки" "текста"))
  88. (ключевое-слово "сплетня"))
  89. (format t "Исходное предложение: ~A~%" предложение)
  90. (format t "Ключевое слово: ~A~%" ключевое-слово)
  91. (format t "Предложение на языке сплетника: ~A~%" (сплетник-предложение предложение ключевое-слово)))
  92.  
  93. (let ((предложение '("отговорила" "роща" "золотая"))
  94. (ключевое-слово "кумир"))
  95. (format t "Исходное предложение: ~A~%" предложение)
  96. (format t "Ключевое слово: ~A~%" ключевое-слово)
  97. (format t "Предложение на языке сплетника: ~A~%" (сплетник-предложение предложение ключевое-слово)))
Success #stdin #stdout #stderr 0.02s 9568KB
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
  0x14c3b9200000 - 0x14c3b94e4fff
  0x14c3b9615000 - 0x14c3b9639fff
  0x14c3b963a000 - 0x14c3b97acfff
  0x14c3b97ad000 - 0x14c3b97f5fff
  0x14c3b97f6000 - 0x14c3b97f8fff
  0x14c3b97f9000 - 0x14c3b97fbfff
  0x14c3b97fc000 - 0x14c3b97fffff
  0x14c3b9800000 - 0x14c3b9802fff
  0x14c3b9803000 - 0x14c3b9a01fff
  0x14c3b9a02000 - 0x14c3b9a02fff
  0x14c3b9a03000 - 0x14c3b9a03fff
  0x14c3b9a80000 - 0x14c3b9a8ffff
  0x14c3b9a90000 - 0x14c3b9ac3fff
  0x14c3b9ac4000 - 0x14c3b9bfafff
  0x14c3b9bfb000 - 0x14c3b9bfbfff
  0x14c3b9bfc000 - 0x14c3b9bfefff
  0x14c3b9bff000 - 0x14c3b9bfffff
  0x14c3b9c00000 - 0x14c3b9c03fff
  0x14c3b9c04000 - 0x14c3b9e03fff
  0x14c3b9e04000 - 0x14c3b9e04fff
  0x14c3b9e05000 - 0x14c3b9e05fff
  0x14c3b9e2a000 - 0x14c3b9e2dfff
  0x14c3b9e2e000 - 0x14c3b9e2efff
  0x14c3b9e2f000 - 0x14c3b9e30fff
  0x14c3b9e31000 - 0x14c3b9e31fff
  0x14c3b9e32000 - 0x14c3b9e32fff
  0x14c3b9e33000 - 0x14c3b9e33fff
  0x14c3b9e34000 - 0x14c3b9e41fff
  0x14c3b9e42000 - 0x14c3b9e4ffff
  0x14c3b9e50000 - 0x14c3b9e5cfff
  0x14c3b9e5d000 - 0x14c3b9e60fff
  0x14c3b9e61000 - 0x14c3b9e61fff
  0x14c3b9e62000 - 0x14c3b9e62fff
  0x14c3b9e63000 - 0x14c3b9e68fff
  0x14c3b9e69000 - 0x14c3b9e6afff
  0x14c3b9e6b000 - 0x14c3b9e6bfff
  0x14c3b9e6c000 - 0x14c3b9e6cfff
  0x14c3b9e6d000 - 0x14c3b9e6dfff
  0x14c3b9e6e000 - 0x14c3b9e9bfff
  0x14c3b9e9c000 - 0x14c3b9eaafff
  0x14c3b9eab000 - 0x14c3b9f50fff
  0x14c3b9f51000 - 0x14c3b9fe7fff
  0x14c3b9fe8000 - 0x14c3b9fe8fff
  0x14c3b9fe9000 - 0x14c3b9fe9fff
  0x14c3b9fea000 - 0x14c3b9ffdfff
  0x14c3b9ffe000 - 0x14c3ba025fff
  0x14c3ba026000 - 0x14c3ba02ffff
  0x14c3ba030000 - 0x14c3ba031fff
  0x14c3ba032000 - 0x14c3ba037fff
  0x14c3ba038000 - 0x14c3ba03afff
  0x14c3ba03d000 - 0x14c3ba03dfff
  0x14c3ba03e000 - 0x14c3ba03efff
  0x14c3ba03f000 - 0x14c3ba03ffff
  0x14c3ba040000 - 0x14c3ba040fff
  0x14c3ba041000 - 0x14c3ba041fff
  0x14c3ba042000 - 0x14c3ba048fff
  0x14c3ba049000 - 0x14c3ba04bfff
  0x14c3ba04c000 - 0x14c3ba04cfff
  0x14c3ba04d000 - 0x14c3ba06dfff
  0x14c3ba06e000 - 0x14c3ba075fff
  0x14c3ba076000 - 0x14c3ba076fff
  0x14c3ba077000 - 0x14c3ba077fff
  0x14c3ba078000 - 0x14c3ba078fff
  0x55b56779e000 - 0x55b56788efff
  0x55b56788f000 - 0x55b567998fff
  0x55b567999000 - 0x55b5679f8fff
  0x55b5679fa000 - 0x55b567a28fff
  0x55b567a29000 - 0x55b567a59fff
  0x55b567a5a000 - 0x55b567a5dfff
  0x55b568afe000 - 0x55b568b1efff
  0x7fff105aa000 - 0x7fff105cafff
  0x7fff105de000 - 0x7fff105e1fff
  0x7fff105e2000 - 0x7fff105e3fff