adventofcode

2023-12-04T12:23:05.925209Z

Feature request: Hoplon support πŸ˜‰ (kidding, this is not really necessary) A more serious feature request: could the eval keybind be customized? My window manager captures Windows key + Enter and opens a new terminal so the key never gets to the browser 😞

borkdude 2023-12-04T12:30:20.951779Z

We could totally customize it. Any ideas about how, via a query param or something in localstorage or so?

borkdude 2023-12-04T12:31:07.702339Z

maybe it's better not to do it via query param since when you share the example, someone else will get the different keybinding as well

πŸ‘ 1
2023-12-04T12:32:04.103769Z

Local storage seems better.

2023-12-04T12:32:55.898949Z

Is there a keybind for the "Compile button"?

borkdude 2023-12-04T12:36:02.739769Z

alt + enter compiles the whole editor

2023-12-04T12:38:58.524229Z

Ok, that helps a lot thanks2

borkdude 2023-12-04T12:48:07.490869Z

I guess we could change "modifier" as an option

borkdude 2023-12-04T12:54:19.043249Z

@mynomoto I pushed a change which lets you do: localStorage.setItem("editor.modifier", "Ctrl") in the console, after a refresh you will have Ctrl + enter as the form evaluating key

borkdude 2023-12-04T12:56:34.709059Z

we can make more configurations (since now Alt + enter overlaps I think), let me know if that is useful to you

2023-12-04T12:58:27.186249Z

Ok, I will. Just tried, doesn't seem live yet.

borkdude 2023-12-04T13:00:28.633579Z

you need to execute that snipped in the playground, not in any other website

borkdude 2023-12-04T13:06:57.349549Z

weird, it doesn't seem to work on github pages, but it did locally ;)

borkdude 2023-12-04T13:09:22.925999Z

seems the page wasn't deployed somehow: https://github.com/squint-cljs/squint/deployments

borkdude 2023-12-04T13:10:46.826209Z

ah now it's queued with another edit

borkdude 2023-12-04T13:11:45.674069Z

now it works

2023-12-04T13:54:13.149439Z

This is very useful, works for me now too thanks3

πŸ‘ 1
Arno Jacobs 2023-12-04T14:24:58.647109Z

I'm still a bit of a novice with Clojure. I use Advent of Code to gain more experience with Clojure. For my convenience, I programmed the first four days in 'vanilla' Haskell. Then I do my best to code a neat Clojure solution and I have now successfully built day 1 and 2. All my AoC2023 code is here: https://github.com/Arno65/Advent-of-Code-2023

πŸ‘ 2
πŸ‘πŸΌ 1
πŸ‘€ 2
πŸ™ 1
pez 2023-12-04T14:34:58.051879Z

I had a look at your day-1 solution and it is really super sweet. It looks like you didn’t run into the overlapping problem at all with that approach?

πŸ™‚ 1
pez 2023-12-04T14:37:36.838369Z

From the look of it it also seems like your workflow is to run the program from start every time you have a change? If you like I can show you a more interactive workflow.

Arno Jacobs 2023-12-04T14:39:11.259079Z

You mean the "twone" as 2 and 1 overlapping issue? At first I did code the wrong overlapping solution πŸ™‚

pez 2023-12-04T14:42:06.251119Z

I see. I did too, and I was stuck there for quite a while. Got a bit angry with AOC even. πŸ˜ƒ

Arno Jacobs 2023-12-04T14:42:10.707709Z

@pez Sorry, I don't understand the remark on the workflow.

pez 2023-12-04T14:46:06.150949Z

About workflow. I could be wrong, but the way the program is structured indicates that you are not working β€œin the REPL”, as Clojure allows you to do. Hard to explain, but just a few minutes ago there was a video published on Youtube, demonstrating interactive programming with Clojure. https://www.youtube.com/watch?v=4igO7Qbyj9o I haven’t watched it yet, but I’ve seen other presentations by @pavel.klavik so think I can recommend it unseen.

πŸ‘ 1
pez 2023-12-04T14:49:44.821619Z

My offer stands. We can jump in to a huddle quickly and I can show you what I mean.

Arno Jacobs 2023-12-04T14:50:26.342869Z

@pez. 0K. Thanks. You're right there. I've got a REPL working in VSCode. But the way I do it now forces me to code as good as possible right from the start. And the more mistakes I make, the more frustrated I get BUT also the more I get focussed on the code and coding.

pez 2023-12-04T14:51:58.681239Z

Gotcha. I know other Clojure coders who choose to work less interactively.

Arno Jacobs 2023-12-04T14:56:06.279799Z

I do like the REPL (using Calva & deps.edn) in combination with my VSCode. I use it to play around and test all kind of functions. Thanks voor the YT video, and I'll watch that later. (At the moment I'm not creating production Clojure code.)

pez 2023-12-04T14:58:55.612159Z

If you ever need help with Calva, welcome to the #calva channel. πŸ˜ƒ

πŸ‘ 1
pez 2023-12-04T20:39:54.442899Z

My day 3, part-1 solution takes 7 seconds to calculate the wrong answer…

alpox 2023-12-05T10:24:57.126819Z

Done now too! Part 2 was actually easy given the datastructure I parsed in part 1. Phew, lucky me πŸ˜„

pez 2023-12-05T10:27:03.480189Z

Since we both reported that we felt we over-engineered part 1, @alpox, I had a feeling you would too find part 2 pretty comfortable. πŸ˜ƒ

pez 2023-12-04T20:41:28.235569Z

No, I was running it with day 2 input. It takes 1 second to calculate the wrong answer. πŸ˜ƒ

2023-12-04T20:41:53.869359Z

But now you don't have a blank canvas anymore πŸ’ͺ Mine is still blank.

Ellis 2023-12-04T20:42:31.735389Z

If you've somehow avoided all the talk about it, Day 3 is rough

πŸ™ 1
pez 2023-12-04T20:43:07.324489Z

It’s far from blank. A pretty huge program, actually. I think maybe I coded the first thing I thought of, instead of following @mauricio.szabo’s example, coding the simplest thing I could think of.

pez 2023-12-04T20:44:24.480119Z

I have somehow missed the part of it being rough. Feels a bit better knowing that. Thanks, @elken! πŸ™

Ellis 2023-12-04T20:45:03.083289Z

Especially given it's so early too, a lot of people have said the same πŸ˜„

pez 2023-12-04T20:45:33.505039Z

I’m again where my solution works for the test data. I’ll have a look at the input data and see if I can see something. πŸ˜ƒ

pez 2023-12-04T20:48:20.535139Z

Day 1 must be the roughest day 1 ever, so maybe only the toughest are still at it day 3? πŸ˜ƒ

Raghav 2023-12-04T20:49:47.064589Z

I somehow managed part 1 and literally felt like throwing my laptop when I read part 2.

pez 2023-12-04T20:50:48.597289Z

Oh, no!

jurjanpaul 2023-12-04T21:10:19.066329Z

I had initially painted myself in a corner by parsing to a map with the numbers as key, which obviously wouldn’t deal appropriately with the possibility that the same number may appear multiple times… (could it be that I’m not the only one making that unnecessary mistake?)

pez 2023-12-04T21:15:15.713719Z

I bet a lot of people make that mistake. That’s not my mistake, but I thank you for suggesting it, @jurjanpaul502! ❀️

πŸ‘ 1
pez 2023-12-04T21:16:46.176729Z

I took three rows of input data and find a $327 at the end of one of the rows that is missing from my answer. So I guess now I’m set for finding my issue. πŸ˜ƒ

pez 2023-12-04T21:17:31.376669Z

Happy for the Calva debugger in situations like this.

pez 2023-12-04T21:36:51.015419Z

Part 1 done. So let’s see if my laptop will be in danger now…

πŸ˜… 1
πŸŽ‰ 2
alpox 2023-12-04T21:41:27.068709Z

I just finished part 1. I feel like I made it too complex though... I wont read part two before sleep to keep my good dreams πŸ˜…

pez 2023-12-04T22:05:34.832779Z

Done with part 2. πŸŽ‰ Maybe it payed off making part-1 rigorously. πŸ˜ƒ

2023-12-04T21:59:23.363219Z

Am I getting dumber, or are people finding this years early days much harder than previous years ?

βž• 6
βœ… 1
liebs 2023-12-04T22:01:21.225909Z

I am absolutely having that experience though so far I have only found the time for day one.

liebs 2023-12-04T22:03:19.075339Z

Good summary for me so far

Tony B 2023-12-05T00:19:51.766829Z

Day 3 felt like a day 8 or 10 to me in terms of difficulty

rfisher 2023-12-05T00:20:36.401609Z

Yeah, 1 and 3 where more like we usually get for 7 and 8. Most years 1 is a one-liner.

2023-12-04T23:35:47.352979Z

Trick question. We all got dumber.

1
2023-12-04T05:53:14.792479Z

Day 04 - Solutions

πŸŽ‰ 2
pez 2023-12-06T11:12:57.784679Z

My solution in https://squint-cljs.github.io/squint/?repl=true&boilerplate=https%3A%2F%2Fgist.githubusercontent.com%2Fborkdude%2Fcf94b492d948f7f418aa81ba54f428ff%2Fraw%2Fa6e9992b079e20e21d753e8c75a7353c5908b225%2Faoc_ui.cljs&src=OzsgSGVscGVyIGZ1bmN0aW9uczoKOzsgKGZldGNoLWlucHV0IHllYXIgZGF5KSAtIGdldCBBT0MgaW5wdXQKOzsgKGFwcGVuZCBzdHIpIC0gYXBwZW5kIHN0ciB0byBET00KOzsgKHNweSB4KSAtIGxvZyB4IHRvIGNvbnNvbGUgYW5kIHJldHVybiB4CgooZGVmbiBpbnRlcnNlY3Rpb24gWyYgeHNdCiAgKHJlZHVjZSAoZm4gW2FjYyBzXQogICAgICAgICAgICAoc2V0IChmaWx0ZXIgIyhjb250YWlucz8gYWNjICUpIHMpKSkgeHMpKQoKKGNvbW1lbnQKICAoaW50ZXJzZWN0aW9uIChzZXQgWzEgMiAzXSkgKHNldCBbMSAyXSkpCiAgKQoKOzsgUmVtZW1iZXIgdG8gdXBkYXRlIHRoZSB5ZWFyIGFuZCBkYXkgaW4gdGhlIGZldGNoLWlucHV0IGNhbGwuCihkZWYgbXktaW5wdXQgKC0%2BPiAoanMtYXdhaXQgKGZldGNoLWlucHV0IDIwMjMgNCkpCiAgICAgICAgICAgICBzdHIvc3BsaXQtbGluZXMpKQoKKGRlZiBleGFtcGxlLWlucHV0LTEKICBbIkNhcmQgMTogNDEgNDggODMgODYgMTcgfCA4MyA4NiAgNiAzMSAxNyAgOSA0OCA1MyIKICAgIkNhcmQgMjogMTMgMzIgMjAgMTYgNjEgfCA2MSAzMCA2OCA4MiAxNyAzMiAyNCAxOSIKICAgIkNhcmQgMzogIDEgMjEgNTMgNTkgNDQgfCA2OSA4MiA2MyA3MiAxNiAyMSAxNCAgMSIKICAgIkNhcmQgNDogNDEgOTIgNzMgODQgNjkgfCA1OSA4NCA3NiA1MSA1OCAgNSA1NCA4MyIKICAgIkNhcmQgNTogODcgODMgMjYgMjggMzIgfCA4OCAzMCA3MCAxMiA5MyAyMiA4MiAzNiIKICAgIkNhcmQgNjogMzEgMTggMTMgNTYgNzIgfCA3NCA3NyAxMCAyMyAzNSA2NyAzNiAxMSJdKQoKKGRlZm4gcGFyc2UtY2FyZCBbbGVuZ3RoIGNhcmRdCiAgKGxldCBbYy1pZCAocGFyc2UtbG9uZyAoc2Vjb25kIChyZS1maW5kICMiXkNhcmQgKyhcZCspOiIgY2FyZCkpKQogICAgICAgIFtfIHdpbm5pbmctcyBtaW5lLXNdIChzdHIvc3BsaXQgY2FyZCAjIjogK3wgK1x8ICsiKQogICAgICAgIFt3aW5uaW5nIG1pbmVdIChtYXAgIyhzZXQgKHN0ci9zcGxpdCAlICMiICsiKSkgW3dpbm5pbmctcyBtaW5lLXNdKQogICAgICAgIG1hdGNoZXMgKGNvdW50IChpbnRlcnNlY3Rpb24gd2lubmluZyBtaW5lKSldCiAgICB7OmNhcmQgYy1pZAogICAgIDpjb3VudCBtYXRjaGVzCiAgICAgOmNvbGxlY3RzIChmaWx0ZXJ2ICMoPj0gbGVuZ3RoICUpIChyYW5nZSAoaW5jIGMtaWQpICgrIChpbmMgYy1pZCkgbWF0Y2hlcykpKX0pKQoKKGNvbW1lbnQKICAocGFyc2UtY2FyZCA0ICJDYXJkIDE6IDQxIDQ4IDgzIDg2IDE3IHwgODMgODYgIDYgMzEgMTcgIDkgNDggNTMiKQogIDo9CiAgezpjYXJkIDEsOmNvdW50IDQsOmNvbGxlY3RzIFsyIDMgNF19CiAgKHBhcnNlLWNhcmQgMSAiQ2FyZCA1OiA4NyA4MyAyNiAyOCAzMiB8IDg4IDMwIDcwIDEyIDkzIDIyIDgyIDM2IikKICA6PQogIHs6Y2FyZCA1LDpjb3VudCAwLDpjb2xsZWN0cyBbXX0KICA6cmNmKQoKKGRlZm4gcGFyc2UtY2FyZHMgW2lucHV0XQogIChtYXAgKHBhcnRpYWwgcGFyc2UtY2FyZCAoY291bnQgaW5wdXQpKSBpbnB1dCkpCgooZGVmbiBiaXQtc2hpZnQtbGVmdCBbeCB5XQogIChqcy9ldmFsIChzdHIgeCAiIDw8ICIgeSkpKQoKKGNvbW1lbnQKICAoYml0LXNoaWZ0LWxlZnQgOCAyKSkKCihkZWZuIHBhcnQtMSBbaW5wdXRdCiAgKC0%2BPiBpbnB1dAogICAgcGFyc2UtY2FyZHMKICAgIChtYXAgOmNvdW50KQogICAgKGtlZXAgIyh3aGVuIChwb3M%2FICUpIChkZWMgJSkpKQogICAgKG1hcCAjKGJpdC1zaGlmdC1sZWZ0IDEgJSkpCiAgICAocmVkdWNlICspKSkKCihjb21tZW50CiAgKHBhcnQtMSBleGFtcGxlLWlucHV0LTEpIDo9IDEzCiAgKGNvbW1lbnQKICAgIChkZWYgbXktaW5wdXQgKHV0aWwvbGluZXMgNCkpCiAgICAodGltZQogICAgICAocGFydC0xIG15LWlucHV0KSkKICAgIDpyY2YpKQoKKGRlZm4gZ2V0LWNvdW50IFtjYXJkLT5jb2xsZWN0cyBjYXJkXQogIChpbmMgKHJlZHVjZSArIDAgKG1hcCAocGFydGlhbCBnZXQtY291bnQgY2FyZC0%2BY29sbGVjdHMpIChnZXQgY2FyZC0%2BY29sbGVjdHMgY2FyZCkpKSkpCgooZGVmbiBjb3VudC1jYXJkcyBbY2FyZC0%2BY29sbGVjdHNdCiAgKHJlZHVjZSArIDAgKG1hcCAocGFydGlhbCBnZXQtY291bnQgY2FyZC0%2BY29sbGVjdHMpIChrZXlzIGNhcmQtPmNvbGxlY3RzKSkpKQoKKGNvbW1lbnQKICAoZGVmIGV4YW1wbGUtaW5wdXQtMiBleGFtcGxlLWlucHV0LTEpCiAgKGRlZiBjb2xsZWN0aW9uICgtPj4gZXhhbXBsZS1pbnB1dC0yCiAgICAgICAgICAgICAgICAgICAgcGFyc2UtY2FyZHMKICAgICAgICAgICAgICAgICAgICAoaW50byB7fSAobWFwIChqdXh0IDpjYXJkIDpjb2xsZWN0cykpKSkpCiAgY29sbGVjdGlvbiA6PSB7MSBbMiAzIDQgNV0sMiBbMyA0XSwzIFs0IDVdLDQgWzVdLDUgW10sNiBbXX0KICAoc3B5IChnZXQtY291bnQgY29sbGVjdGlvbiAxKSkKICAoY291bnQtY2FyZHMgY29sbGVjdGlvbikgOj0gMzAKICAocmVkdWNlICsgMCBbXSkKICA6cmNmKQoKCihkZWZuIHBhcnQtMiBbaW5wdXRdCiAgKC0%2BPiBpbnB1dAogICAgcGFyc2UtY2FyZHMKICAgIChpbnRvIHt9IChtYXAgKGp1eHQgOmNhcmQgOmNvbGxlY3RzKSkpCiAgICBjb3VudC1jYXJkcykpCgooY29tbWVudAogIChwYXJ0LTIgZXhhbXBsZS1pbnB1dC0yKSA6PSAzMAogIChjb21tZW50CiAgICAodGltZQogICAgICAocGFydC0yIG15LWlucHV0KSkKICAgIDpyY2YpKQ%3D%3D. Thanks @borkdude for helping with the slight adaptations needed!

pez 2023-12-06T11:16:40.983709Z

Also for https://squint-cljs.github.io/cherry/?repl=true&boilerplate=https%3A%2F%2Fgist.githubusercontent.com%2Fborkdude%2Fcf94b492d948f7f418aa81ba54f428ff%2Fraw%2Fa6e9992b079e20e21d753e8c75a7353c5908b225%2Faoc_ui.cljs&src=OzsgSGVscGVyIGZ1bmN0aW9uczoKOzsgKGZldGNoLWlucHV0IHllYXIgZGF5KSAtIGdldCBBT0MgaW5wdXQKOzsgKGFwcGVuZCBzdHIpIC0gYXBwZW5kIHN0ciB0byBET00KOzsgKHNweSB4KSAtIGxvZyB4IHRvIGNvbnNvbGUgYW5kIHJldHVybiB4CgooZGVmbiBpbnRlcnNlY3Rpb24gWyYgeHNdCiAgKHJlZHVjZSAoZm4gW2FjYyBzXQogICAgICAgICAgICAoc2V0IChmaWx0ZXIgIyhjb250YWlucz8gYWNjICUpIHMpKSkgeHMpKQoKKGNvbW1lbnQKICAoaW50ZXJzZWN0aW9uIChzZXQgWzEgMiAzXSkgKHNldCBbMSAyXSkpCiAgKQoKOzsgUmVtZW1iZXIgdG8gdXBkYXRlIHRoZSB5ZWFyIGFuZCBkYXkgaW4gdGhlIGZldGNoLWlucHV0IGNhbGwuCihkZWYgbXktaW5wdXQgKC0%2BPiAoanMtYXdhaXQgKGZldGNoLWlucHV0IDIwMjMgNCkpCiAgICAgICAgICAgICAgICAjX3NweQogICAgICAgICAgICAgICAgc3RyL3NwbGl0LWxpbmVzKSkKCihkZWYgZXhhbXBsZS1pbnB1dC0xCiAgWyJDYXJkIDE6IDQxIDQ4IDgzIDg2IDE3IHwgODMgODYgIDYgMzEgMTcgIDkgNDggNTMiCiAgICJDYXJkIDI6IDEzIDMyIDIwIDE2IDYxIHwgNjEgMzAgNjggODIgMTcgMzIgMjQgMTkiCiAgICJDYXJkIDM6ICAxIDIxIDUzIDU5IDQ0IHwgNjkgODIgNjMgNzIgMTYgMjEgMTQgIDEiCiAgICJDYXJkIDQ6IDQxIDkyIDczIDg0IDY5IHwgNTkgODQgNzYgNTEgNTggIDUgNTQgODMiCiAgICJDYXJkIDU6IDg3IDgzIDI2IDI4IDMyIHwgODggMzAgNzAgMTIgOTMgMjIgODIgMzYiCiAgICJDYXJkIDY6IDMxIDE4IDEzIDU2IDcyIHwgNzQgNzcgMTAgMjMgMzUgNjcgMzYgMTEiXSkKCihkZWZuIHBhcnNlLWNhcmQgW2xlbmd0aCBjYXJkXQogIChsZXQgW2MtaWQgKHBhcnNlLWxvbmcgKHNlY29uZCAocmUtZmluZCAjIl5DYXJkICsoXGQrKToiIGNhcmQpKSkKICAgICAgICBbXyB3aW5uaW5nLXMgbWluZS1zXSAoc3RyL3NwbGl0IGNhcmQgIyI6ICt8ICtcfCArIikKICAgICAgICBbd2lubmluZyBtaW5lXSAobWFwICMoc2V0IChzdHIvc3BsaXQgJSAjIiArIikpIFt3aW5uaW5nLXMgbWluZS1zXSkKICAgICAgICBtYXRjaGVzIChjb3VudCAoaW50ZXJzZWN0aW9uIHdpbm5pbmcgbWluZSkpXQogICAgezpjYXJkIGMtaWQKICAgICA6Y291bnQgbWF0Y2hlcwogICAgIDpjb2xsZWN0cyAoZmlsdGVyICMoPj0gbGVuZ3RoICUpIChyYW5nZSAoaW5jIGMtaWQpICgrIChpbmMgYy1pZCkgbWF0Y2hlcykpKX0pKQoKKGNvbW1lbnQKICAocGFyc2UtY2FyZCA0ICJDYXJkIDE6IDQxIDQ4IDgzIDg2IDE3IHwgODMgODYgIDYgMzEgMTcgIDkgNDggNTMiKQogIDo9CiAgezpjYXJkIDEsOmNvdW50IDQsOmNvbGxlY3RzIFsyIDMgNF19CiAgKHBhcnNlLWNhcmQgMSAiQ2FyZCA1OiA4NyA4MyAyNiAyOCAzMiB8IDg4IDMwIDcwIDEyIDkzIDIyIDgyIDM2IikKICA6PQogIHs6Y2FyZCA1LDpjb3VudCAwLDpjb2xsZWN0cyBbXX0KICA6cmNmKQoKKGRlZm4gcGFyc2UtY2FyZHMgW2lucHV0XQogIChtYXAgKHBhcnRpYWwgcGFyc2UtY2FyZCAoY291bnQgaW5wdXQpKSBpbnB1dCkpCgooZGVmbiBwYXJ0LTEgW2lucHV0XQogICgtPj4gaW5wdXQKICAgIHBhcnNlLWNhcmRzCiAgICAobWFwIDpjb3VudCkKICAgIChrZWVwICMod2hlbiAocG9zPyAlKSAoZGVjICUpKSkKICAgIChtYXAgIyhiaXQtc2hpZnQtbGVmdCAxICUpKQogICAgKHJlZHVjZSArKSkpCgooY29tbWVudAogIChwYXJ0LTEgZXhhbXBsZS1pbnB1dC0xKSA6PSAxMwogIChjb21tZW50CiAgICh0aW1lCiAgICAgKHBhcnQtMSBteS1pbnB1dCkpCiAgIDpyY2YpKQoKKGRlZm4gZ2V0LWNvdW50IFtjYXJkLT5jb2xsZWN0cyBjYXJkXQogIChpbmMgKHJlZHVjZSArIChtYXAgKHBhcnRpYWwgZ2V0LWNvdW50IGNhcmQtPmNvbGxlY3RzKSAoY2FyZC0%2BY29sbGVjdHMgY2FyZCkpKSkpCgooZGVmbiBjb3VudC1jYXJkcyBbY2FyZC0%2BY29sbGVjdHNdCiAgKHJlZHVjZSArIChtYXAgKHBhcnRpYWwgZ2V0LWNvdW50IGNhcmQtPmNvbGxlY3RzKSAoa2V5cyBjYXJkLT5jb2xsZWN0cykpKSkKCihjb21tZW50CiAgKGRlZiBleGFtcGxlLWlucHV0LTIgZXhhbXBsZS1pbnB1dC0xKQogIChkZWYgY29sbGVjdGlvbiAoLT4%2BIGV4YW1wbGUtaW5wdXQtMgogICAgICAgICAgICAgICAgICAgIHBhcnNlLWNhcmRzCiAgICAgICAgICAgICAgICAgICAgKGludG8ge30gKG1hcCAoanV4dCA6Y2FyZCA6Y29sbGVjdHMpKSkpKQogIGNvbGxlY3Rpb24gOj0gezEgWzIgMyA0IDVdLDIgWzMgNF0sMyBbNCA1XSw0IFs1XSw1IFtdLDYgW119CiAgKGNvdW50LWNhcmRzIGNvbGxlY3Rpb24pIDo9IDMwCiAgOnJjZikKCgooZGVmbiBwYXJ0LTIgW2lucHV0XQogICgtPj4gaW5wdXQKICAgIHBhcnNlLWNhcmRzCiAgICAoaW50byB7fSAobWFwIChqdXh0IDpjYXJkIDpjb2xsZWN0cykpKQogICAgY291bnQtY2FyZHMpKQoKKGNvbW1lbnQKICAocGFydC0yIGV4YW1wbGUtaW5wdXQtMikgOj0gMzAKICAoY29tbWVudAogICAodGltZQogICAgIChwYXJ0LTIgbXktaW5wdXQpKQogICA6cmNmKSk%3D. Part 2 runs much faster there, @borkdude. 2.5 secs on my machine, vs 8 secs with squint. What gives?

borkdude 2023-12-06T11:19:07.877539Z

I'll check, probably some cloning going on which can be replaced with in-place mutation 😈

1
borkdude 2023-12-06T11:32:49.168999Z

@pez it's not so clear to me. https://squint-cljs.github.io/squint/?repl=true&boilerplate=https%3A%2F%2Fgist.githubusercontent.com%2Fborkdude%2Fcf94b492d948f7f418aa81ba54f428ff%2Fraw%2Fa6e9992b079e20e21d753e8c75a7353c5908b225%2Faoc_ui.cljs&src=OzsgSGVscGVyIGZ1bmN0aW9uczoKOzsgKGZldGNoLWlucHV0IHllYXIgZGF5KSAtIGdldCBBT0MgaW5wdXQKOzsgKGFwcGVuZCBzdHIpIC0gYXBwZW5kIHN0ciB0byBET00KOzsgKHNweSB4KSAtIGxvZyB4IHRvIGNvbnNvbGUgYW5kIHJldHVybiB4CgooZGVmbiBpbnRlcnNlY3Rpb24gWyYgeHNdCiAgKHJlZHVjZSAoZm4gW2FjYyBzXQogICAgICAgICAgICAoc2V0IChmaWx0ZXIgIyhjb250YWlucz8gYWNjICUpIHMpKSkgeHMpKQoKKGNvbW1lbnQKICAoaW50ZXJzZWN0aW9uIChzZXQgWzEgMiAzXSkgKHNldCBbMSAyXSkpCiAgKQoKOzsgUmVtZW1iZXIgdG8gdXBkYXRlIHRoZSB5ZWFyIGFuZCBkYXkgaW4gdGhlIGZldGNoLWlucHV0IGNhbGwuCihkZWYgbXktaW5wdXQgKC0%2BPiAoanMtYXdhaXQgKGZldGNoLWlucHV0IDIwMjMgNCkpCiAgICAgICAgICAgICAgICBzdHIvc3BsaXQtbGluZXMpKQoKKGRlZiBleGFtcGxlLWlucHV0LTEKICBbIkNhcmQgMTogNDEgNDggODMgODYgMTcgfCA4MyA4NiAgNiAzMSAxNyAgOSA0OCA1MyIKICAgIkNhcmQgMjogMTMgMzIgMjAgMTYgNjEgfCA2MSAzMCA2OCA4MiAxNyAzMiAyNCAxOSIKICAgIkNhcmQgMzogIDEgMjEgNTMgNTkgNDQgfCA2OSA4MiA2MyA3MiAxNiAyMSAxNCAgMSIKICAgIkNhcmQgNDogNDEgOTIgNzMgODQgNjkgfCA1OSA4NCA3NiA1MSA1OCAgNSA1NCA4MyIKICAgIkNhcmQgNTogODcgODMgMjYgMjggMzIgfCA4OCAzMCA3MCAxMiA5MyAyMiA4MiAzNiIKICAgIkNhcmQgNjogMzEgMTggMTMgNTYgNzIgfCA3NCA3NyAxMCAyMyAzNSA2NyAzNiAxMSJdKQoKKGRlZm4gcGFyc2UtY2FyZCBbbGVuZ3RoIGNhcmRdCiAgKGxldCBbYy1pZCAocGFyc2UtbG9uZyAoc2Vjb25kIChyZS1maW5kICMiXkNhcmQgKyhcZCspOiIgY2FyZCkpKQogICAgICAgIFtfIHdpbm5pbmctcyBtaW5lLXNdIChzdHIvc3BsaXQgY2FyZCAjIjogK3wgK1x8ICsiKQogICAgICAgIFt3aW5uaW5nIG1pbmVdIChtYXB2ICMoc2V0IChzdHIvc3BsaXQgJSAjIiArIikpIFt3aW5uaW5nLXMgbWluZS1zXSkKICAgICAgICBtYXRjaGVzIChjb3VudCAoaW50ZXJzZWN0aW9uIHdpbm5pbmcgbWluZSkpXQogICAgezpjYXJkIGMtaWQKICAgICA6Y291bnQgbWF0Y2hlcwogICAgIDpjb2xsZWN0cyAoZmlsdGVydiAjKD49IGxlbmd0aCAlKSAocmFuZ2UgKGluYyBjLWlkKSAoKyAoaW5jIGMtaWQpIG1hdGNoZXMpKSl9KSkKCihjb21tZW50CiAgKHBhcnNlLWNhcmQgNCAiQ2FyZCAxOiA0MSA0OCA4MyA4NiAxNyB8IDgzIDg2ICA2IDMxIDE3ICA5IDQ4IDUzIikKICA6PQogIHs6Y2FyZCAxLDpjb3VudCA0LDpjb2xsZWN0cyBbMiAzIDRdfQogIChwYXJzZS1jYXJkIDEgIkNhcmQgNTogODcgODMgMjYgMjggMzIgfCA4OCAzMCA3MCAxMiA5MyAyMiA4MiAzNiIpCiAgOj0KICB7OmNhcmQgNSw6Y291bnQgMCw6Y29sbGVjdHMgW119CiAgOnJjZikKCihkZWZuIHBhcnNlLWNhcmRzIFtpbnB1dF0KICAobWFwdiAocGFydGlhbCBwYXJzZS1jYXJkIChjb3VudCBpbnB1dCkpIGlucHV0KSkKCihkZWZuIGJpdC1zaGlmdC1sZWZ0IFt4IHldCiAgKGpzL2V2YWwgKHN0ciB4ICIgPDwgIiB5KSkpCgooY29tbWVudAogIChiaXQtc2hpZnQtbGVmdCA4IDIpKQoKKGRlZm4gcGFydC0xIFtpbnB1dF0KICAoLT4%2BIGlucHV0CiAgICBwYXJzZS1jYXJkcwogICAgKG1hcHYgOmNvdW50KQogICAgKGtlZXAgIyh3aGVuIChwb3M%2FICUpIChkZWMgJSkpKQogICAgKG1hcHYgIyhiaXQtc2hpZnQtbGVmdCAxICUpKQogICAgKHJlZHVjZSArKSkpCgooY29tbWVudAogIChwYXJ0LTEgZXhhbXBsZS1pbnB1dC0xKSA6PSAxMwogIChjb21tZW50CiAgICAoZGVmIG15LWlucHV0ICh1dGlsL2xpbmVzIDQpKQogICAgKHRpbWUKICAgICAgKHBhcnQtMSBteS1pbnB1dCkpCiAgICA6cmNmKSkKCih3YXJuLW9uLWxhenktcmV1c2FnZSEpCgooZGVmbiBnZXQtY291bnQgW2NhcmQtPmNvbGxlY3RzIGNhcmRdCiAgKGluYwogICAgKHJlZHVjZSArIDAKICAgICAgKG1hcHYKICAgICAgICAocGFydGlhbCBnZXQtY291bnQgY2FyZC0%2BY29sbGVjdHMpCiAgICAgICAgKGdldCBjYXJkLT5jb2xsZWN0cyBjYXJkKSkpKSkKCihkZWZuIGNvdW50LWNhcmRzCiAgW2NhcmQtPmNvbGxlY3RzXQogIChyZWR1Y2UgKyAwCiAgICAobWFwdiAocGFydGlhbCBnZXQtY291bnQgY2FyZC0%2BY29sbGVjdHMpCiAgICAgIChrZXlzIGNhcmQtPmNvbGxlY3RzKSkpKQoKKGNvbW1lbnQKICAoZGVmIGV4YW1wbGUtaW5wdXQtMiBleGFtcGxlLWlucHV0LTEpCiAgKGRlZiBjb2xsZWN0aW9uICgtPj4gZXhhbXBsZS1pbnB1dC0yCiAgICAgICAgICAgICAgICAgICAgcGFyc2UtY2FyZHMKICAgICAgICAgICAgICAgICAgICAoaW50byB7fSAobWFwIChqdXh0IDpjYXJkIDpjb2xsZWN0cykpKSkpCiAgY29sbGVjdGlvbiA6PSB7MSBbMiAzIDQgNV0sMiBbMyA0XSwzIFs0IDVdLDQgWzVdLDUgW10sNiBbXX0KICAoc3B5IChnZXQtY291bnQgY29sbGVjdGlvbiAxKSkKICAoY291bnQtY2FyZHMgY29sbGVjdGlvbikgOj0gMzAKICAocmVkdWNlICsgMCBbXSkKICA6cmNmKQoKCihkZWZuIHBhcnQtMiBbaW5wdXRdCiAgKC0%2BPiBpbnB1dAogICAgcGFyc2UtY2FyZHMKICAgIChtYXB2IChqdXh0IDpjYXJkIDpjb2xsZWN0cykpCiAgICAoaW50byB7fSkKICAgIGNvdW50LWNhcmRzKSkKCihjb21tZW50CiAgKHBhcnQtMiBleGFtcGxlLWlucHV0LTIpIDo9IDMwCiAgKGNvbW1lbnQKICAgICh0aW1lCiAgICAgIChwYXJ0LTIgbXktaW5wdXQpKQogICAgOnJjZikp and it runs in 11s whereas in cherry it takes 4.5s, so roughly a 2x difference. it would be interesting to see where this comes from, e.g. lookups in native JS maps vs clojure maps or so, not sure. I could take a closer look in a profiler when I'm at my bigger screen

pez 2023-12-06T13:33:50.213659Z

In order to understand @mail191’s solution I had to make mine use the same idea and inspect the reductions. I’m not sure I fully understand yet, but at least I understand more. I recognize the reductions from my recursive solution. That one ran in 1 sec. This one runs in 2ms. (10ms with https://squint-cljs.github.io/cherry/?repl=true&boilerplate=https%3A%2F%2Fgist.githubusercontent.com%2Fborkdude%2Fcf94b492d948f7f418aa81ba54f428ff%2Fraw%2Fa6e9992b079e20e21d753e8c75a7353c5908b225%2Faoc_ui.cljs&src=OzsgSGVscGVyIGZ1bmN0aW9uczoKOzsgKGZldGNoLWlucHV0IHllYXIgZGF5KSAtIGdldCBBT0MgaW5wdXQKOzsgKGFwcGVuZCBzdHIpIC0gYXBwZW5kIHN0ciB0byBET00KOzsgKHNweSB4KSAtIGxvZyB4IHRvIGNvbnNvbGUgYW5kIHJldHVybiB4CgooZGVmbiBpbnRlcnNlY3Rpb24gWyYgeHNdCiAgKHJlZHVjZSAoZm4gW2FjYyBzXQogICAgICAgICAgICAoc2V0IChmaWx0ZXIgIyhjb250YWlucz8gYWNjICUpIHMpKSkgeHMpKQoKKGNvbW1lbnQKICAoaW50ZXJzZWN0aW9uIChzZXQgWzEgMiAzXSkgKHNldCBbMSAyXSkpCiAgKQoKOzsgUmVtZW1iZXIgdG8gdXBkYXRlIHRoZSB5ZWFyIGFuZCBkYXkgaW4gdGhlIGZldGNoLWlucHV0IGNhbGwuCihkZWYgbXktaW5wdXQgKC0%2BPiAoanMtYXdhaXQgKGZldGNoLWlucHV0IDIwMjMgNCkpCiAgICAgICAgICAgICAgICAjX3NweQogICAgICAgICAgICAgICAgc3RyL3NwbGl0LWxpbmVzKSkKCihkZWYgZXhhbXBsZS1pbnB1dC0xCiAgWyJDYXJkIDE6IDQxIDQ4IDgzIDg2IDE3IHwgODMgODYgIDYgMzEgMTcgIDkgNDggNTMiCiAgICJDYXJkIDI6IDEzIDMyIDIwIDE2IDYxIHwgNjEgMzAgNjggODIgMTcgMzIgMjQgMTkiCiAgICJDYXJkIDM6ICAxIDIxIDUzIDU5IDQ0IHwgNjkgODIgNjMgNzIgMTYgMjEgMTQgIDEiCiAgICJDYXJkIDQ6IDQxIDkyIDczIDg0IDY5IHwgNTkgODQgNzYgNTEgNTggIDUgNTQgODMiCiAgICJDYXJkIDU6IDg3IDgzIDI2IDI4IDMyIHwgODggMzAgNzAgMTIgOTMgMjIgODIgMzYiCiAgICJDYXJkIDY6IDMxIDE4IDEzIDU2IDcyIHwgNzQgNzcgMTAgMjMgMzUgNjcgMzYgMTEiXSkKCihkZWZuIHBhcnNlLWNhcmQgW2xlbmd0aCBjYXJkXQogIChsZXQgW2MtaWQgKHBhcnNlLWxvbmcgKHNlY29uZCAocmUtZmluZCAjIl5DYXJkICsoXGQrKToiIGNhcmQpKSkKICAgICAgICBbXyB3aW5uaW5nLXMgbWluZS1zXSAoc3RyL3NwbGl0IGNhcmQgIyI6ICt8ICtcfCArIikKICAgICAgICBbd2lubmluZyBtaW5lXSAobWFwICMoc2V0IChzdHIvc3BsaXQgJSAjIiArIikpIFt3aW5uaW5nLXMgbWluZS1zXSkKICAgICAgICBtYXRjaGVzIChjb3VudCAoaW50ZXJzZWN0aW9uIHdpbm5pbmcgbWluZSkpXQogICAgezpjYXJkIGMtaWQKICAgICA6Y291bnQgbWF0Y2hlcwogICAgIDpjb2xsZWN0cyAoZmlsdGVyICMoPj0gbGVuZ3RoICUpIChyYW5nZSAoaW5jIGMtaWQpICgrIChpbmMgYy1pZCkgbWF0Y2hlcykpKX0pKQoKKGNvbW1lbnQKICAocGFyc2UtY2FyZCA0ICJDYXJkIDE6IDQxIDQ4IDgzIDg2IDE3IHwgODMgODYgIDYgMzEgMTcgIDkgNDggNTMiKQogIDo9CiAgezpjYXJkIDEsOmNvdW50IDQsOmNvbGxlY3RzIFsyIDMgNF19CiAgKHBhcnNlLWNhcmQgMSAiQ2FyZCA1OiA4NyA4MyAyNiAyOCAzMiB8IDg4IDMwIDcwIDEyIDkzIDIyIDgyIDM2IikKICA6PQogIHs6Y2FyZCA1LDpjb3VudCAwLDpjb2xsZWN0cyBbXX0KICA6cmNmKQoKKGRlZm4gcGFyc2UtY2FyZHMgW2lucHV0XQogIChtYXAgKHBhcnRpYWwgcGFyc2UtY2FyZCAoY291bnQgaW5wdXQpKSBpbnB1dCkpCgooZGVmbiBwYXJ0LTEgW2lucHV0XQogICgtPj4gaW5wdXQKICAgIHBhcnNlLWNhcmRzCiAgICAobWFwIDpjb3VudCkKICAgIChrZWVwICMod2hlbiAocG9zPyAlKSAoZGVjICUpKSkKICAgIChtYXAgIyhiaXQtc2hpZnQtbGVmdCAxICUpKQogICAgKHJlZHVjZSArKSkpCgooY29tbWVudAogIChwYXJ0LTEgZXhhbXBsZS1pbnB1dC0xKSA6PSAxMwogIChjb21tZW50CiAgICh0aW1lCiAgICAgKHBhcnQtMSBteS1pbnB1dCkpCiAgIDpyY2YpKQoKKGRlZm4gZ2V0LWNvdW50cwogIChbY291bnRzXSAocmVkdWNlICsgY291bnRzKSkKICAoW2NvdW50cyBjb3VudF0KICAgKGNvbmogY291bnRzIChyZWR1Y2UgKyAxICh0YWtlIGNvdW50IGNvdW50cykpKSkpCgooY29tbWVudAogKGRlZiBleGFtcGxlLWlucHV0LTIgZXhhbXBsZS1pbnB1dC0xKQogKGRlZiBjb3VudHMgKC0%2BPiBleGFtcGxlLWlucHV0LTIKICAgICAgICAgICAgICAgICAgcGFyc2UtY2FyZHMKICAgICAgICAgICAgICAgICAgKG1hcCA6Y291bnQpCiAgICAgICAgICAgICAgICAgIHJldmVyc2UpKQogY291bnRzIDo9ICcoMCAwIDEgMiAyIDQpCiAocmVkdWNlIGdldC1jb3VudHMgKCkgY291bnRzKSA6PSAnKDE1IDcgNCAyIDEgMSkKIChyZWR1Y3Rpb25zIGdldC1jb3VudHMgKCkgY291bnRzKSA6PSAnKCgpICgxKSAoMSAxKSAoMiAxIDEpICg0IDIgMSAxKSAoNyA0IDIgMSAxKSAoMTUgNyA0IDIgMSAxKSkKIDpyY2YpCgooZGVmbiBjb3VudC1jYXJkcyBbY291bnRzXQogIChyZWR1Y2UgKyAocmVkdWNlIGdldC1jb3VudHMgKCkgY291bnRzKSkpCgooY29tbWVudAogKGNvdW50LWNhcmRzIGNvdW50cykgOj0gMzAKIDpyY2YpCgoKKGRlZm4gcGFydC0yIFtpbnB1dF0KICAoLT4%2BIGlucHV0CiAgICAgICBwYXJzZS1jYXJkcwogICAgICAgKG1hcCA6Y291bnQpCiAgICAgICByZXZlcnNlCiAgICAgICBjb3VudC1jYXJkcykpCgooY29tbWVudAogKHBhcnQtMiBleGFtcGxlLWlucHV0LTIpIDo9IDMwCiAoY29tbWVudAogICAodGltZQogICAgKHBhcnQtMiBteS1pbnB1dCkpCiAgIDpyY2YpKQ%3D%3D).

pez 2023-12-06T13:38:59.905059Z

And this one is about twice as fast https://squint-cljs.github.io/squint/?repl=true&boilerplate=https%3A%2F%2Fgist.githubusercontent.com%2Fborkdude%2Fcf94b492d948f7f418aa81ba54f428ff%2Fraw%2Fa6e9992b079e20e21d753e8c75a7353c5908b225%2Faoc_ui.cljs&src=OzsgSGVscGVyIGZ1bmN0aW9uczoKOzsgKGZldGNoLWlucHV0IHllYXIgZGF5KSAtIGdldCBBT0MgaW5wdXQKOzsgKGFwcGVuZCBzdHIpIC0gYXBwZW5kIHN0ciB0byBET00KOzsgKHNweSB4KSAtIGxvZyB4IHRvIGNvbnNvbGUgYW5kIHJldHVybiB4CgooZGVmbiBpbnRlcnNlY3Rpb24gWyYgeHNdCiAgKHJlZHVjZSAoZm4gW2FjYyBzXQogICAgICAgICAgICAoc2V0IChmaWx0ZXIgIyhjb250YWlucz8gYWNjICUpIHMpKSkgeHMpKQoKKGNvbW1lbnQKICAoaW50ZXJzZWN0aW9uIChzZXQgWzEgMiAzXSkgKHNldCBbMSAyXSkpCiAgKQoKOzsgUmVtZW1iZXIgdG8gdXBkYXRlIHRoZSB5ZWFyIGFuZCBkYXkgaW4gdGhlIGZldGNoLWlucHV0IGNhbGwuCihkZWYgbXktaW5wdXQgKC0%2BPiAoanMtYXdhaXQgKGZldGNoLWlucHV0IDIwMjMgNCkpCiAgICAgICAgICAgICBzdHIvc3BsaXQtbGluZXMpKQoKKGRlZiBleGFtcGxlLWlucHV0LTEKICBbIkNhcmQgMTogNDEgNDggODMgODYgMTcgfCA4MyA4NiAgNiAzMSAxNyAgOSA0OCA1MyIKICAgIkNhcmQgMjogMTMgMzIgMjAgMTYgNjEgfCA2MSAzMCA2OCA4MiAxNyAzMiAyNCAxOSIKICAgIkNhcmQgMzogIDEgMjEgNTMgNTkgNDQgfCA2OSA4MiA2MyA3MiAxNiAyMSAxNCAgMSIKICAgIkNhcmQgNDogNDEgOTIgNzMgODQgNjkgfCA1OSA4NCA3NiA1MSA1OCAgNSA1NCA4MyIKICAgIkNhcmQgNTogODcgODMgMjYgMjggMzIgfCA4OCAzMCA3MCAxMiA5MyAyMiA4MiAzNiIKICAgIkNhcmQgNjogMzEgMTggMTMgNTYgNzIgfCA3NCA3NyAxMCAyMyAzNSA2NyAzNiAxMSJdKQoKKGRlZm4gcGFyc2UtY2FyZCBbbGVuZ3RoIGNhcmRdCiAgKGxldCBbYy1pZCAocGFyc2UtbG9uZyAoc2Vjb25kIChyZS1maW5kICMiXkNhcmQgKyhcZCspOiIgY2FyZCkpKQogICAgICAgIFtfIHdpbm5pbmctcyBtaW5lLXNdIChzdHIvc3BsaXQgY2FyZCAjIjogK3wgK1x8ICsiKQogICAgICAgIFt3aW5uaW5nIG1pbmVdIChtYXAgIyhzZXQgKHN0ci9zcGxpdCAlICMiICsiKSkgW3dpbm5pbmctcyBtaW5lLXNdKQogICAgICAgIG1hdGNoZXMgKGNvdW50IChpbnRlcnNlY3Rpb24gd2lubmluZyBtaW5lKSldCiAgICB7OmNhcmQgYy1pZAogICAgIDpjb3VudCBtYXRjaGVzCiAgICAgOmNvbGxlY3RzIChmaWx0ZXJ2ICMoPj0gbGVuZ3RoICUpIChyYW5nZSAoaW5jIGMtaWQpICgrIChpbmMgYy1pZCkgbWF0Y2hlcykpKX0pKQoKKGNvbW1lbnQKICAocGFyc2UtY2FyZCA0ICJDYXJkIDE6IDQxIDQ4IDgzIDg2IDE3IHwgODMgODYgIDYgMzEgMTcgIDkgNDggNTMiKQogIDo9CiAgezpjYXJkIDEsOmNvdW50IDQsOmNvbGxlY3RzIFsyIDMgNF19CiAgKHBhcnNlLWNhcmQgMSAiQ2FyZCA1OiA4NyA4MyAyNiAyOCAzMiB8IDg4IDMwIDcwIDEyIDkzIDIyIDgyIDM2IikKICA6PQogIHs6Y2FyZCA1LDpjb3VudCAwLDpjb2xsZWN0cyBbXX0KICA6cmNmKQoKKGRlZm4gcGFyc2UtY2FyZHMgW2lucHV0XQogIChtYXAgKHBhcnRpYWwgcGFyc2UtY2FyZCAoY291bnQgaW5wdXQpKSBpbnB1dCkpCgooZGVmbiBiaXQtc2hpZnQtbGVmdCBbeCB5XQogIChqcy9ldmFsIChzdHIgeCAiIDw8ICIgeSkpKQoKKGNvbW1lbnQKICAoYml0LXNoaWZ0LWxlZnQgOCAyKSkKCihkZWZuIHBhcnQtMSBbaW5wdXRdCiAgKC0%2BPiBpbnB1dAogICAgcGFyc2UtY2FyZHMKICAgIChtYXAgOmNvdW50KQogICAgKGtlZXAgIyh3aGVuIChwb3M%2FICUpIChkZWMgJSkpKQogICAgKG1hcCAjKGJpdC1zaGlmdC1sZWZ0IDEgJSkpCiAgICAocmVkdWNlICspKSkKCihjb21tZW50CiAgKHBhcnQtMSBleGFtcGxlLWlucHV0LTEpIDo9IDEzCiAgKGNvbW1lbnQKICAgIChkZWYgbXktaW5wdXQgKHV0aWwvbGluZXMgNCkpCiAgICAodGltZQogICAgICAocGFydC0xIG15LWlucHV0KSkKICAgIDpyY2YpKQoKKGRlZm4gZ2V0LWNvdW50cwogIChbY291bnRzXSAocmVkdWNlICsgY291bnRzKSkKICAoW2NvdW50cyBjb3VudF0KICAgKGNvbmogY291bnRzIChyZWR1Y2UgKyAxICh0YWtlIGNvdW50IGNvdW50cykpKSkpCgooY29tbWVudAogKGRlZiBleGFtcGxlLWlucHV0LTIgZXhhbXBsZS1pbnB1dC0xKQogKGRlZiBjb3VudHMgKC0%2BPiBleGFtcGxlLWlucHV0LTIKICAgICAgICAgICAgICAgICAgcGFyc2UtY2FyZHMKICAgICAgICAgICAgICAgICAgKG1hcCA6Y291bnQpCiAgICAgICAgICAgICAgICAgIHJldmVyc2UpKQogY291bnRzIDo9ICcoMCAwIDEgMiAyIDQpCiAocmVkdWNlIGdldC1jb3VudHMgKCkgY291bnRzKSA6PSAnKDE1IDcgNCAyIDEgMSkKIDpyY2YpCgooZGVmbiBjb3VudC1jYXJkcyBbY291bnRzXQogIChyZWR1Y2UgKyAocmVkdWNlIGdldC1jb3VudHMgKCkgY291bnRzKSkpCgooY29tbWVudAogKGNvdW50LWNhcmRzIGNvdW50cykgOj0gMzAKIDpyY2YpCgoKKGRlZm4gcGFydC0yIFtpbnB1dF0KICAoLT4%2BIGlucHV0CiAgICAgICBwYXJzZS1jYXJkcwogICAgICAgKG1hcCA6Y291bnQpCiAgICAgICByZXZlcnNlCiAgICAgICBjb3VudC1jYXJkcykpCgooY29tbWVudAogKHBhcnQtMiBleGFtcGxlLWlucHV0LTIpIDo9IDMwCiAoY29tbWVudAogICAodGltZQogICAgKHBhcnQtMiBteS1pbnB1dCkpCiAgIDpyY2YpKQ%3D%3D as in cherry, @borkdude πŸ˜ƒ

πŸŽ‰ 1
imre 2023-12-06T14:00:05.818219Z

How I understood Sam's technique is this: 1. record how many cards the last card gives us (1 (itself) + 0 as there are no following cards) 2. record how many cards the second to last card gives us (1 (itself) + the number of cards given by as many following cards as the current one won) 3. repeat 2 for the rest of the cards 4. add them all up it's brilliant!

🧠 2
imre 2023-12-06T14:00:17.797169Z

@pez ^

πŸ™ 1
Ivana 2023-12-06T15:56:34.466149Z

Look at homoiconicity magic 😊

(->> (str/split input #"\n")
       (keep (fn [s]
               (let [[_ s] (str/split s #"\:" 2)]
                 (->> (str "(-> (set/intersection #{" (str/replace s #"\|" "} #{") "})
                                count
                                (->> (Math/pow 2))
                                int
                                (quot 2))")
                      read-string
                      eval))))
       (apply +))

❀️ 1
borkdude 2023-12-06T15:57:19.368409Z

read-string + eval can be written as load-string

βœ… 1
Ivana 2023-12-06T15:58:36.270239Z

Thanks! More homoiconicity, but works only on demo data, on real input throws too large code length πŸ™‚

(defn foo [a b] (-> (set/intersection a b)
                      count
                      (->> (Math/pow 2))
                      int
                      (quot 2)))

  (let [code (-> input
                 (str "\n")
                 (str/replace #"\|" "} #{")
                 (str/replace #"\n" "})\n")
                 (str/replace #"Card\s+\d+\:" "(foo #{\n"))
        code (str "(+ " code ")")]
    (-> code read-string eval))

borkdude 2023-12-06T15:59:48.879389Z

I wonder if SCI can handle it ;)

pez 2023-12-06T16:00:06.517189Z

Could you do it with a macro, @andrey.yallowsack.com?

Ivana 2023-12-06T16:01:52.307559Z

Not sure, cause code literals will be the same length

borkdude 2023-12-06T16:04:05.020649Z

@andrey.yallowsack.com This works for me in bb:

(ns daywhatever
  (:require [clojure.set :as set]
            [clojure.string :as str]))

(def input (str/trim (slurp (str ""
                                 (System/getenv "AOC_TOKEN")
                                 "&year=2023&day=4"))))


(defn foo [a b] (-> (set/intersection a b)
                    count
                    (->> (Math/pow 2))
                    int
                    (quot 2)))

(prn (let [code (-> input
                    (str "\n")
                    (str/replace #"\|" "} #{")
                    (str/replace #"\n" "})\n")
                    (str/replace #"Card\s+\d+\:" "(foo #{\n"))
           code (str "(+ " code ")")]
       (-> code read-string eval)))

borkdude 2023-12-06T16:04:13.833419Z

where I've set AOC_TOKEN to the token

βœ… 1
borkdude 2023-12-06T16:05:14.200239Z

takes 10ms to complete

πŸ‘ 1
Ivana 2023-12-06T16:05:16.779599Z

Thanks, I'l try & play with it πŸ™‚

borkdude 2023-12-06T16:05:58.738349Z

in clojure I indeed get:

Syntax error (IndexOutOfBoundsException) compiling fn* at (/tmp/daywhatever.clj:16:1).
Method code too large!

Ivana 2023-12-06T16:07:37.010839Z

The same as I got in REPL. Thanks again, I'l try your approach on future tasks!

borkdude 2023-12-06T16:14:05.817679Z

I managed to get it to work in planck (self-hosted CLJS), just use edn/read-string there + eval:

"Elapsed time: 177.860958 msecs"

borkdude 2023-12-06T16:14:13.218519Z

now I'll try nbb

borkdude 2023-12-06T16:17:30.860269Z

in nbb:

"Elapsed time: 52.348458 msecs"

πŸ’ͺ 2
V 2023-12-12T11:58:09.125969Z

Short but slow recursion πŸ™‚ https://gist.github.com/coadan/cf0fdc0d3c9709dc68ebc8751af496f8

pez 2023-12-05T21:56:29.357259Z

Brute forced part 2. Which math is it that I am missing? 14 card 5 for the example data.. I don’t see it!

imre 2023-12-05T22:13:58.197899Z

I went with a forward-accumulator in part2. Still happy that it all fit into a single transduction! https://github.com/imrekoszo/advent-of-clj/blob/master/src/imrekoszo/advent/y23/day4.clj

mauricio.szabo 2023-12-06T01:22:17.607399Z

Really similar with other results here πŸ™‚ https://gitlab.com/mauricioszabo/advent-of-code-2023-clj/blob/master/src/advent_2023_clj/day04.clj

Ellis 2023-12-04T08:03:03.939959Z

https://elken.github.io/aoc/src/solutions/2023/day04/ this was a massive whiplash to yesterday

oyakushev 2023-12-04T09:15:26.365639Z

Went with bitsets first, then figured out it's unnecessary here https://gist.github.com/alexander-yakushev/51fd7c47d9b6e18de64ec5a324f9f35c

Jakob Durstberger 2023-12-04T09:24:47.583739Z

I also ended up with a nested reduce, but I am quite happy with the readability of my solution. I am still in shock about day 3, though. I only was able to finish that this mornign https://github.com/JDurstberger/aoc-2023-clj/tree/main/src/day_4

genmeblog 2023-12-04T09:27:37.047059Z

Wow @mail191! It's impressive, I need to digest it.

☝️ 1
Jakob Durstberger 2023-12-04T09:34:52.489649Z

Yeah, my brain does not compute that solution 🀯

genmeblog 2023-12-04T09:37:41.378949Z

I see! reverse is the key!

☝️ 1
Casey 2023-12-04T09:56:26.800039Z

and mine: https://github.com/Ramblurr/advent-of-code/blob/main/src/aoc/2023/day04.clj nothing particularly special i think

Marcel Krcah 2023-12-04T10:01:44.268549Z

part1 only https://github.com/mkrcah/advent-of-code/blob/main/src/day_04.clj skipping part2 and instead going to invest time to try to understand transducers and @mail191 today's approach Update: added part 1, now with transducers https://github.com/mkrcah/advent-of-code/blob/main/src/day_04_xf.clj

2023-12-04T10:19:10.117299Z

@mail191 got exactly the same strategy for parsing data, but was not so sofisticated with transducing as you for the solutions; however, when I run your solution with babashka, I get long overflow error...

Sam Ferrell 2023-12-04T10:24:01.957969Z

πŸ€” not sure @piotr.kaznowski, maybe differences in input data? i'm running it locally with babashka as well

2023-12-04T10:24:43.115049Z

@mail191 sorry, edit -- I missed the reverse in parsing! Sorry for confusion, pretty impressed with your solution!

πŸ™Œ 1
Felipe 2023-12-04T12:53:41.411929Z

that Rubik's cube is giving me flashbacks to last year, day 22

πŸ‘ 1
oyakushev 2023-12-04T13:26:50.268399Z

@felipecortezfi I had to make a debugger for that task to find out why my answer was constantly wrong

πŸ‘€ 1
Felipe 2023-12-04T13:27:53.879729Z

I did too, but could not get it right even with that!

borkdude 2023-12-04T13:37:32.171989Z

@mail191’s solution https://squint-cljs.github.io/squint/?boilerplate=https%3A%2F%2Fgist.githubusercontent.com%2Fborkdude%2Fcf94b492d948f7f418aa81ba54f428ff%2Fraw%2F3e871513ab6f2462841f75fc99668f841f33dabb%2Faoc_ui.cljs&repl=true&src=OzsgSGVscGVyIGZ1bmN0aW9uczoKOzsgKGZldGNoLWlucHV0IHllYXIgZGF5KSAtIGdldCBBT0MgaW5wdXQKOzsgKGFwcGVuZCBzdHIpIC0gYXBwZW5kIHN0ciB0byBET00KOzsgKHNweSB4KSAtIGxvZyB4IHRvIGNvbnNvbGUgYW5kIHJldHVybiB4CgooZGVmbiBwb2ludHMgW3hdCiAgKGludCAoTWF0aC9wb3cgMiAoZGVjIHgpKSkpCgooZGVmbiB0b3RhbHMtcmYKICAoW3hzXSAocmVkdWNlICsgeHMpKQogIChbeHMgeF0gKGNvbmogeHMgKHJlZHVjZSArIDEgKHRha2UgeCB4cykpKSkpCgooZGVmbiBpbnRlcnNlY3Rpb24gWyYgeHNdCiAgKHJlZHVjZSAoZm4gW2FjYyBzXQogICAgICAgICAgICAoc2V0IChmaWx0ZXIgIyguaGFzIGFjYyAlKSBzKSkpIHhzKSkKCihjb21tZW50CiAgKGludGVyc2VjdGlvbiAjezEgMiAzfSAjezIgMyA0IDUgNn0pCiAgKHRyYW5zZHVjZSAoY29tcCAobWFwIGluYykgKG1hcCBkZWMpKSArIFsxIDIgM10pKQoKKGRlZiBpbiAocmV2ZXJzZSAoc3RyL3NwbGl0LWxpbmVzIChqcy1hd2FpdCAoZmV0Y2gtaW5wdXQgMjAyMyA0KSkpKSkKCihsZXQgW3hmIChjb21wCiAgICAgICAgICAgKG1hcCAocGFydGlhbCByZS1zZXEgIyJcZCsiKSkKICAgICAgICAgICAobWFwIHJlc3QpCiAgICAgICAgICAgKG1hcCAocGFydGlhbCBtYXB2IHBhcnNlLWxvbmcpKQogICAgICAgICAgIChtYXAgKHBhcnRpYWwgc3BsaXQtYXQgMTApKQogICAgICAgICAgIChtYXAgKHBhcnRpYWwgbWFwdiBzZXQpKQogICAgICAgICAgIChtYXAgKHBhcnRpYWwgYXBwbHkgaW50ZXJzZWN0aW9uKSkKICAgICAgICAgICAobWFwIGNvdW50KSldCiAgOzsgZGVidWc6CiAgOzsgKGpzL2NvbnNvbGUubG9nIChpbnRvIFtdIHhmIGluKSkKICAoYXBwZW5kIChzdHIgIlBhcnQgQToiICh0cmFuc2R1Y2UgKGNvbXAgeGYgKG1hcCBwb2ludHMpKSArIGluKSkpCiAgKGFwcGVuZCAoc3RyICJQYXJ0IEI6IiAodHJhbnNkdWNlIHhmIHRvdGFscy1yZiAoKSBpbikpKSk%3D

πŸŽ‰ 2
2023-12-04T13:52:27.115419Z

classic AoC state machine problem πŸ˜„ https://github.com/potetm/advent-of-code/blob/master/src/advent_2023/day_4.clj

Ryan Martin 2023-12-04T13:59:16.144119Z

I'm relieved to see day 4's input is nicer than day 3

Ryan Martin 2023-12-04T14:12:27.718209Z

here's my solution: https://github.com/rmrt1n/advent-of-code-2023-clj/blob/main/src/aoc/day04.clj

maleghast 2023-12-04T15:01:54.241989Z

I have managed to get Part 1 done pretty easily - this is much more my speed. Have run out of lunchtime and must get back to my actual job, but will be addressing part 2 later on,.. It's nice to be having fun with AoC again...

wevrem 2023-12-04T15:12:13.654999Z

@tsulej, I agree that reverse is the a key, but also important is conj-ing onto a list () (in reference to Sam’s solution).

maleghast 2023-12-04T15:13:52.006569Z

?? why need reverse?

genmeblog 2023-12-04T15:21:07.423209Z

@michaeljweaver yes, it's a consequence of backward processing. It makes things easier than going forward.

wevrem 2023-12-04T15:25:33.648779Z

I had a hunch there was some solution like that and I started writing stuff down and trying to figure it out but then my brain hurt and I just went with forward approach. Impressive, @mail191.

genmeblog 2023-12-04T15:27:37.468619Z

Here is how it goes when reverse processing is used (marked elements are added + 1):

;; => [4 2 2 1 0 0]
;; 0 - '()
;; 0 - '(1)
;; 1 - '(1 1)
         ^
;; 2 - '(2 1 1)
         ^ ^
;; 2 - '(4 2 1 1)
         ^ ^ 
;; 4 - '(7 4 2 1 1)
         ^ ^ ^ ^
;; => (15 7 4 2 1 1 )
;; => 30
For forward (from my solution)
;; => [1 1 1 1 1 1]
;; 4 - [1 2 2 2 2 1]
;; 2 - [1 2 4 4 2 1]
;; 2 - [1 2 4 8 6 1]
;; 1 - [1 2 4 8 14 1]
;; 0 - [1 2 4 8 14 1]
;; 0 - [1 2 4 8 14 1]
;; => 30

wevrem 2023-12-04T15:36:43.377799Z

And this way you don’t have to keep track of the card id.

genmeblog 2023-12-04T15:37:10.289189Z

Exactly

Jakob Durstberger 2023-12-04T15:38:31.775149Z

This explains a lot and still hurts my brain. I need to look at that again tomorrow morning when I am well rested πŸ˜…

genmeblog 2023-12-04T15:40:49.999649Z

Still, it's not like I could find such solution myself πŸ˜„

☝️ 1
Ryan Martin 2023-12-04T16:08:01.362009Z

pt 2 looks like a dp problem

maleghast 2023-12-04T16:08:47.850479Z

dp? I know what that means in other contexts but not software engineering...

πŸ˜‚ 1
Ryan Martin 2023-12-04T16:11:02.154959Z

dynamic programming. I'm not good at explaining it so here's https://stackoverflow.com/a/29149754 from stack overflow

πŸ™‡ 1
wevrem 2023-12-04T16:11:52.497249Z

I made a https://github.com/wevre/advent-of-code/blob/master/src/advent_of_code/2023/day_04_v2.clj trying out Sam’s reverse processing. Timewise it seems to be the same, maybe slightly faster. With transduce, if you don’t need the transducer xform , do you just use identity? Or is there a function other than transduce to use in that case?

maleghast 2023-12-04T16:13:14.037709Z

Thx @hi897

πŸ‘ 1
2023-12-04T16:44:04.376039Z

not exactly elegant but did the job

tschady 2023-12-04T18:05:26.097039Z

i originally did a forward-processing approach using vector adds to avoid the double reduce. but i couldn’t unsee the reverse approach with transducers, so once I understood @mail191’s had to do the same. one original bit i like is counting winners by using a forward looking regex to find winners that exist later in the line. #"(?<=:.*)(?=\b(\d+)\b.*\|.*\b\1\b)", then count matches, no need for sets of integers. https://github.com/tschady/advent-of-code/blob/main/src/aoc/2023/d04.clj

πŸ’― 3
🀯 2
❀️ 1
πŸ˜† 1
πŸ™Œ 1
1
genmeblog 2023-12-04T18:07:34.962609Z

Haha, it's a real code golf.

wevrem 2023-12-04T18:13:28.224969Z

I saw a post on reddit that did something similar, @tws. That’s a clever use of regex.

2023-12-04T18:23:15.177449Z

dp is a scam

2023-12-04T18:23:40.801259Z

Took me too long to figure it out

2023-12-04T18:23:49.712329Z

It's just caching.

Sam Ferrell 2023-12-04T18:36:20.019229Z

> one original bit i like is counting winners by using a forward looking regex to find winners that exist later in the line this is awesome! i learn so much regex from other people during aoc

πŸ’― 2
carnundotcom 2023-12-04T19:39:59.420679Z

simple reduce: https://github.com/CarnunMP/Advent-of-Code/blob/master/src/y2023/d4.clj

carnundotcom 2023-12-04T19:40:26.046359Z

lol @tws, you legend

Janet A. Carr 2023-12-04T20:35:32.494689Z

I just finished. started late. Part two is a bit slow, but it works. lol

(ns advent-of-code.day-four
  (:require [clojure.math :as math]
            [clojure.string :as string]
            [clojure.set :as cset]))

(defn card->winners
  [line]
  (as-> (string/split line #":") s
    (last s)
    (string/split s #"\|")
    (map #(set (filter not-empty (string/split % #" "))) s)
    (apply cset/intersection s)
    (count s)))

(defn part-one
  []
  (apply +
         (map (fn [line]
                (let [winners (card->winners line)]
                  (if (pos? winners)
                    (int (math/pow 2 (dec winners)))
                    0)))
              (line-seq ( "./input/day4.txt")))))

(defn card->number
  [card]
  (-> card
      (string/split #":")
      (first)
      (string/split #" ")
      (last)
      (parse-long)))

(defn helper
  [cards processing]
  (mapv (fn [line]
          (let [winners (card->winners line)
                card-num (card->number line)]
            (if (pos? winners)
              (into [line]
                    (helper cards
                            (subvec cards
                                    card-num
                                    (+ card-num winners))))
              line)))
        processing))

(defn count-scratchcards
  [cards processing]
  (count (flatten (helper cards processing))))

(defn part-two
  []
  (count-scratchcards
   (vec (line-seq ( "./input/day4.txt")))
   (vec (line-seq ( "./input/day4.txt")))))

Max 2023-12-04T20:49:40.566119Z

https://github.com/maxrothman/advent-of-code/blob/main/2023/clj2023/src/clj2023/day4.clj. I like to use iterate for this sort of thing because it makes it easier to debug the intermediate steps. If performance ends up being an issue you can always convert it to reduce or a recursive fn later.

2023-12-04T20:59:25.495649Z

@max.r.rothman FYI, you can use reductions to get intermediate steps of a reduce. The upside is that you don't have to manually iterate items of a collection.

🀯 1
Max 2023-12-04T21:02:30.424339Z

Yeah I know, for this one though I wanted to iterate 2 collections in parallel while retaining access to the remaining items in one of the collections. I’m sure I could’ve fit that into reduce but anytime I need to iterate a collection and access the remaining items I go straight for recursion and destructuring. Probably because I learned FP in Haskell πŸ˜‚

Max 2023-12-04T21:03:19.334269Z

Basically recursion/iterate are more flexible when you’re not sure you understand the problem, so I often find it easier to start there

2023-12-04T23:52:08.888189Z

@tws Once again, your solutions are just incredible. 🫑 sir.

tschady 2023-12-05T00:22:36.084459Z

Thanks! but this one is pure stolen valor from @mail191’s eye-opener.

russmatney 2023-12-04T06:05:28.921649Z

kind of a nasty nested reduce, but it worked! https://github.com/russmatney/advent-of-code/blob/master/src/_2023/_04/core.clj

Sam Ferrell 2023-12-04T07:43:25.431969Z

https://gist.github.com/samcf/ecc76b013cf03c8d3797f5936bce0ae1 Uhh this is a pretty bad solution even if it looks terse... there is surely a more efficient recursion strategy here Much improved version https://github.com/samcf/advent-of-code/blob/main/2023-04-scratchcards.clj

❀️ 1
1