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
@cachedecorator, 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 / " " endI 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.