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@awful.systems
    link
    fedilink
    English
    arrow-up
    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@awful.systems
      link
      fedilink
      English
      arrow-up
      3
      ·
      1 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.