This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2017-01-17
Channels
- # aws (2)
- # beginners (34)
- # boot (39)
- # cider (28)
- # cljs-dev (2)
- # cljsrn (30)
- # clojure (195)
- # clojure-austin (6)
- # clojure-dev (6)
- # clojure-dusseldorf (1)
- # clojure-france (1)
- # clojure-russia (139)
- # clojure-spec (25)
- # clojure-uk (66)
- # clojurescript (125)
- # community-development (1)
- # core-async (42)
- # cryogen (1)
- # cursive (22)
- # datascript (6)
- # datomic (67)
- # docker (1)
- # emacs (7)
- # events (1)
- # garden (3)
- # hoplon (15)
- # jobs (3)
- # lein-figwheel (10)
- # leiningen (3)
- # luminus (4)
- # mount (2)
- # nginx (1)
- # off-topic (101)
- # om (42)
- # om-next (6)
- # onyx (7)
- # proton (1)
- # protorepl (4)
- # re-frame (15)
- # reagent (30)
- # remote-jobs (1)
- # ring (8)
- # ring-swagger (17)
- # rum (1)
- # spacemacs (2)
- # sql (1)
- # yada (50)
Смотрите, какая штука: https://lwn.net/Articles/655437/ -- структуры данных Clojure на неё идеально ложатся.
@yogthos Из Closure Library тебе что-нибудь пригодилось? Или там только client-side штуки?
Отдельное спасибо Николаю за его упорство в развитии комьюнити и всем участникам хенгаута
>Когнитект куплен гуглом? оракл купил датомик, во былоб круто
Рич женился
а он уже?
чорт, шутка не зашла
а просто кложу закрывают?
(deftype RAtom [^:mutable state meta validator ^:mutable watches]
IDeref
(-deref [this]
(notify-deref-watcher! this)
state)
с черточкой, потому что
(defprotocol IDeref
"Protocol for adding dereference functionality to a reference."
(-deref [o]
"Returns the value of the reference o."))
(defn deref
"Also reader macro: @var/@atom/@delay. Returns the
most-recently-committed value of ref. When applied to a var
or atom, returns its current state. When applied to a delay, forces
it if not already forced. See also - realized?."
[o]
(-deref o))
если сильно захотеть то можно и так почитать 🙂 https://clojurians-log.clojureverse.org/clojure-russia/2017-01-10.html
The leading dash is a convention in two places:
- gen-class methods implemented by Clojure functions (e.g. -main)
- low-level method implementations of built-in protocols in ClojureScript
The dash has no special significance as far as the compiler is concerned, it's just part of the name.
(deftype ES6Iterator [^:mutable s]
Object
(next [_]
(if-not (nil? s)
(let [x (first s)]
(set! s (next s))
#js {:value x :done false})
#js {:value nil :done true})))
может это просто автор реагента делает для себя, (def ^{:private true :const true} cache-key "reagReactionCache")
подскажите, уважаемые, какой-нибудь нормальный способ делать из последовательности вида [A B B A A B A B]
я думаю loop/recur + связку take-while #(= % A) take-while #(= % B)
а, так если А есть то просто сплитить по ним, вот и получатся группы
ну потом пройдись еще раз и раздели листы где болше одного а
(reduce
(fn [r i]
(cond
(not (seq r))
(conj r [i])
(and (seq r)
(= :A (last (last r))))
(conj r [i])
:else
(let [idx (-> r count dec)]
(update r idx conj i))))
[]
[:A :B :B :A :A :B :A :B])
[:A :B :B :A :A :B :A :B :A :B :A :B :B :B :A :A :B]
->>
[[:A] [:B :B :A] [:A] [:B :A] [:B :A] [:B :A] [:B :B :B :A] [:A] [:B]]
а есть какой-нибудь алгоритм, чтобы посчтитать количество комбинаций монет дающих определенную сумму?
1. есть определенный пулл монет: [1 1 5 5 5 10 10 25 25 25 25 50]
2. есть число: x
3. нужно получить все комбинации монет из пула, в сумме дающие <= x
можно
(let [coins [1 1 5 5 5 10 10 25 25 25 25 50]
x 26]
(->> (range (count coins))
(mapcat #(clojure.math.combinatorics/combinations coins (inc %)))
(filter #(->> % (apply +) (>= x)))))
;;=> ((1) (5) (10) (25) (1 1) (1 5) (1 10) (1 25) (5 5) (5 10) (10 10) (1 1 5) (1 1 10) (1 5 5) (1 5 10) (1 10 10) (5 5 5) (5 5 10) (5 10 10) (1 1 5 5) (1 1 5 10) (1 1 10 10) (1 5 5 5) (1 5 5 10) (1 5 10 10) (5 5 5 10) (1 1 5 5 5) (1 1 5 5 10) (1 5 5 5 10))
а может что-то чётче есть?Хотя нет, там есть вторая штука, которую нужно максимизировать, а здесь только все варианты перечислить.
@misha Просто перебором с мемоизацией. комбинации-монет[x, [1 1 5 5 5 10 10 25 25 25 25 50]] = [50]∗комбинации-монет[x-50, [1 1 5 5 5 10 10 25 25 25 25]] ∪ [25]∗комбинации-монет[x-25, [1 1 5 5 5 10 10 25 25 25]] ∪ [25]∗комбинации-монет[x-25, [1 1 5 5 5 10 10 25 25]] ∪ ... ∪ [1]∗комбинации-монет[x-1, [1]] ∪ [1]∗комбинации-монет[x-1, ∅]. Второй аргумент - это всегда subrange от начала до N, так что его можно закодировать числом. ∗ означает "прицепить префикс слева ко всем последовательностям справа".
Комбинаций будет 2^N, а здесь меньше, и решается просто по алгоритму выше рекурсивной функцией.
Z[x, [a1 a2...aN]] = [aN]∗Z[x-aN, [a1 a2...aN-1]] ∪ [aN-1]∗Z[x-aN-1, [a1 a2...aN-2]] ∪ ... ∪ [a2]∗Z[x-a2, [a1]] ∪ [a1]∗Z[x-a1, ∅]
Идея очень простая: есть рюкзак размера N. Есть вещи. Мы берём вещь a1, и решаем задачу "есть рюкзак размера N-a1, как туда можно остальное поместить?", после чего приписываем к результату a1. После этого вещь a1 выкидываем, берём вещь a2, и решаем задачу "есть рюкзак размера N-a2, как туда можно остальное поместить?"...
слушай, а combinations не так сделаны? там правда только 1 длинны комбинации, значит оно не умеет переиспользовать длинне/короче посчитанные комбинации
вообще, у меня задача, посчитать все возможные комбинации из пула штук до определенной длинны (не длиннее самого пула)
а потом было бы еще круче, если бы посчитанное можно было бы подхачить дешевле полного пересчета, для нового пула
Тогда смотри выше определение Z. Если менять пул, то тогда сделать оптимизацию "второй аргумент - число" не получится, но мемоизированный результат можно использовать.
вообще, я так смотрю, что рюкзак-проблема - это именно подогнать комбинацию "под ответ", типа под заданную сумму
я вот выбираю между: "посчитать все комбинации, и потом кверить по хешмапам с результатами" и "считать каждый раз".
мне кажется, мне подходит первое гораздо больше. только вот пересчитывать дофига, и каждый раз, как только "пулл монет" изменяется
The target is to maximize the sum of the values of the items in the knapsack so that the sum of weights in each dimension {\displaystyle d} d does not exceed {\displaystyle W_{d}} W_{d}.
это типа "получить все комбинации удовлетворяющие что-то там, и потом самую четкую из них выбрать", да?
1. есть сет P = [1 2] 2. нужно получить все уникальные комбинации длинной 1- (count P) (без учета порядка [1 2] = [2 1]): [[1][2][1 2]] 3. можно ли получить комбинации для нового сета P1 = [1 1 2] дешевле, чем заново всё пересчитать? [[1][2][1 1][1 2][1 1 2]]
в целом динамическим программированием такие вещи хорошо оптимизируются обычно. вроде и императивщина и не кложа вей, но на fp тоже пишут dp
@dottedmag I think I used b64 serializer from it
самая что ни на есть стейтная императивщина, которая проходит незамеченной потому как в core))
Кэширование результатов чистой функции - не императивщина, так как нет способа различить наличие и отсутствие кэша, кроме как по количеству тепла, выделенному компьютером при вычислении.
эм.. не уверен что понял что ты сказал)) но когда я смотрел алгоритмы DP то как раз обратил внимание по подходу это принцип противоположный FP: как раз вводится общий стейт для рекурсивной процедуры, как раз то от чего FP вроде как абстрагируется
Например, несколько потоков может эту табличку заполнять совместно, и ничего не сломается, пока каждая операция обновления ячейки атомарна.
ну собственно несколько месяцев назад я сюда постил кложе код решающий задачу упаковки методом DP. жаль архива нет (его ведь нет?) посмотреть нельзя. но помню меня поразил он. потом гуглил автора: русский, сейчас в панасонике чтото-там волновое на функциональщине пишет.. во как
может через 2 недели как раз анонсируют CLJ <> C муахаха, вот будет тема. Хотя хз зачем :thinking_face:
Ни приходилось сталкиваться с задачей сохранения позиции скроллирую в компонентах контейнера при переходе назад(по истории переход юзера)
>Такой болезнью много аппов страдает fixed
Clojure on Go VM
> Michael Nygard @mtnygard Jan 16 > Oh man... cool stuff coming but I can't announce it for 2 weeks. Aargghh. > Michael Nygard @mtnygard 6h6 hours ago > I’m having fun getting fitted for a kilt and jacket. All new to me.