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. (list слово ключевое-слово))
  46.  
  47. (defun safe-string (arg)
  48. "Преобразует символ или число в строку, или возвращает строку без изменений."
  49. (cond ((stringp arg) arg)
  50. ((symbolp arg) (symbol-name arg))
  51. ((numberp arg) (write-to-string arg))
  52. (t "")))
  53.  
  54. (defun сплетник-предложение-safe (предложение ключевое-слово)
  55. "Безопасная версия для разнородных списков и отсутствия слов."
  56. (let ((ключевое-слово-str (safe-string ключевое-слово)))
  57. (mapcar #'(lambda (слово)
  58. (if (stringp слово)
  59. (сплетник-слово слово ключевое-слово-str)
  60. (list (safe-string слово) ключевое-слово-str))) ; Обрабатываем все как строки
  61. предложение)))
  62.  
  63. (defun сплетник-предложение (предложение ключевое-слово)
  64. "Переводит предложение на 'язык сплетника'."
  65. (mapcar #'(lambda (слово) (сплетник-слово слово ключевое-слово)) предложение))
  66.  
  67. ;; Examples:
  68. (let ((предложение '("слово" "переводится" "" 123 :символ nil "на" "язык" "сплетника"))
  69. (ключевое-слово "сплетня"))
  70. (format t "Исходное предложение: ~A~%" предложение)
  71. (format t "Ключевое слово: ~A~%" ключевое-слово)
  72. (format t "Предложение на языке сплетника: ~A~%" (сплетник-предложение-safe предложение ключевое-слово)))
  73.  
  74. (let ((предложение '("мгла" "переводится" "на" "язык" "сплетника"))
  75. (ключевое-слово "сплетня"))
  76. (format t "Исходное предложение: ~A~%" предложение)
  77. (format t "Ключевое слово: ~A~%" ключевое-слово)
  78. (format t "Предложение на языке сплетника: ~A~%" (сплетник-предложение предложение ключевое-слово)))
  79.  
  80. (let ((предложение '("надкусить" "ломтик" "колбасы"))
  81. (ключевое-слово "сплетня"))
  82. (format t "Исходное предложение: ~A~%" предложение)
  83. (format t "Ключевое слово: ~A~%" ключевое-слово)
  84. (format t "Предложение на языке сплетника: ~A~%" (сплетник-предложение предложение ключевое-слово)))
  85.  
  86. (let ((предложение '("написать" "программу" "обработки" "текста"))
  87. (ключевое-слово "сплетня"))
  88. (format t "Исходное предложение: ~A~%" предложение)
  89. (format t "Ключевое слово: ~A~%" ключевое-слово)
  90. (format t "Предложение на языке сплетника: ~A~%" (сплетник-предложение предложение ключевое-слово)))
  91.  
  92. (let ((предложение '("отговорила" "роща" "золотая"))
  93. (ключевое-слово "кумир"))
  94. (format t "Исходное предложение: ~A~%" предложение)
  95. (format t "Ключевое слово: ~A~%" ключевое-слово)
  96. (format t "Предложение на языке сплетника: ~A~%" (сплетник-предложение предложение ключевое-слово)))
Success #stdin #stdout #stderr 0.02s 9736KB
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
  0x15279e000000 - 0x15279e2e4fff
  0x15279e415000 - 0x15279e439fff
  0x15279e43a000 - 0x15279e5acfff
  0x15279e5ad000 - 0x15279e5f5fff
  0x15279e5f6000 - 0x15279e5f8fff
  0x15279e5f9000 - 0x15279e5fbfff
  0x15279e5fc000 - 0x15279e5fffff
  0x15279e600000 - 0x15279e602fff
  0x15279e603000 - 0x15279e801fff
  0x15279e802000 - 0x15279e802fff
  0x15279e803000 - 0x15279e803fff
  0x15279e880000 - 0x15279e88ffff
  0x15279e890000 - 0x15279e8c3fff
  0x15279e8c4000 - 0x15279e9fafff
  0x15279e9fb000 - 0x15279e9fbfff
  0x15279e9fc000 - 0x15279e9fefff
  0x15279e9ff000 - 0x15279e9fffff
  0x15279ea00000 - 0x15279ea03fff
  0x15279ea04000 - 0x15279ec03fff
  0x15279ec04000 - 0x15279ec04fff
  0x15279ec05000 - 0x15279ec05fff
  0x15279ec4f000 - 0x15279ec52fff
  0x15279ec53000 - 0x15279ec53fff
  0x15279ec54000 - 0x15279ec55fff
  0x15279ec56000 - 0x15279ec56fff
  0x15279ec57000 - 0x15279ec57fff
  0x15279ec58000 - 0x15279ec58fff
  0x15279ec59000 - 0x15279ec66fff
  0x15279ec67000 - 0x15279ec74fff
  0x15279ec75000 - 0x15279ec81fff
  0x15279ec82000 - 0x15279ec85fff
  0x15279ec86000 - 0x15279ec86fff
  0x15279ec87000 - 0x15279ec87fff
  0x15279ec88000 - 0x15279ec8dfff
  0x15279ec8e000 - 0x15279ec8ffff
  0x15279ec90000 - 0x15279ec90fff
  0x15279ec91000 - 0x15279ec91fff
  0x15279ec92000 - 0x15279ec92fff
  0x15279ec93000 - 0x15279ecc0fff
  0x15279ecc1000 - 0x15279eccffff
  0x15279ecd0000 - 0x15279ed75fff
  0x15279ed76000 - 0x15279ee0cfff
  0x15279ee0d000 - 0x15279ee0dfff
  0x15279ee0e000 - 0x15279ee0efff
  0x15279ee0f000 - 0x15279ee22fff
  0x15279ee23000 - 0x15279ee4afff
  0x15279ee4b000 - 0x15279ee54fff
  0x15279ee55000 - 0x15279ee56fff
  0x15279ee57000 - 0x15279ee5cfff
  0x15279ee5d000 - 0x15279ee5ffff
  0x15279ee62000 - 0x15279ee62fff
  0x15279ee63000 - 0x15279ee63fff
  0x15279ee64000 - 0x15279ee64fff
  0x15279ee65000 - 0x15279ee65fff
  0x15279ee66000 - 0x15279ee66fff
  0x15279ee67000 - 0x15279ee6dfff
  0x15279ee6e000 - 0x15279ee70fff
  0x15279ee71000 - 0x15279ee71fff
  0x15279ee72000 - 0x15279ee92fff
  0x15279ee93000 - 0x15279ee9afff
  0x15279ee9b000 - 0x15279ee9bfff
  0x15279ee9c000 - 0x15279ee9cfff
  0x15279ee9d000 - 0x15279ee9dfff
  0x55faa3048000 - 0x55faa3138fff
  0x55faa3139000 - 0x55faa3242fff
  0x55faa3243000 - 0x55faa32a2fff
  0x55faa32a4000 - 0x55faa32d2fff
  0x55faa32d3000 - 0x55faa3303fff
  0x55faa3304000 - 0x55faa3307fff
  0x55faa42dd000 - 0x55faa42fdfff
  0x7fff62267000 - 0x7fff62287fff
  0x7fff6237f000 - 0x7fff62382fff
  0x7fff62383000 - 0x7fff62384fff