Fork me on GitHub
#clojure-russia
<
2018-07-31
>
kgofhedgehogs13:07:36

=> (let [a [:a0 nil :a1 nil]
         b [:b0 :b1]]
    (foo a b))
[:b0 nil :b1 nil]
Есть у нас в стандарных либах такая foo? Или может есть идеи как можно без костылей элегантно напсать такую foo?

anjensan13:07:10

(defn foo [a b] (->> a (rest) (take-nth 2) (interleave b) (vec)))

anjensan13:07:18

@kgofhedgehogs хотя подозреваю, что нужно что-то вроде https://clojuredocs.org/clojure.set/rename-keys

kgofhedgehogs13:07:51

Не, это не ренейм кейс. Я поставил киворды просто как пример элементов вектора

kgofhedgehogs13:07:14

Твоя функция работает с предложенным мной примером, но мой пример оказался корнеркейсом, извиняюсь

kgofhedgehogs13:07:33

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

kgofhedgehogs13:07:27

@anjensan, вот я обновил пример

anjensan13:07:13

т.е. заменить все not nil из первой последовательности на элементы из второй

anjensan13:07:26

ну готовое такое врядли будет

kgofhedgehogs13:07:54

@anjensan Да. Именно так

kgofhedgehogs13:07:04

Т.е. могу так луп и оставлять?

anjensan14:07:09

в принципе почему нет. можно конечно через встроенные выразить. только будет не намного меньше и медленнее

anjensan14:07:21

ну если исходные списки не оч большие и не нужна ленивость

kgofhedgehogs14:07:13

Исходный xs длиной до 10, ys соответственно <= 10

anjensan14:07:23

ну знач не нужна 😃

kgofhedgehogs14:07:30

Ладно, оставляю loop. Спасибо

kgofhedgehogs14:07:58

Теперь вопрос как же назвать такую функцию...

kgofhedgehogs14:07:34

replace-not-nils-with-ys

ilevd14:07:35

(defn foo [a b]
  (let [r (filter some? a)
        r (into {} (map vector r b))]
    (replace r a)))

kgofhedgehogs14:07:59

@ilevd могут случиться коллизии среди a и тогда потеряются некоторые b?

ilevd14:07:01

Это да

kgofhedgehogs14:07:20

Сейчас подумаю могут ли у меня быть коллизии

anjensan14:07:28

если в y не может быть nil можно

anjensan14:07:25

по идее так должно работать всегда

anjensan14:07:32

тестировать лень 😉

kgofhedgehogs14:07:05

В y не может быть nil

kgofhedgehogs14:07:17

И коллизий в x тоже не может быть

anjensan14:07:50

ну тогда можешь решение от ilevd юзать. только (into [} (map vector r b) ==> (zipmap (remove nil? x) y)

ilevd14:07:21

(defn foo [a b] (replace (zipmap (remove nil? a) b) a))

ilevd14:07:40

В итоге самое короткое получается)

👍 8