This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2020-12-17
Channels
- # adventofcode (56)
- # announcements (1)
- # aws (6)
- # beginners (127)
- # bristol-clojurians (1)
- # calva (29)
- # cider (7)
- # clj-kondo (37)
- # cljdoc (20)
- # cljsrn (7)
- # clojure (159)
- # clojure-europe (67)
- # clojure-italy (23)
- # clojure-nl (4)
- # clojure-provo (3)
- # clojure-uk (18)
- # clojurescript (19)
- # code-reviews (59)
- # community-development (105)
- # conjure (6)
- # core-async (16)
- # core-logic (1)
- # cursive (21)
- # datomic (19)
- # defnpodcast (1)
- # emacs (8)
- # events (2)
- # fulcro (71)
- # graalvm (23)
- # jobs-discuss (1)
- # kaocha (5)
- # luminus (5)
- # meander (16)
- # nrepl (32)
- # off-topic (6)
- # pathom (159)
- # pedestal (3)
- # reagent (14)
- # reitit (8)
- # reveal (12)
- # rewrite-clj (9)
- # shadow-cljs (169)
- # spacemacs (16)
- # specter (2)
- # sql (19)
- # tools-deps (36)
- # vim (6)
> "Why to type [-1 0 1]
when we can just simply (range -1 2)
"
> -- brainless myself
Yes, but I prefer literals whenever it’s possible. Usually they are easier to read and catch.
you misread ... that's sarcasm
Ohh :)))
hahaha
i did the same
(take 3 (map dec (range)))
hehe, I was thinking of using that instead of adding deltas to get neighbours (I do use dec and inc in my solution), so I was actually half serious 😉
i.e., (untested)
(defn cell-neighbors [cell]
(remove #{cell}
(apply combo/cartesian-product
(map (juxt dec identity inc) cell))))
This should work for any number of dimensions.Mensa dictionary entry 8: > Sarchasm : The gulf between the author of sarcastic wit and the person > who doesn’t get it.
I did not realize that I could use the multi-arity of = .. thanks !
Hey I like your typeface! The ligature looks so amazing. What’s the typeface you’re using?
it looks like firacode
Thanks!
Can you copy the code, wondering what it does 🙂
hard coded vector of [-1, 0 1]
At compile time?
Depending on the n?
(defmacro adjacent [n]
(let [ds (repeatedly n #(gensym "d"))
bindings (mapcat #(-> [% [-1 0 1]]) ds)]
`(for [~@bindings :when (not= 0 ~@ds)] [~@ds])))
(defn neighbours [adjacent loc]
(map #(mapv + loc %) adjacent))
(partial neighbours (adjacent 3))
it calculates adjacent locations for n-dimension space.
You can use it like
(def neighbours-3d (partial neighbours (adjacent 3)))
(neighbours-3d [0 0 0])
Yeah, the for
could be replaced by the list of literal of relative neighbor positions at compile time.
@U8MJBRSR5 can you show how to to do that?
I am still at work, I will try to do that after.
I came up with this
(defmacro adjacent [n]
(let [ds (repeatedly n #(gensym "d"))
bindings (mapcat #(-> [% [-1 0 1]]) ds)]
(eval `(vec (for [~@bindings :when (not= 0 ~@ds)] [~@ds])))))
you don’t need the eval, just evaluate the sequence (and put it in a vector) outside of the backtick.
oh .. I see, if you want to use for
you can’t have a dynamic n
, you will have to use map
with recursion … or even better, comp/cartesian-product
well .. it works with eval
so why not.
@U067R559Q you can use this to generate the neighbors:
(defn adjacents [dimension]
(-> (iterate (fn [coords]
(mapcat (fn [coord]
(map (fn [x]
(conj coord x))
[-1 0 1]))
coords))
[[]])
(nth dimension)
(->> (remove (fn [coord]
(every? #{0} coord))))
vec))
#_(adjacents 2)
(defmacro neighbors [& coords]
(let [adj (adjacents (count coords))]
`(->> ~adj
(mapv (partial mapv + ~(vec coords))))))
#_(macroexpand-1 '(neighbors x y))
#_(neighbors 5 10)
Yeah, it’s also a good option, I saw it in @U076FM90B’s solution. However, I’m happy with two different functions I have. The macro is just for fun.
btw, I found
(defn ~name ~@pre-args ~args ~(apply (eval (list
fn args expr)) args))` in clojure.core.
yeah, eval is ok during compile time
also, simple approach like this
(defn neighbours-4d [[x y z w]]
(for [dx [-1 0 1] dy [-1 0 1] dz [-1 0 1] dw [-1 0 1] :when (not= 0 dx dy dz dw)]
[(+ x dx) (+ y dy) (+ z dz) (+ w dw)]))
works faster then
(defn neighbours [adjacent loc]
(map #(mapv + loc %) adjacent))
even with predefined adjacent.I made another version, for fun:
(defmacro neighbors [& coords]
(let [dimension (count coords)
adj (adjacents dimension)
coord-vars (repeatedly dimension #(gensym "coord"))
local-vars (repeatedly dimension #(gensym "local"))]
`(let [~@(interleave coord-vars coords)]
(mapv (fn [[~@local-vars]]
[~@(map (fn [lv cv]
`(+ ~lv ~cv))
local-vars
coord-vars)])
~adj))))
(neighbors 5 10)
I have lost my steam. Yesterday I had this whole-day testing session at my day work and it left me totally wasted. Stared at step 2 for hours without even understanding the problem. Only one gold star for me there. Today feels the same, with step 1. Might be enjoying this as a spectator sport from now. 😃
hehe yeah I also feel like that after you lose one day is hard to recover
and I don't really have 1 hour or so every day to dedicate to this sadly (or I only do in the evening but I'm too tired to think)
maybe it should have a couple of breaks to allow people to get back on top of it
I must say that picking aoc up was a great choice of mine. I've learnt so much from tackling the problems, from looking at your solutions, reading your comments, getting your feedback on my solutions, discussing the problems with you, discussing the solutions with you, I could go on. Spent tons of time on it. Do not regret one second. (Except yesterday, when I should have been wiser than to just sit there, staring at my failed reducing, instead of catching some needed sleep.)
yeah absolutely it's great for learning more about Clojure (or any other language tbf)
Indeed!
That’s me !!!
I never really follow sample inputs, just use them to check if my algo gives the correct output for them
jajaja
Took a look at past results. Interesting to see what day into the month there was an order of magnitude fewer gold stars than the first day: 2020: day 17 2019: day 14 2018: day 18 2017: didn't happen, but got close on day 25 2016: didn't happen, but got close on day 25 2015: day 19
To get the gold star for day 25 you don't have new puzzle, it is a bonus star for solving all puzzles of the year
yes, the colors are not consistent, one receives two gold stars per day. But there are silver and gold stars on stats page https://adventofcode.com/2020/stats