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.  
  11. (defun дели-слово (слово)
  12. "Преобразует слово в список его букв."
  13. (coerce (string слово) 'list))
  14.  
  15. (defun дели-слово-рекурсия (начало конец)
  16. "Делит слово на две части (рекурсивно)."
  17. (cond
  18. ((null конец) (list начало nil)) ; Список букв закончился
  19. ((согласная? (first конец)) ; Если первый символ - согласная
  20. (дели-слово-рекурсия (append начало (list (first конец))) (rest конец))) ; Добавляем согласную в начало
  21. (t (list начало конец)))) ; Иначе (гласная или конец списка) - возвращаем начало и конец
  22.  
  23. (defun раздели-слово (слово)
  24. "Основная функция разделения слова."
  25. (let ((буквы (дели-слово слово)))
  26. (дели-слово-рекурсия '() буквы)))
  27.  
  28. (defun первый-слог (слово)
  29. "Возвращает первый слог слова."
  30. (let ((результат (раздели-слово слово)))
  31. (when (first результат)
  32. (coerce (first результат) 'string))))
  33.  
  34. (defun остаток-слова (слово)
  35. "Возвращает часть слова, идущую после первого слога."
  36. (let ((результат (раздели-слово слово)))
  37. (if (second результат)
  38. (coerce (second результат) 'string)
  39. "")))
  40.  
  41. (defun сплетник-слово (слово ключевое-слово)
  42. "Переводит одно слово на 'язык сплетника'."
  43. (let ((слог-слова (первый-слог слово))
  44. (слог-ключа (первый-слог ключевое-слово))
  45. (остаток-слова (остаток-слова слово))
  46. (остаток-ключа (остаток-слова ключевое-слово)))
  47. (list (concatenate 'string (if слог-ключа слог-ключа "") остаток-слова)
  48. (concatenate 'string (if слог-слова слог-слова "") остаток-ключа))))
  49.  
  50. (defun сплетник-предложение (предложение ключевое-слово)
  51. "Переводит предложение на 'язык сплетника'."
  52. (mapcar #'(lambda (слово) (сплетник-слово слово ключевое-слово)) предложение))
  53.  
  54. (defun safe-string (arg)
  55. "Преобразует символ или число в строку, или возвращает строку без изменений."
  56. (cond ((stringp arg) arg)
  57. ((symbolp arg) (symbol-name arg))
  58. ((numberp arg) (write-to-string arg))
  59. (t "")))
  60.  
  61. (defun сплетник-предложение-safe (предложение ключевое-слово)
  62. "Безопасная версия для разнородных списков и отсутствия слов."
  63. (let ((ключевое-слово-str (safe-string ключевое-слово)))
  64. (mapcar #'(lambda (слово)
  65. (сплетник-слово (safe-string слово) ключевое-слово-str))
  66. предложение)))
  67.  
  68. ;; Пример использования:
  69. (let ((предложение '("слово" "переводится" "" 123 :символ nil "на" "язык" "сплетника"))
  70. (ключевое-слово "сплетня"))
  71. (format t "Исходное предложение: ~A~%" предложение)
  72. (format t "Ключевое слово: ~A~%" ключевое-слово)
  73. (format t "Предложение на языке сплетника: ~A~%" (сплетник-предложение-safe предложение ключевое-слово)))
  74.  
  75. (let ((предложение '("мгла" "переводится" "на" "язык" "сплетника"))
  76. (ключевое-слово "сплетня"))
  77. (format t "Исходное предложение: ~A~%" предложение)
  78. (format t "Ключевое слово: ~A~%" ключевое-слово)
  79. (format t "Предложение на языке сплетника: ~A~%" (сплетник-предложение предложение ключевое-слово)))
  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 "Keyword: ~A~%" ключевое-слово)
  91. (format t "Gossip sentence: ~A~%" (сплетник-предложение предложение ключевое-слово)))
  92.  
  93. (let ((предложение '("отговорила" "роща" "золотая"))
  94. (ключевое-слово "кумир"))
  95. (format t "Исходное предложение: ~A~%" предложение)
  96. (format t "Keyword: ~A~%" ключевое-слово)
  97. (format t "Gossip sentence: ~A~%" (сплетник-предложение предложение ключевое-слово)))
  98.  
Success #stdin #stdout #stderr 0.02s 9560KB
stdin
Standard input is empty
stdout
Исходное предложение: (слово переводится  123 СИМВОЛ NIL на язык сплетника)
Ключевое слово: сплетня
Предложение на языке сплетника: 
((сплово слетня) (сплереводится петня) (спл етня) (спл 123етня)
 (сплИМВОЛ Сетня) (спл NILетня) (спла нетня) (сплязык етня)
 (сплетника сплетня))
Исходное предложение: (мгла переводится на язык сплетника)
Ключевое слово: сплетня
Предложение на языке сплетника: 
((спла мглетня) (сплереводится петня) (спла нетня) (сплязык етня)
 (сплетника сплетня))
Исходное предложение: (надкусить ломтик колбасы)
Ключевое слово: сплетня
Предложение на языке сплетника: ((спладкусить ломтик колбасы нетня))
Исходное предложение: (написать программу обработки текста)
Keyword: сплетня
Gossip sentence: ((сплаписать нетня) (сплограмму претня) (сплобработки етня) (сплекста тетня))
Исходное предложение: (отговорила роща золотая)
Keyword: кумир
Gossip sentence: ((котговорила умир) (коща румир) (колотая зумир))
stderr
Warning: reserving address range 0x80000c0000...0x1fffffffffff that contains memory mappings. clisp might crash later!
Memory dump:
  0x8000000000 - 0x80000bffff
  0x150633400000 - 0x1506336e4fff
  0x150633815000 - 0x150633839fff
  0x15063383a000 - 0x1506339acfff
  0x1506339ad000 - 0x1506339f5fff
  0x1506339f6000 - 0x1506339f8fff
  0x1506339f9000 - 0x1506339fbfff
  0x1506339fc000 - 0x1506339fffff
  0x150633a00000 - 0x150633a02fff
  0x150633a03000 - 0x150633c01fff
  0x150633c02000 - 0x150633c02fff
  0x150633c03000 - 0x150633c03fff
  0x150633c80000 - 0x150633c8ffff
  0x150633c90000 - 0x150633cc3fff
  0x150633cc4000 - 0x150633dfafff
  0x150633dfb000 - 0x150633dfbfff
  0x150633dfc000 - 0x150633dfefff
  0x150633dff000 - 0x150633dfffff
  0x150633e00000 - 0x150633e03fff
  0x150633e04000 - 0x150634003fff
  0x150634004000 - 0x150634004fff
  0x150634005000 - 0x150634005fff
  0x15063403d000 - 0x150634040fff
  0x150634041000 - 0x150634041fff
  0x150634042000 - 0x150634043fff
  0x150634044000 - 0x150634044fff
  0x150634045000 - 0x150634045fff
  0x150634046000 - 0x150634046fff
  0x150634047000 - 0x150634054fff
  0x150634055000 - 0x150634062fff
  0x150634063000 - 0x15063406ffff
  0x150634070000 - 0x150634073fff
  0x150634074000 - 0x150634074fff
  0x150634075000 - 0x150634075fff
  0x150634076000 - 0x15063407bfff
  0x15063407c000 - 0x15063407dfff
  0x15063407e000 - 0x15063407efff
  0x15063407f000 - 0x15063407ffff
  0x150634080000 - 0x150634080fff
  0x150634081000 - 0x1506340aefff
  0x1506340af000 - 0x1506340bdfff
  0x1506340be000 - 0x150634163fff
  0x150634164000 - 0x1506341fafff
  0x1506341fb000 - 0x1506341fbfff
  0x1506341fc000 - 0x1506341fcfff
  0x1506341fd000 - 0x150634210fff
  0x150634211000 - 0x150634238fff
  0x150634239000 - 0x150634242fff
  0x150634243000 - 0x150634244fff
  0x150634245000 - 0x15063424afff
  0x15063424b000 - 0x15063424dfff
  0x150634250000 - 0x150634250fff
  0x150634251000 - 0x150634251fff
  0x150634252000 - 0x150634252fff
  0x150634253000 - 0x150634253fff
  0x150634254000 - 0x150634254fff
  0x150634255000 - 0x15063425bfff
  0x15063425c000 - 0x15063425efff
  0x15063425f000 - 0x15063425ffff
  0x150634260000 - 0x150634280fff
  0x150634281000 - 0x150634288fff
  0x150634289000 - 0x150634289fff
  0x15063428a000 - 0x15063428afff
  0x15063428b000 - 0x15063428bfff
  0x55c546c2b000 - 0x55c546d1bfff
  0x55c546d1c000 - 0x55c546e25fff
  0x55c546e26000 - 0x55c546e85fff
  0x55c546e87000 - 0x55c546eb5fff
  0x55c546eb6000 - 0x55c546ee6fff
  0x55c546ee7000 - 0x55c546eeafff
  0x55c547481000 - 0x55c5474a1fff
  0x7ffe65edf000 - 0x7ffe65efffff
  0x7ffe65f0a000 - 0x7ffe65f0dfff
  0x7ffe65f0e000 - 0x7ffe65f0ffff