clojure-russia

Работа и релокейт: #jobs-rus | #clojure-russia-offtop Телеграм-чат https://t.me/clojure_ru
kgofhedgehogs 2018-07-31T13:13:36.000106Z

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

anjensan 2018-07-31T13:44:10.000348Z

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

anjensan 2018-07-31T13:47:18.000449Z

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

kgofhedgehogs 2018-07-31T13:47:51.000452Z

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

kgofhedgehogs 2018-07-31T13:48:14.000072Z

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

kgofhedgehogs 2018-07-31T13:48:33.000411Z

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

kgofhedgehogs 2018-07-31T13:52:27.000663Z

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

anjensan 2018-07-31T13:57:13.000261Z

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

kgofhedgehogs 2018-07-31T13:57:26.000005Z

anjensan 2018-07-31T13:57:26.000458Z

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

kgofhedgehogs 2018-07-31T13:57:54.000204Z

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

kgofhedgehogs 2018-07-31T13:58:04.000380Z

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

anjensan 2018-07-31T14:00:09.000402Z

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

anjensan 2018-07-31T14:00:21.000395Z

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

kgofhedgehogs 2018-07-31T14:01:13.000233Z

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

anjensan 2018-07-31T14:01:23.000408Z

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

kgofhedgehogs 2018-07-31T14:01:30.000459Z

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

kgofhedgehogs 2018-07-31T14:01:58.000533Z

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

kgofhedgehogs 2018-07-31T14:05:34.000177Z

replace-not-nils-with-ys

ilevd 2018-07-31T14:08:35.000155Z

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

kgofhedgehogs 2018-07-31T14:09:32.000645Z

Ох

kgofhedgehogs 2018-07-31T14:09:33.000571Z

Хм

kgofhedgehogs 2018-07-31T14:11:59.000170Z

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

ilevd 2018-07-31T14:13:01.000139Z

Это да

kgofhedgehogs 2018-07-31T14:14:20.000245Z

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

anjensan 2018-07-31T14:25:28.000296Z

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

anjensan 2018-07-31T14:27:14.000559Z

anjensan 2018-07-31T14:27:25.000648Z

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

anjensan 2018-07-31T14:27:32.000343Z

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

kgofhedgehogs 2018-07-31T14:40:05.000512Z

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

kgofhedgehogs 2018-07-31T14:40:17.000285Z

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

anjensan 2018-07-31T14:43:50.000330Z

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

ilevd 2018-07-31T14:47:21.000272Z

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

ilevd 2018-07-31T14:47:40.000402Z

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

👍 2