fork download
  1. (defun first-syllable (word)
  2. "Возвращает первый слог слова (более корректно)."
  3. (let ((vowels '(#\а #\у #\о #\ы #\и #\э #\я #\ю #\ё #\е))
  4. (consonants '(#\б #\в #\г #\д #\ж #\з #\й #\к #\л #\м #\н #\п #\р #\с #\т #\ф #\х #\ц #\ч #\ш #\щ)))
  5. (loop for i from 0 below (length word)
  6. for char = (char word i)
  7. if (member char vowels)
  8. do (return (subseq word 0 (1+ i)))
  9. finally (return (subseq word 0))))) ; Если гласных нет, вернуть все слово
  10.  
  11. (defun word-remainder (word)
  12. "Возвращает часть слова, идущую после первого слога."
  13.  
  14. (let ((first (first-syllable word)))
  15. (if first
  16. (subseq word (length first))
  17. "")))
  18.  
  19. (defun gossip-word (word keyword)
  20. "Переводит одно слово на 'язык сплетника'."
  21. (let ((word-syllable (first-syllable word))
  22. (keyword-syllable (first-syllable keyword))
  23. (word-remainder (word-remainder word))
  24. (keyword-remainder (word-remainder keyword)))
  25. (list (concatenate 'string (if keyword-syllable keyword-syllable "") word-remainder)
  26. (concatenate 'string (if word-syllable word-syllable "") keyword-remainder))))
  27.  
  28. (defun gossip-sentence (sentence keyword)
  29. "Переводит предложение на 'язык сплетника'."
  30. (mapcar #'(lambda (word) (gossip-word word keyword)) sentence))
  31.  
  32. (defun safe-string (arg)
  33. "Преобразует символ или число в строку, или возвращает строку без изменений."
  34.  
  35. (cond ((stringp arg) arg)
  36. ((symbolp arg) (symbol-name arg))
  37. ((numberp arg) (write-to-string arg))
  38. (t "")))
  39.  
  40. (defun gossip-sentence-safe (sentence keyword)
  41. "Безопасная версия для разнородных списков и отсутствия слов."
  42. (let ((keyword-str (safe-string keyword)))
  43. (mapcar #'(lambda (word)
  44. (gossip-word (safe-string word) keyword-str))
  45. sentence)))
  46.  
  47. ;; Example usage:
  48. (let ((sentence '("слово" "переводится" "" 123 :символ nil "на" "язык" "сплетника"))
  49. (keyword "сплетня"))
  50. (format t "Исходное предложение: ~A~%" sentence)
  51. (format t "Ключевое слово: ~A~%" keyword)
  52. (format t "Предложение на языке сплетника: ~A~%" (gossip-sentence-safe sentence keyword)))
  53.  
  54. (let ((sentence '("отговорила" "роща" "золотая"))
  55. (keyword "кумир"))
  56. (format t "Исходное предложение: ~A~%" sentence)
  57. (format t "Ключевое слово: ~A~%" keyword)
  58. (format t "Предложение на языке сплетника: ~A~%" (gossip-sentence sentence keyword)))
  59.  
  60. (let ((sentence '("написать" "программу" "обработки" "текста"))
  61. (keyword "сплетня"))
  62. (format t "Исходное предложение: ~A~%" sentence)
  63. (format t "Ключевое слово: ~A~%" keyword)
  64. (format t "Предложение на языке сплетника: ~A~%" (gossip-sentence sentence keyword)))
  65.  
Success #stdin #stdout #stderr 0.02s 9740KB
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
  0x149eaa600000 - 0x149eaa8e4fff
  0x149eaaa00000 - 0x149eaaa02fff
  0x149eaaa03000 - 0x149eaac01fff
  0x149eaac02000 - 0x149eaac02fff
  0x149eaac03000 - 0x149eaac03fff
  0x149eaac15000 - 0x149eaac39fff
  0x149eaac3a000 - 0x149eaadacfff
  0x149eaadad000 - 0x149eaadf5fff
  0x149eaadf6000 - 0x149eaadf8fff
  0x149eaadf9000 - 0x149eaadfbfff
  0x149eaadfc000 - 0x149eaadfffff
  0x149eaae00000 - 0x149eaae03fff
  0x149eaae04000 - 0x149eab003fff
  0x149eab004000 - 0x149eab004fff
  0x149eab005000 - 0x149eab005fff
  0x149eab064000 - 0x149eab065fff
  0x149eab066000 - 0x149eab075fff
  0x149eab076000 - 0x149eab0a9fff
  0x149eab0aa000 - 0x149eab1e0fff
  0x149eab1e1000 - 0x149eab1e1fff
  0x149eab1e2000 - 0x149eab1e4fff
  0x149eab1e5000 - 0x149eab1e5fff
  0x149eab1e6000 - 0x149eab1e7fff
  0x149eab1e8000 - 0x149eab1e8fff
  0x149eab1e9000 - 0x149eab1eafff
  0x149eab1eb000 - 0x149eab1ebfff
  0x149eab1ec000 - 0x149eab1ecfff
  0x149eab1ed000 - 0x149eab1edfff
  0x149eab1ee000 - 0x149eab1fbfff
  0x149eab1fc000 - 0x149eab209fff
  0x149eab20a000 - 0x149eab216fff
  0x149eab217000 - 0x149eab21afff
  0x149eab21b000 - 0x149eab21bfff
  0x149eab21c000 - 0x149eab21cfff
  0x149eab21d000 - 0x149eab222fff
  0x149eab223000 - 0x149eab224fff
  0x149eab225000 - 0x149eab225fff
  0x149eab226000 - 0x149eab226fff
  0x149eab227000 - 0x149eab227fff
  0x149eab228000 - 0x149eab255fff
  0x149eab256000 - 0x149eab264fff
  0x149eab265000 - 0x149eab30afff
  0x149eab30b000 - 0x149eab3a1fff
  0x149eab3a2000 - 0x149eab3a2fff
  0x149eab3a3000 - 0x149eab3a3fff
  0x149eab3a4000 - 0x149eab3b7fff
  0x149eab3b8000 - 0x149eab3dffff
  0x149eab3e0000 - 0x149eab3e9fff
  0x149eab3ea000 - 0x149eab3ebfff
  0x149eab3ec000 - 0x149eab3f1fff
  0x149eab3f2000 - 0x149eab3f4fff
  0x149eab3f7000 - 0x149eab3f7fff
  0x149eab3f8000 - 0x149eab3f8fff
  0x149eab3f9000 - 0x149eab3f9fff
  0x149eab3fa000 - 0x149eab3fafff
  0x149eab3fb000 - 0x149eab3fbfff
  0x149eab3fc000 - 0x149eab402fff
  0x149eab403000 - 0x149eab405fff
  0x149eab406000 - 0x149eab406fff
  0x149eab407000 - 0x149eab427fff
  0x149eab428000 - 0x149eab42ffff
  0x149eab430000 - 0x149eab430fff
  0x149eab431000 - 0x149eab431fff
  0x149eab432000 - 0x149eab432fff
  0x55d843319000 - 0x55d843409fff
  0x55d84340a000 - 0x55d843513fff
  0x55d843514000 - 0x55d843573fff
  0x55d843575000 - 0x55d8435a3fff
  0x55d8435a4000 - 0x55d8435d4fff
  0x55d8435d5000 - 0x55d8435d8fff
  0x55d845418000 - 0x55d845438fff
  0x7ffd5b4c1000 - 0x7ffd5b4e1fff
  0x7ffd5b4fa000 - 0x7ffd5b4fdfff
  0x7ffd5b4fe000 - 0x7ffd5b4fffff