Fork me on GitHub
#clojure-russia
<
2016-07-05
>
andre11:07:06

знаю что решение простое, не могу что-то сообразить, у меня есть лист элементов и лист размерностей мне нужно разбить лист по размерностям

andre11:07:17

(1 2 3 4 5 6 ) (2, 3 ,1) -> (1 2) (3 4 5) (6)

andfadeev11:07:56

можно попробовать spit-at https://clojuredocs.org/clojure.core/split-at и дальше рекурсивно хвост

andre12:07:56

(:r (reduce #(assoc %1 :r (conj (:r %1) (take %2 (:s %1))) :s (drop %2 (:s %1))) {:r [] :s (range 1 7)} (list 2 3 1)))

andre12:07:23

все время пытаюсь reduce не по назначению использовать

Maxim12:07:02

а partition и partition-all не помогут?

andre12:07:14

нет вроде

andre12:07:02

я знаю что наверняка есть функция. но иногда с поиском конкретной сложности возникают

fxposter12:07:28

почти уверен что такой функции нет

Maxim12:07:42

Я вот это использую http://clojure.org/api/cheatsheet

Maxim12:07:05

Я тоже не думаю, что есть такая функция

Maxim12:07:15

А вообще, зачем такое разбиение нужно?

andre12:07:56

ну это специфичная задача, алгоритм шифрования такой

delaguardo12:07:55

через рекурсию мб?

(loop [s '(1 2 3 4 5 6) d '(2 3 1) r []]
  (if (= (count d) 0)
    r
    (let [dx (first d)]
      (recur (drop dx s) (rest d) (conj r (take dx s))))))

kronos_vano13:07:52

м/б (empty? d)

prepor13:07:14

(defn chunks [data [n & counts]]
  (when (seq data)
    (cons (take n data) 
          (lazy-seq (chunks (drop n data) counts)))))

prepor13:07:44

(chunks [1 2 3 4 5 6] [2 3 1])
=> ((1 2) (3 4 5) (6))

Maxim13:07:31

@prepor: поясни для чего там lazy-seq, пожалуйста

prepor13:07:26

ну что б спортивнее и можно было ленивые коллекции скармливать!

prepor13:07:40

@mkaschenko: так то понятно, что можно просто

(defn chunks [data [n & counts]]
  (when (seq data)
    (cons (take n data) 
          (chunks (drop n data) counts))))

kronos_vano13:07:36

а рекурсия чем-то отличается от loop+recur? из за длинного списка стек не помрет?

Maxim13:07:52

помрет

andmed13:07:16

@kronos_vano: здесь же вроде не хвостовая..

kronos_vano13:07:27

я не уверен что в кложе есть хвостовая

andfadeev13:07:50

в луп рекур хвостовая

kronos_vano13:07:25

я бы не сказал что там вообще рекурсия, больше похоже на цикл

kronos_vano13:07:49

Note that recur is the only non-stack-consuming looping construct in Clojur

prepor13:07:54

а рекурсия это не цикл? )

prepor13:07:06

recur это явное определение хвостовой рекурсии, да

prepor13:07:23

в моей функе без lazy-seq будет расти стек

prepor13:07:34

с lazy-seq стек расти не будет

kronos_vano13:07:44

теперь понятно

prepor13:07:11

> а рекурсия это не цикл? ) ну в примитивном случае TCO, какой в кложе

prepor13:07:49

в не примитивном тоже цикл, просто посложнее

andfadeev13:07:24

преобразование стека вызовов в итеративный цикл это же и есть вроде оптимизация хв. рекурсии, если грубо

prepor13:07:38

угумс

kronos_vano13:07:00

энивей, хорошая задачка. сохраню

prepor13:07:27

просто с mututral recursion вроде так в лоб не получится

Maxim15:07:48

Кто-нибудь деплоил clojure на heroku? Получаю такую ошибку, не могу понять в чем дело. Порт берется из env, все ок, но не работает. [ERROR][luminus.http-server] server failed to start on port xxxxx java.lang.RuntimeException: java.net.BindException: Cannot assign requested address

Maxim15:07:56

immutant используется

Maxim15:07:46

Never mind