Day 25: Combo Breaker

Functions:

transform(subject, loop_size)

Transform the subject in loop_size steps of a hard-coded algorithm.

deduce_loop_size(subject, public_key)

Deduce the loop size for public_key by transforming the subject.

deduce_encryption_key(door_public_key, ...)

Figure out the subject number.

transform(subject: int, loop_size: int) int[source]

Transform the subject in loop_size steps of a hard-coded algorithm.

Requires
  • subject >= 0

  • loop_size >= 0

Ensures
  • 0 <= result < 20201227

deduce_loop_size(subject: int, public_key: int) int[source]

Deduce the loop size for public_key by transforming the subject.

Returns

The loop size, or -1 if no success

Requires
  • subject >= 0

Ensures
  • result != -1transform(subject, result) == public_key

deduce_encryption_key(door_public_key: int, card_public_key: int) int[source]

Figure out the subject number.

Requires
  • card_public_key >= 0

  • door_public_key >= 0