Rules: no spoilers.
The other rules are made up as we go along.
Share code by link to a forge, home page, pastebin (Eric Wastl has one here) or code section in a comment.
Rules: no spoilers.
The other rules are made up as we go along.
Share code by link to a forge, home page, pastebin (Eric Wastl has one here) or code section in a comment.
Day 12: Hot springs
https://adventofcode.com/2023/day/12
Where a curse the fact I decided to use JQ and not a “real” programming language.
spoiler
Had to resort to memoization, but sadly JQ isn’t mega well suited to that. I had to refactor my part 1 function, to make including the “state” at every function call possible. I wish it were as easy as a
@cache
decorator, but i guess this way i had fun (for an arbitrary definition of “fun”)Further cleaned up version: https://github.com/zogwarg/advent-of-code/blob/main/2023/jq/12-b.jq
Also lost a fair amount of time not not noticing that the sequence should be joined with
"?"
not with""
. (that’ll teach me to always run on the example before the full input, when execution time is super long).Execution time: 17m10s (without memoization a single row was taking multiple minutes, and there’s 1000 rows ^^…)
EDIT: see massive improvement by running in parallel in reply.
A nice workaround to jq single threadedness, since this is maq reduce and safe to parallelize. 17m10s -> 20s !!!
Spoiler link to commit.
https://github.com/zogwarg/advent-of-code/commit/fef153411fe0bfe0e7d5f2d07da80bcaa18c952c
Not really spoilery details: Revolves around spawing mutiple jq instances and filtering the inputs bassed on a modulo of number of instances:
# Option to run in parallel using xargs # Eg: ( seq 0 9 | \ # xargs -P 10 -n 1 ./2023/jq/12-b.jq input.txt --argjson s 10 --argjson i \ # ) | jq -s add # Execution time 17m10s -> 20s if $ARGS.named.s and $ARGS.named.i then # [inputs] | to_entries[] | select(.key % $ARGS.named.s == $ARGS.named.i) | .value / " " else inputs / " " end
I use JQ at work, and never really needed this, i guess this trick is nice to have under the belt just in case.
spoiler
Oooh I should run my code without memoization. Or just add a cache hit count.