237 lines
9.1 KiB
Plaintext
237 lines
9.1 KiB
Plaintext
|
Advent of Code
|
|||
|
|
|||
|
--- Day 22: Monkey Market ---
|
|||
|
|
|||
|
As you're all teleported deep into the jungle, a [16]monkey steals The
|
|||
|
Historians' device! You'll need to get it back while The Historians are
|
|||
|
looking for the Chief.
|
|||
|
|
|||
|
The monkey that stole the device seems willing to trade it, but only in
|
|||
|
exchange for an absurd number of bananas. Your only option is to buy
|
|||
|
bananas on the Monkey Exchange Market.
|
|||
|
|
|||
|
You aren't sure how the Monkey Exchange Market works, but one of The
|
|||
|
Historians senses trouble and comes over to help. Apparently, they've been
|
|||
|
studying these monkeys for a while and have deciphered their secrets.
|
|||
|
|
|||
|
Today, the Market is full of monkeys buying good hiding spots.
|
|||
|
Fortunately, because of the time you recently spent in this jungle, you
|
|||
|
know lots of good hiding spots you can sell! If you sell enough hiding
|
|||
|
spots, you should be able to get enough bananas to buy the device back.
|
|||
|
|
|||
|
On the Market, the buyers seem to use random prices, but their prices are
|
|||
|
actually only [17]pseudorandom! If you know the secret of how they pick
|
|||
|
their prices, you can wait for the perfect time to sell.
|
|||
|
|
|||
|
The part about secrets is literal, the Historian explains. Each buyer
|
|||
|
produces a pseudorandom sequence of secret numbers where each secret is
|
|||
|
derived from the previous.
|
|||
|
|
|||
|
In particular, each buyer's secret number evolves into the next secret
|
|||
|
number in the sequence via the following process:
|
|||
|
|
|||
|
• Calculate the result of multiplying the secret number by 64. Then, mix
|
|||
|
this result into the secret number. Finally, prune the secret number.
|
|||
|
• Calculate the result of dividing the secret number by 32. Round the
|
|||
|
result down to the nearest integer. Then, mix this result into the
|
|||
|
secret number. Finally, prune the secret number.
|
|||
|
• Calculate the result of multiplying the secret number by 2048. Then,
|
|||
|
mix this result into the secret number. Finally, prune the secret
|
|||
|
number.
|
|||
|
|
|||
|
Each step of the above process involves mixing and pruning:
|
|||
|
|
|||
|
• To mix a value into the secret number, calculate the [18]bitwise XOR
|
|||
|
of the given value and the secret number. Then, the secret number
|
|||
|
becomes the result of that operation. (If the secret number is 42 and
|
|||
|
you were to mix 15 into the secret number, the secret number would
|
|||
|
become 37.)
|
|||
|
• To prune the secret number, calculate the value of the secret number
|
|||
|
[19]modulo 16777216. Then, the secret number becomes the result of
|
|||
|
that operation. (If the secret number is 100000000 and you were to
|
|||
|
prune the secret number, the secret number would become 16113920.)
|
|||
|
|
|||
|
After this process completes, the buyer is left with the next secret
|
|||
|
number in the sequence. The buyer can repeat this process as many times as
|
|||
|
necessary to produce more secret numbers.
|
|||
|
|
|||
|
So, if a buyer had a secret number of 123, that buyer's next ten secret
|
|||
|
numbers would be:
|
|||
|
|
|||
|
15887950
|
|||
|
16495136
|
|||
|
527345
|
|||
|
704524
|
|||
|
1553684
|
|||
|
12683156
|
|||
|
11100544
|
|||
|
12249484
|
|||
|
7753432
|
|||
|
5908254
|
|||
|
|
|||
|
Each buyer uses their own secret number when choosing their price, so it's
|
|||
|
important to be able to predict the sequence of secret numbers for each
|
|||
|
buyer. Fortunately, the Historian's research has uncovered the initial
|
|||
|
secret number of each buyer (your puzzle input). For example:
|
|||
|
|
|||
|
1
|
|||
|
10
|
|||
|
100
|
|||
|
2024
|
|||
|
|
|||
|
This list describes the initial secret number of four different
|
|||
|
secret-hiding-spot-buyers on the Monkey Exchange Market. If you can
|
|||
|
simulate secret numbers from each buyer, you'll be able to predict all of
|
|||
|
their future prices.
|
|||
|
|
|||
|
In a single day, buyers each have time to generate 2000 new secret
|
|||
|
numbers. In this example, for each buyer, their initial secret number and
|
|||
|
the 2000th new secret number they would generate are:
|
|||
|
|
|||
|
1: 8685429
|
|||
|
10: 4700978
|
|||
|
100: 15273692
|
|||
|
2024: 8667524
|
|||
|
|
|||
|
Adding up the 2000th new secret number for each buyer produces 37327623.
|
|||
|
|
|||
|
For each buyer, simulate the creation of 2000 new secret numbers. What is
|
|||
|
the sum of the 2000th secret number generated by each buyer?
|
|||
|
|
|||
|
Your puzzle answer was 14082561342.
|
|||
|
|
|||
|
--- Part Two ---
|
|||
|
|
|||
|
Of course, the secret numbers aren't the prices each buyer is offering!
|
|||
|
That would be ridiculous. Instead, the prices the buyer offers are just
|
|||
|
the ones digit of each of their secret numbers.
|
|||
|
|
|||
|
So, if a buyer starts with a secret number of 123, that buyer's first ten
|
|||
|
prices would be:
|
|||
|
|
|||
|
3 (from 123)
|
|||
|
0 (from 15887950)
|
|||
|
6 (from 16495136)
|
|||
|
5 (etc.)
|
|||
|
4
|
|||
|
4
|
|||
|
6
|
|||
|
4
|
|||
|
4
|
|||
|
2
|
|||
|
|
|||
|
This price is the number of bananas that buyer is offering in exchange for
|
|||
|
your information about a new hiding spot. However, you still don't speak
|
|||
|
[20]monkey, so you can't negotiate with the buyers directly. The Historian
|
|||
|
speaks a little, but not enough to negotiate; instead, he can ask another
|
|||
|
monkey to negotiate on your behalf.
|
|||
|
|
|||
|
Unfortunately, the monkey only knows how to decide when to sell by looking
|
|||
|
at the changes in price. Specifically, the monkey will only look for a
|
|||
|
specific sequence of four consecutive changes in price, then immediately
|
|||
|
sell when it sees that sequence.
|
|||
|
|
|||
|
So, if a buyer starts with a secret number of 123, that buyer's first ten
|
|||
|
secret numbers, prices, and the associated changes would be:
|
|||
|
|
|||
|
123: 3
|
|||
|
15887950: 0 (-3)
|
|||
|
16495136: 6 (6)
|
|||
|
527345: 5 (-1)
|
|||
|
704524: 4 (-1)
|
|||
|
1553684: 4 (0)
|
|||
|
12683156: 6 (2)
|
|||
|
11100544: 4 (-2)
|
|||
|
12249484: 4 (0)
|
|||
|
7753432: 2 (-2)
|
|||
|
|
|||
|
Note that the first price has no associated change because there was no
|
|||
|
previous price to compare it with.
|
|||
|
|
|||
|
In this short example, within just these first few prices, the highest
|
|||
|
price will be 6, so it would be nice to give the monkey instructions that
|
|||
|
would make it sell at that time. The first 6 occurs after only two
|
|||
|
changes, so there's no way to instruct the monkey to sell then, but the
|
|||
|
second 6 occurs after the changes -1,-1,0,2. So, if you gave the monkey
|
|||
|
that sequence of changes, it would wait until the first time it sees that
|
|||
|
sequence and then immediately sell your hiding spot information at the
|
|||
|
current price, winning you 6 bananas.
|
|||
|
|
|||
|
Each buyer only wants to buy one hiding spot, so after the hiding spot is
|
|||
|
sold, the monkey will move on to the next buyer. If the monkey never hears
|
|||
|
that sequence of price changes from a buyer, the monkey will never sell,
|
|||
|
and will instead just move on to the next buyer.
|
|||
|
|
|||
|
Worse, you can only give the monkey a single sequence of four price
|
|||
|
changes to look for. You can't change the sequence between buyers.
|
|||
|
|
|||
|
You're going to need as many bananas as possible, so you'll need to
|
|||
|
determine which sequence of four price changes will cause the monkey to
|
|||
|
get you the most bananas overall. Each buyer is going to generate 2000
|
|||
|
secret numbers after their initial secret number, so, for each buyer,
|
|||
|
you'll have 2000 price changes in which your sequence can occur.
|
|||
|
|
|||
|
Suppose the initial secret number of each buyer is:
|
|||
|
|
|||
|
1
|
|||
|
2
|
|||
|
3
|
|||
|
2024
|
|||
|
|
|||
|
There are many sequences of four price changes you could tell the monkey,
|
|||
|
but for these four buyers, the sequence that will get you the most bananas
|
|||
|
is -2,1,-1,3. Using that sequence, the monkey will make the following
|
|||
|
sales:
|
|||
|
|
|||
|
• For the buyer with an initial secret number of 1, changes -2,1,-1,3
|
|||
|
first occur when the price is 7.
|
|||
|
• For the buyer with initial secret 2, changes -2,1,-1,3 first occur
|
|||
|
when the price is 7.
|
|||
|
• For the buyer with initial secret 3, the change sequence -2,1,-1,3
|
|||
|
does not occur in the first 2000 changes.
|
|||
|
• For the buyer starting with 2024, changes -2,1,-1,3 first occur when
|
|||
|
the price is 9.
|
|||
|
|
|||
|
So, by asking the monkey to sell the first time each buyer's prices go
|
|||
|
down 2, then up 1, then down 1, then up 3, you would get 23 (7 + 7 + 9)
|
|||
|
bananas!
|
|||
|
|
|||
|
Figure out the best sequence to tell the monkey so that by looking for
|
|||
|
that same sequence of changes in every buyer's future prices, you get the
|
|||
|
most bananas in total. What is the most bananas you can get?
|
|||
|
|
|||
|
Your puzzle answer was 1568.
|
|||
|
|
|||
|
Both parts of this puzzle are complete! They provide two gold stars: **
|
|||
|
|
|||
|
At this point, you should [21]return to your Advent calendar and try
|
|||
|
another puzzle.
|
|||
|
|
|||
|
If you still want to see it, you can [22]get your puzzle input.
|
|||
|
|
|||
|
References
|
|||
|
|
|||
|
Visible links
|
|||
|
1. https://adventofcode.com/
|
|||
|
2. https://adventofcode.com/2024/about
|
|||
|
3. https://adventofcode.com/2024/events
|
|||
|
4. https://cottonbureau.com/people/advent-of-code
|
|||
|
5. https://adventofcode.com/2024/settings
|
|||
|
6. https://adventofcode.com/2024/auth/logout
|
|||
|
7. Advent of Code Supporter
|
|||
|
https://adventofcode.com/2024/support
|
|||
|
8. https://adventofcode.com/2024
|
|||
|
9. https://adventofcode.com/2024
|
|||
|
10. https://adventofcode.com/2024/support
|
|||
|
11. https://adventofcode.com/2024/sponsors
|
|||
|
12. https://adventofcode.com/2024/leaderboard
|
|||
|
13. https://adventofcode.com/2024/stats
|
|||
|
14. https://adventofcode.com/2024/sponsors
|
|||
|
16. https://adventofcode.com/2022/day/11
|
|||
|
17. https://en.wikipedia.org/wiki/Pseudorandom_number_generator
|
|||
|
18. https://en.wikipedia.org/wiki/Bitwise_operation#XOR
|
|||
|
19. https://en.wikipedia.org/wiki/Modulo
|
|||
|
20. https://adventofcode.com/2022/day/21
|
|||
|
21. https://adventofcode.com/2024
|
|||
|
22. https://adventofcode.com/2024/day/22/input
|