This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2023-12-18
Channels
- # adventofcode (12)
- # asami (2)
- # babashka (95)
- # beginners (17)
- # biff (5)
- # calva (1)
- # clojure (90)
- # clojure-europe (15)
- # clojure-nl (1)
- # clojure-norway (8)
- # clojure-uk (6)
- # clojuredesign-podcast (2)
- # clojurescript (34)
- # clr (1)
- # community-development (42)
- # cursive (11)
- # data-science (1)
- # datomic (13)
- # graalvm (5)
- # hoplon (2)
- # hyperfiddle (32)
- # off-topic (1)
- # pathom (6)
- # releases (1)
- # shadow-cljs (25)
- # squint (4)
- # xtdb (10)
The first part was solved with BFS, but as soon as I saw the second part it got pretty obvious — BFS wouldn’t help. Also I got surprised to be first in the thread https://github.com/zelark/AoC/blob/master/src/zelark/aoc_2023/day_18.clj
https://github.com/rjray/advent-2023-clojure/blob/master/src/advent_of_code/day18.clj All the cool kids were using Shoelace Formula and Pick's Theorem. So I did, too. I had started out part 1 with drawing the trench and using even/odd to fill it in. Got the example right, but the actual puzzle wrong. That's when I learned about Shoelace/Pick's.
hurray! @UEF091BP0’s solution worked almost instantly in squint! https://squint-cljs.github.io/squint/?boilerplate=https%3A%2F%2Fgist.githubusercontent.com%2Fborkdude%2Fcf94b492d948f7f418aa81ba54f428ff%2Fraw%2Fa6e9992b079e20e21d753e8c75a7353c5908b225%2Faoc_ui.cljs&repl=true&src=OzsgSGVscGVyIGZ1bmN0aW9uczoKOzsgKGZldGNoLWlucHV0IHllYXIgZGF5KSAtIGdldCBBT0MgaW5wdXQKOzsgKGFwcGVuZCBzdHIpIC0gYXBwZW5kIHN0ciB0byBET00KOzsgKHNweSB4KSAtIGxvZyB4IHRvIGNvbnNvbGUgYW5kIHJldHVybiB4Cgo7OyBvcmlnaW5hbCBzb2x1dGlvbjoKOzsgaHR0cHM6Ly9naXRodWIuY29tL3JqcmF5L2FkdmVudC0yMDIzLWNsb2p1cmUvYmxvYi9tYXN0ZXIvc3JjL2FkdmVudF9vZl9jb2RlL2RheTE4LmNsagoKOzsgUmVtZW1iZXIgdG8gdXBkYXRlIHRoZSB5ZWFyIGFuZCBkYXkgaW4gdGhlIGZldGNoLWlucHV0IGNhbGwuCihkZWYgaW5wdXQgKGpzLWF3YWl0IChmZXRjaC1pbnB1dCAyMDIzIDE4KSkpCgooZGVmIGRlbHRhIHs6VSBbLTEgMF0gOlIgWzAgMV0gOkQgWzEgMF0gOkwgWzAgLTFdfSkKCjs7IFBhcnNlIGFuIGluc3RydWN0aW9uIGxpbmUgaW50byBhIHR1cGxlIG9mIChkaXJlY3Rpb24sIHN0ZXBzLCBjb2xvcikuCihkZWZuLSBwYXJzZS1pbnN0IFtsaW5lXQogIChsZXQgW1tfIGRpciBsZW4gY29sb3JdIChyZS1tYXRjaGVzICMiXihbVVJETF0pIChcZCspIFwoIyhbMC05YS1mXXs2fSlcKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUpXQogICAgKGxpc3QgZGlyIChwYXJzZS1sb25nIGxlbikgY29sb3IpKSkKCjs7IERvIHRoZSAic2hvZWxhY2UiIGNhbGN1bGF0aW9uLgooZGVmbi0gc2hvZWxhY2UgW1tbeTEgeDFdIFt5MiB4Ml1dXQogICgtICgqIHgxIHkyKSAoKiB5MSB4MikpKQoKOzsgRG8gdGhlIGZ1bGwgY2FsY3VsYXRpb24uIFVzZSBvdmVybGFwcGluZyBwYXJ0aXRpb25pbmcgdG8gaXRlcmF0ZSBjYWxscyB0bwo7OyBgc2hvZWxhY2VgIG92ZXIgYWRqYWNlbnQgcGFpcnMuIFRoZW4gYWRkIGluIGEgY2FsbCBiZXR3ZWVuIHRoZSBsYXN0IGFuZCBmaXJzdAo7OyBwb2ludHMuCihkZWZuLSBjYWxjdWxhdGUgW3BvaW50c10KICAoKyAoc2hvZWxhY2UgKGxpc3QgKGxhc3QgcG9pbnRzKSAoZmlyc3QgcG9pbnRzKSkpCiAgICAocmVkdWNlICsgKG1hcCBzaG9lbGFjZSAocGFydGl0aW9uIDIgMSBwb2ludHMpKSkpKQoKOzsgRmluZCB0aGUgcG9pbnRzIHRoYXQgZGVzY3JpYmUgdGhlIHBvbHlnb25zLCBiYXNlZCBvbiB0aGUgbGlzdCBvZiBpbnN0cnVjdGlvbnMKOzsgZ2l2ZW4uIE9uY2UgYWxsIGFyZSBmb3VuZCwgY2FsbCBgY2FsY3VsYXRlYCBhbmQgYXBwbHkgdGhlIGxhc3QgYml0IG9mIG1hdGgKOzsgdG8gZ2V0IHRoZSBhbnN3ZXIuCihkZWZuLSBzb2x2ZSBbaW5zdHNdCiAgKGxvb3AgW1tpbnN0ICYgaW5zdHNdIGluc3RzLHBvbHkgKGxpc3QgWzAgMF0pLHBfY250IDBdCiAgICAoaWYgKG5pbD8gaW5zdCkKICAgICAgKGluYyAocXVvdCAoKyAoY2FsY3VsYXRlIChyZXZlcnNlIHBvbHkpKSBwX2NudCkgMikpCiAgICAgIChsZXQgW1tkaXIgbGVuXSBpbnN0CiAgICAgICAgICAgIGxwIChmaXJzdCBwb2x5KQogICAgICAgICAgICBuZXdwb3MgKG1hcHYgKyBscCAobWFwdiAqIFtsZW4gbGVuXSAoZ2V0IGRlbHRhIGRpcikpKV0KICAgICAgICAocmVjdXIgaW5zdHMgKGNvbnMgbmV3cG9zIHBvbHkpICgrIHBfY250IGxlbikpKSkpKQoKKGRlZm4gcGFydC0xCiAgIkRheSAxOCBQYXJ0IDEiIAogIFtpbnB1dF0KICAoLT4%2BIGlucHV0CiAgICBzdHIvc3BsaXQtbGluZXMKICAgIChtYXB2IHBhcnNlLWluc3QpCiAgICBzb2x2ZSkpCgooY29tbWVudAogIChwYXJ0LTEgaW5wdXQpCiAgKQoKOzsgRm9yIHBhcnQgMiwgd2UgZ2V0IGRpcmVjdGlvbiBmcm9tIHRoZSBsYXN0IGRpZ2l0IG9mIHRoZSAiY29sb3IiIHZhbHVlLiBUaGlzCjs7IHdpbGwgY29tZSBhcyBhIHN0cmluZywgc28gbWFwIHRoZXNlIHRvIHRoZSBkaXJlY3Rpb24ga2V5d29yZHMuCihkZWYgZ2V0LWRpciB7IjAiIDpSLCIxIiA6RCwiMiIgOkwsIjMiIDpVfSkKCjs7ICJGaXgiIGFuIGluc3RydWN0aW9uIGJ5IHJlcGxhY2luZyBpdCB3aXRoIGRpcmVjdGlvbiBhbmQgc3RlcC12YWx1ZSBhcyBwdWxsZWQKOzsgZnJvbSB0aGUgaGV4YWRlY2ltYWwgImNvbG9yIiB2YWx1ZS4KKGRlZm4tIGZpeC1pbnN0IFtbXyBfIGNvbG9yXV0KICAobGV0IFtbXyB2YWwgZGlyXSAocmUtbWF0Y2hlcyAjIihbMC05YS1mXXs1fSkoWzAtM10pIiBjb2xvcildCiAgICAobGlzdCAoZ2V0IGdldC1kaXIgZGlyKSAoanMvcGFyc2VJbnQgdmFsIDE2KSkpKQoKKGRlZm4gcGFydC0yCiAgIkRheSAxOCBQYXJ0IDIiIAogIFtpbnB1dF0KICAoLT4%2BIGlucHV0CiAgICBzdHIvc3BsaXQtbGluZXMKICAgIChtYXB2IHBhcnNlLWluc3QpCiAgICAobWFwdiBmaXgtaW5zdCkKICAgIHNvbHZlKSk%3D
I was not familiar to shoelaces so I just went with adding-subtracting overlapping rectangles until I got the correct total area. https://github.com/erdos/advent-of-code/blob/master/2023/day18.clj
Just posted another neat version https://github.com/zelark/AoC/blob/6015541a8a54711ccf46c8ad140269542b9b13f7/src/zelark/aoc_2023/day_18_neat.clj#L8-L15
cool, here is @U2E1D7WUB’s solution https://squint-cljs.github.io/squint/?boilerplate=https%3A%2F%2Fgist.githubusercontent.com%2Fborkdude%2Fcf94b492d948f7f418aa81ba54f428ff%2Fraw%2Fa6e9992b079e20e21d753e8c75a7353c5908b225%2Faoc_ui.cljs&repl=true&src=OzsgSGVscGVyIGZ1bmN0aW9uczoKOzsgKGZldGNoLWlucHV0IHllYXIgZGF5KSAtIGdldCBBT0MgaW5wdXQKOzsgKGFwcGVuZCBzdHIpIC0gYXBwZW5kIHN0ciB0byBET00KOzsgKHNweSB4KSAtIGxvZyB4IHRvIGNvbnNvbGUgYW5kIHJldHVybiB4Cgo7OyBvcmlnaW5hbCBzb2x1dGlvbjoKOzsgaHR0cHM6Ly9naXRodWIuY29tL2VyZG9zL2FkdmVudC1vZi1jb2RlL2Jsb2IvZmUzMDZiNjFlMWMwMTcyZTY2YWM2NDYwZWEyZGM0N2FiOTUyZDBiNS8yMDIzL2RheTE4LmNsagoKOzsgUmVtZW1iZXIgdG8gdXBkYXRlIHRoZSB5ZWFyIGFuZCBkYXkgaW4gdGhlIGZldGNoLWlucHV0IGNhbGwuCihkZWYgaW5wdXQgKGpzLWF3YWl0IChmZXRjaC1pbnB1dCAyMDIzIDE4KSkpCgooZGVmbiBwYXJzZSBbbGluZV0KICAobGV0IFtbXyBbYV0gYiBjXSAocmUtbWF0Y2hlcyAjIiguKSAoXGQrKSBcKCMoLns2fSlcKSIgbGluZSldCiAgICBbYSAocGFyc2UtbG9uZyBiKSBjXSkpCgooZGVmIHBsYW4gKG1hcHYgcGFyc2UgKHN0ci9zcGxpdC1saW5lcyBpbnB1dCkpKQoKKGRlZm4gc29sdmUxIFtwbGFuXQogIChzZWNvbmQgKHJlZHVjZSAoZm4gW1toIGFyZWFdIFtkaXIgbGVuXV0KICAgICAgICAgICAgICAgICAgICAoY2FzZSBkaXIKICAgICAgICAgICAgICAgICAgICAgIFxVIFsoLSBoIGxlbikgYXJlYV0KICAgICAgICAgICAgICAgICAgICAgIFxEIFsoKyBoIGxlbikgKCsgYXJlYSBsZW4pXQogICAgICAgICAgICAgICAgICAgICAgXEwgW2ggKCsgYXJlYSBsZW4gKCogaCBsZW4pKV0KICAgICAgICAgICAgICAgICAgICAgIFxSIFtoICgtIGFyZWEgKCogaCBsZW4pKV0pKQogICAgICAgICAgICAgICAgICBbMCAxXSBwbGFuKSkpCgooY29tbWVudAogICgtPj4gcGxhbiBzb2x2ZTEpKQoKKGRlZm4gbWFwLXBsYW4gW1tfIF8gZGlyXV0KICBbKGdldCAoemlwbWFwICIwMTIzIiAiUkRMVSIpIChsYXN0IGRpcikpCiAgIChqcy9wYXJzZUludCAoc3RyL2pvaW4gKGJ1dGxhc3QgZGlyKSkgMTYpXSkKCihjb21tZW50CiAgKC0%2BPiBwbGFuIChtYXB2IG1hcC1wbGFuKSBzb2x2ZSkp

First part implemented directly, with constructing string field and filling the internal area: https://gist.github.com/Ivana-/d3a3f6017e0cdd605a3fe8e03ab8012f But for the second part found smart reduction, 10 lines of code, works in less than 2 ms 😀
(->> input
str/split-lines
(reduce (fn [[r s] l]
(let [[_ _ c] (str/split l #"\s+")
n (long (BigInteger. (subs c 2 7) 16))]
(case (get c 7)
\3 [(- r n) s]
\1 [(+ r n) (+ s n)]
\2 [r (+ s (* n r) n)]
\0 [r (- s (* n r))])))
[0 1]))
Maybe I may participate in codegolf with it, in all the three nominations: code speed (performance), RAM usage and code symbols amount 😁
Looking to the @U2E1D7WUB’s code I bielive that ideas are flying in a space literally, amost char to char the sameStill on part-1, went for flood-fill which was a trap. Anyway here is the image of the trench from part 1.
awful and overthought... https://github.com/genmeblog/advent-of-code/blob/master/src/advent_of_code_2023/day18.clj
Didn’t know Shoelace or even realized what algorithm to look for, but it seemed to make sense to cut up the shape into distinct vertical slices of equal groups of horizontal segments (or vice versa). It works and is fast, but unfortunately made me write quite a bit of rather vulnerable code… So, yes, I will definitely study the Shoelace algorithm and your examples for future benefit. 🙂