fork download
  1. ;; Глобальные константы
  2. (defconstant +glasn+ '(#\А #\Е #\Ё #\И #\О #\У #\Ы #\Э #\Ю #\Я #\а #\е #\ё #\и #\о #\у #\ы #\э #\ю #\я)
  3. "Список гласных букв")
  4. (defconstant +sonorn+ '(#\Л #\М #\Н #\Р #\л #\м #\н #\р #\Й #\й)
  5. "Список сонорных согласных букв")
  6.  
  7. ;;; Проверка гласной
  8. (defun glasn (char)
  9. (member char +glasn+ :test #'char-equal))
  10.  
  11. ;;; Проверка сонорного согласного
  12. (defun sonorn (char)
  13. (member char +sonorn+ :test #'char-equal))
  14.  
  15. ;;; Проверка шумного согласного (не гласная и не сонорная)
  16. (defun shumn (char)
  17. (and (characterp char)
  18. (not (glasn char))
  19. (not (sonorn char))))
  20.  
  21. ;;; Разбиение слова на слоги (упрощённый и исправленный вариант)
  22. (defun razbit-na-slogi (word)
  23. (let ((slogi '())
  24. (current-slog '()))
  25. (labels ((add-slog ()
  26. (when current-slog
  27. (push (coerce (nreverse current-slog) 'string) slogi)
  28. (setf current-slog '()))))
  29. (dotimes (i (length word))
  30. (let ((char (char word i)))
  31. (push char current-slog)
  32. (when (glasn char)
  33. (if (<= (length current-slog) 1)
  34. (add-slog)
  35. (let* ((rev-slog (reverse current-slog))
  36. (last1 (nth 0 rev-slog)) ; последний символ (гласная)
  37. (last2 (nth 1 rev-slog))) ; предпоследний символ
  38. (cond
  39. ;; Два шумных подряд - последний переходит в следующий слог
  40. ((and (shumn last1) (shumn last2))
  41. (push last1 rev-slog) ;; возвращаем последний назад
  42. (setf current-slog (list last1))
  43. (add-slog))
  44. ;; Два сонорных подряд, кроме 'й' - последний переходит в следующий слог
  45. ((and (sonorn last1) (sonorn last2) (not (char-equal last1 #\й)))
  46. (push last1 rev-slog)
  47. (setf current-slog (list last1))
  48. (add-slog))
  49. ;; Иначе разделяем здесь
  50. (t (add-slog))))))))
  51. ;; Добавляем последний слог, если остался
  52. (when current-slog
  53. (push (coerce (nreverse current-slog) 'string) slogi))
  54. ;; Возвращаем слоги в правильном порядке
  55. (nreverse slogi))))
  56.  
  57. ;;; Примеры использования
  58. (print (list "здравствуй" (razbit-na-slogi "здравствуй")))
  59. (print (list "школа" (razbit-na-slogi "школа")))
  60. (print (list "майка" (razbit-na-slogi "майка")))
  61. (print (list "лампочка" (razbit-na-slogi "лампочка")))
  62. (print (list "космос" (razbit-na-slogi "космос")))
  63. (print (list "алгоритм" (razbit-na-slogi "алгоритм")))
  64. (print (list "интервенция" (razbit-na-slogi "интервенция")))
  65. (print (list "иньекция" (razbit-na-slogi "иньекция")))
Success #stdin #stdout #stderr 0.01s 9536KB
stdin
Standard input is empty
stdout
("здравствуй" ("з" "в" "й")) 
("школа" ("ш" "ла")) 
("майка" ("ма" "йка")) 
("лампочка" ("ла" "мпо" "ч")) 
("космос" ("ко" "смо" "с")) 
("алгоритм" ("а" "лго" "ри" "тм")) 
("интервенция" ("и" "нте" "рве" "нци" "я")) 
("иньекция" ("и" "нье" "к" "я")) 
stderr
Warning: reserving address range 0x80000c0000...0x1fffffffffff that contains memory mappings. clisp might crash later!
Memory dump:
  0x8000000000 - 0x80000bffff
  0x150797600000 - 0x1507978e4fff
  0x150797a15000 - 0x150797a39fff
  0x150797a3a000 - 0x150797bacfff
  0x150797bad000 - 0x150797bf5fff
  0x150797bf6000 - 0x150797bf8fff
  0x150797bf9000 - 0x150797bfbfff
  0x150797bfc000 - 0x150797bfffff
  0x150797c00000 - 0x150797c02fff
  0x150797c03000 - 0x150797e01fff
  0x150797e02000 - 0x150797e02fff
  0x150797e03000 - 0x150797e03fff
  0x150797e80000 - 0x150797e8ffff
  0x150797e90000 - 0x150797ec3fff
  0x150797ec4000 - 0x150797ffafff
  0x150797ffb000 - 0x150797ffbfff
  0x150797ffc000 - 0x150797ffefff
  0x150797fff000 - 0x150797ffffff
  0x150798000000 - 0x150798003fff
  0x150798004000 - 0x150798203fff
  0x150798204000 - 0x150798204fff
  0x150798205000 - 0x150798205fff
  0x15079829c000 - 0x15079829ffff
  0x1507982a0000 - 0x1507982a0fff
  0x1507982a1000 - 0x1507982a2fff
  0x1507982a3000 - 0x1507982a3fff
  0x1507982a4000 - 0x1507982a4fff
  0x1507982a5000 - 0x1507982a5fff
  0x1507982a6000 - 0x1507982b3fff
  0x1507982b4000 - 0x1507982c1fff
  0x1507982c2000 - 0x1507982cefff
  0x1507982cf000 - 0x1507982d2fff
  0x1507982d3000 - 0x1507982d3fff
  0x1507982d4000 - 0x1507982d4fff
  0x1507982d5000 - 0x1507982dafff
  0x1507982db000 - 0x1507982dcfff
  0x1507982dd000 - 0x1507982ddfff
  0x1507982de000 - 0x1507982defff
  0x1507982df000 - 0x1507982dffff
  0x1507982e0000 - 0x15079830dfff
  0x15079830e000 - 0x15079831cfff
  0x15079831d000 - 0x1507983c2fff
  0x1507983c3000 - 0x150798459fff
  0x15079845a000 - 0x15079845afff
  0x15079845b000 - 0x15079845bfff
  0x15079845c000 - 0x15079846ffff
  0x150798470000 - 0x150798497fff
  0x150798498000 - 0x1507984a1fff
  0x1507984a2000 - 0x1507984a3fff
  0x1507984a4000 - 0x1507984a9fff
  0x1507984aa000 - 0x1507984acfff
  0x1507984af000 - 0x1507984affff
  0x1507984b0000 - 0x1507984b0fff
  0x1507984b1000 - 0x1507984b1fff
  0x1507984b2000 - 0x1507984b2fff
  0x1507984b3000 - 0x1507984b3fff
  0x1507984b4000 - 0x1507984bafff
  0x1507984bb000 - 0x1507984bdfff
  0x1507984be000 - 0x1507984befff
  0x1507984bf000 - 0x1507984dffff
  0x1507984e0000 - 0x1507984e7fff
  0x1507984e8000 - 0x1507984e8fff
  0x1507984e9000 - 0x1507984e9fff
  0x1507984ea000 - 0x1507984eafff
  0x55662614f000 - 0x55662623ffff
  0x556626240000 - 0x556626349fff
  0x55662634a000 - 0x5566263a9fff
  0x5566263ab000 - 0x5566263d9fff
  0x5566263da000 - 0x55662640afff
  0x55662640b000 - 0x55662640efff
  0x5566277e6000 - 0x556627806fff
  0x7ffe61d4b000 - 0x7ffe61d6bfff
  0x7ffe61dd0000 - 0x7ffe61dd3fff
  0x7ffe61dd4000 - 0x7ffe61dd5fff