day 11: Skip passwords that don't meet any of the requirements
day 11: Skip passwords that don't meet any of the requirements

We should avoid blindly cycling through passwords that have no chance of
working. It should always be the case that passwords meet at least one
of the three requirements, and we have functions that take a password
and find the next password that meets a given requirement. Then we just
repeatedly call these functions instead of the normal #succ function

Speeds up from ~2.2 seconds -> ~0.1 seconds
To give an idea of how much speedup was given for each check:

Replacing all functions with password.succ!: ~2.4 seconds
That indicates there's some overhead here.

Use only make_pair! without the two-at-a-time branch: ~0.6 seconds.
Use both branches of make_pair!: ~0.2 seconds.
Use only succ_index!: ~2.2 seconds.
Use only make_ascending!: ~1.9 seconds.

Obviously the pairs requirement got the biggest mileage, because a lot
of passwords can fail this requirement.

petertseng/adventofcode