Advent of Code F# — Day 15

ps. look out for all my oth­er solu­tions for Advent of Code chal­lenges here.

 

Day 15

See details of the chal­lenge here.

Today’s chal­lenge is pret­ty straight for­ward, and a brute force approach would have suf­fice — try every t from 0 to inifin­i­ty and return the first t that sat­is­fies this equa­tion for all the discs:

        (t + disc.Number — (disc.Positions — disc.Time0Position)) % disc.Positions = 0

That said, there’s a sim­ple opti­miza­tion we can apply by restrict­ing our­selves to val­ues of t that gets you through the first slot. Give my input for the chal­lenge:

Disc #1 has 13 positions; at time=0, it is at position 11.
Disc #2 has 5 positions; at time=0, it is at position 0.
Disc #3 has 17 positions; at time=0, it is at position 11.
Disc #4 has 3 positions; at time=0, it is at position 0.
Disc #5 has 7 positions; at time=0, it is at position 2.
Disc #6 has 19 positions; at time=0, it is at position 17.

The first t that will get us through disc #1 is t=1 where disc #1 reach­es posi­tion 0 on t=2 (which is 1s away from t). From there, we only need to check every 13s, ie t=14, t=27, t=40, …

 

Part 2

After get­ting the first cap­sule (it con­tained a star! what great for­tune!), the
machine detects your suc­cess and begins to rearrange itself.

When it’s done, the discs are back in their orig­i­nal con­fig­u­ra­tion as if it were
time=0 again, but a new disc with 11 posi­tions and start­ing at posi­tion 0 has
appeared exact­ly one sec­ond below the pre­vi­ous­ly-bot­tom disc.

With this new disc, and count­ing again start­ing from time=0 with the
con­fig­u­ra­tion in your puz­zle input, what is the first time you can press the
but­ton to get anoth­er cap­sule?

 

Links