AoC 2021 - Day 16

Today’s challenge is here.

My first attempt at solving this puzzle was to use a library called construct to parse the data, however it turned out to be too hard for me xD

I managed to create a parser for the literals:

literal = Bitwise(Aligned(8, Struct(
    "version" / BitsInteger(3),
    "type" / Const(0b100, BitsInteger(3)),
    "sequence" / RepeatUntil(
        lambda x, _, __: x.flag == 0,
        Struct(
            "flag" / Flag,
            "data" / Nibble,
        ),
    ),
    "value" / Computed(lambda ctx: reduce(lambda acc, n: (acc << 4) + n.data, ctx.sequence, 0)),
)))

assert(literal.parse(b"\xD2\xFE\x28").value == 2021)

This does work as excepted, but given that the entire problem is a tree of structures, I might just write a bunch of functions to parse the data instead. In construct the recursion has to be done by using LazyBound as far as I can tell, which doesn’t really work with Bitwise.