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. (razbit-na-slogi "программа") ;; => ("про" "гра" "мма")
  57. (razbit-na-slogi "словарь") ;; => ("сло" "варь")
Success #stdin #stdout #stderr 0.02s 9616KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Warning: reserving address range 0x80000c0000...0x1fffffffffff that contains memory mappings. clisp might crash later!
Memory dump:
  0x8000000000 - 0x80000bffff
  0x153d7b000000 - 0x153d7b2e4fff
  0x153d7b415000 - 0x153d7b439fff
  0x153d7b43a000 - 0x153d7b5acfff
  0x153d7b5ad000 - 0x153d7b5f5fff
  0x153d7b5f6000 - 0x153d7b5f8fff
  0x153d7b5f9000 - 0x153d7b5fbfff
  0x153d7b5fc000 - 0x153d7b5fffff
  0x153d7b600000 - 0x153d7b602fff
  0x153d7b603000 - 0x153d7b801fff
  0x153d7b802000 - 0x153d7b802fff
  0x153d7b803000 - 0x153d7b803fff
  0x153d7b880000 - 0x153d7b88ffff
  0x153d7b890000 - 0x153d7b8c3fff
  0x153d7b8c4000 - 0x153d7b9fafff
  0x153d7b9fb000 - 0x153d7b9fbfff
  0x153d7b9fc000 - 0x153d7b9fefff
  0x153d7b9ff000 - 0x153d7b9fffff
  0x153d7ba00000 - 0x153d7ba03fff
  0x153d7ba04000 - 0x153d7bc03fff
  0x153d7bc04000 - 0x153d7bc04fff
  0x153d7bc05000 - 0x153d7bc05fff
  0x153d7bcd2000 - 0x153d7bcd5fff
  0x153d7bcd6000 - 0x153d7bcd6fff
  0x153d7bcd7000 - 0x153d7bcd8fff
  0x153d7bcd9000 - 0x153d7bcd9fff
  0x153d7bcda000 - 0x153d7bcdafff
  0x153d7bcdb000 - 0x153d7bcdbfff
  0x153d7bcdc000 - 0x153d7bce9fff
  0x153d7bcea000 - 0x153d7bcf7fff
  0x153d7bcf8000 - 0x153d7bd04fff
  0x153d7bd05000 - 0x153d7bd08fff
  0x153d7bd09000 - 0x153d7bd09fff
  0x153d7bd0a000 - 0x153d7bd0afff
  0x153d7bd0b000 - 0x153d7bd10fff
  0x153d7bd11000 - 0x153d7bd12fff
  0x153d7bd13000 - 0x153d7bd13fff
  0x153d7bd14000 - 0x153d7bd14fff
  0x153d7bd15000 - 0x153d7bd15fff
  0x153d7bd16000 - 0x153d7bd43fff
  0x153d7bd44000 - 0x153d7bd52fff
  0x153d7bd53000 - 0x153d7bdf8fff
  0x153d7bdf9000 - 0x153d7be8ffff
  0x153d7be90000 - 0x153d7be90fff
  0x153d7be91000 - 0x153d7be91fff
  0x153d7be92000 - 0x153d7bea5fff
  0x153d7bea6000 - 0x153d7becdfff
  0x153d7bece000 - 0x153d7bed7fff
  0x153d7bed8000 - 0x153d7bed9fff
  0x153d7beda000 - 0x153d7bedffff
  0x153d7bee0000 - 0x153d7bee2fff
  0x153d7bee5000 - 0x153d7bee5fff
  0x153d7bee6000 - 0x153d7bee6fff
  0x153d7bee7000 - 0x153d7bee7fff
  0x153d7bee8000 - 0x153d7bee8fff
  0x153d7bee9000 - 0x153d7bee9fff
  0x153d7beea000 - 0x153d7bef0fff
  0x153d7bef1000 - 0x153d7bef3fff
  0x153d7bef4000 - 0x153d7bef4fff
  0x153d7bef5000 - 0x153d7bf15fff
  0x153d7bf16000 - 0x153d7bf1dfff
  0x153d7bf1e000 - 0x153d7bf1efff
  0x153d7bf1f000 - 0x153d7bf1ffff
  0x153d7bf20000 - 0x153d7bf20fff
  0x560ba4c14000 - 0x560ba4d04fff
  0x560ba4d05000 - 0x560ba4e0efff
  0x560ba4e0f000 - 0x560ba4e6efff
  0x560ba4e70000 - 0x560ba4e9efff
  0x560ba4e9f000 - 0x560ba4ecffff
  0x560ba4ed0000 - 0x560ba4ed3fff
  0x560ba69a7000 - 0x560ba69c7fff
  0x7ffe1d9fd000 - 0x7ffe1da1dfff
  0x7ffe1dacf000 - 0x7ffe1dad2fff
  0x7ffe1dad3000 - 0x7ffe1dad4fff