Advertisement
Guest User

Clojure 1

a guest
Dec 3rd, 2019
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (ns lab4.generator)
  2.  
  3. (defn last_symbol_is_not
  4.   "Проверить, равен ли последний символ слова word символу symbol"
  5.   [word symbol]
  6.   (
  7.     not= (last word) symbol
  8.   )
  9. )
  10.  
  11. (defn append_symbol_to_word
  12.   "Добавить символ symbol в конец слова word"
  13.   [word symbol]
  14.   (
  15.     str word symbol
  16.   )
  17. )
  18.  
  19. (defn append_symbols_to_word
  20.   "К каждому символу, кроме тех, которые совпадают с последним символом слова word,
  21.   добавить в начало префикс word"
  22.   [word symbols]
  23.   (
  24.     map (fn [symbol] (str word symbol)) (filter (fn [symbol] (last_symbol_is_not word symbol)) symbols)
  25.   )
  26. )
  27.  
  28. (defn list_flatten
  29.   "Сделать список списков плоским"
  30.   [a_list]
  31.   (
  32.     reduce concat (list) a_list
  33.   )
  34. )
  35.  
  36. (defn append_symbols_to_words
  37.   "К каждому слову из списка words добавить по одному символу из списка symbols,
  38.   исключая ситуации, когда последняя буква слова совпадает с добавляемым символом"
  39.   [words symbols]
  40.   (
  41.     list_flatten (map (fn [word] (append_symbols_to_word word symbols)) words)
  42.   )
  43. )
  44.  
  45. (defn generate_symbol_sequence
  46.   "Функция генерирует список строк длины length из символов symbols не содержащих двух подряд идущих одинаковых символов"
  47.   [symbols length]
  48.   (let [distinct_symbols (distinct symbols)]
  49.     (cond
  50.       (<= length 0) (list)
  51.       :default (
  52.         reduce (fn [acc iteration] (append_symbols_to_words acc distinct_symbols)) (map str distinct_symbols) (range (- length 1))
  53.       )
  54.     )
  55.   )
  56. )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement