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.

  • @zogwarg
    link
    English
    2
    edit-2
    1 year ago

    Day 12: Hot springs

    https://adventofcode.com/2023/day/12

    • Leaderboard completion time: 22:57
    • Personal completion time: ahahahahahahaha (at least i had fun)

    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.

    • @zogwarg
      link
      English
      31 year ago

      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.

    • @swlabr
      link
      English
      21 year ago
      spoiler

      Oooh I should run my code without memoization. Or just add a cache hit count.