144 lines
7.3 KiB
Plaintext
144 lines
7.3 KiB
Plaintext
Advent of Code
|
||
|
||
--- Day 16: Flawed Frequency Transmission ---
|
||
|
||
You're 3/4ths of the way through the gas giants. Not only do roundtrip signals to Earth take five hours, but the signal
|
||
quality is quite bad as well. You can clean up the signal with the Flawed Frequency Transmission algorithm, or FFT.
|
||
|
||
As input, FFT takes a list of numbers. In the signal you received (your puzzle input), each number is a single digit: data
|
||
like 15243 represents the sequence 1, 5, 2, 4, 3.
|
||
|
||
FFT operates in repeated phases. In each phase, a new list is constructed with the same length as the input list. This new
|
||
list is also used as the input for the next phase.
|
||
|
||
Each element in the new list is built by multiplying every value in the input list by a value in a repeating pattern and then
|
||
adding up the results. So, if the input list were 9, 8, 7, 6, 5 and the pattern for a given element were 1, 2, 3, the result
|
||
would be 9*1 + 8*2 + 7*3 + 6*1 + 5*2 (with each input element on the left and each value in the repeating pattern on the
|
||
right of each multiplication). Then, only the ones digit is kept: 38 becomes 8, -17 becomes 7, and so on.
|
||
|
||
While each element in the output array uses all of the same input array elements, the actual repeating pattern to use depends
|
||
on which output element is being calculated. The base pattern is 0, 1, 0, -1. Then, repeat each value in the pattern a number
|
||
of times equal to the position in the output list being considered. Repeat once for the first element, twice for the second
|
||
element, three times for the third element, and so on. So, if the third element of the output list is being calculated,
|
||
repeating the values would produce: 0, 0, 0, 1, 1, 1, 0, 0, 0, -1, -1, -1.
|
||
|
||
When applying the pattern, skip the very first value exactly once. (In other words, offset the whole pattern left by one.)
|
||
So, for the second element of the output list, the actual pattern used would be: 0, 1, 1, 0, 0, -1, -1, 0, 0, 1, 1, 0, 0, -1,
|
||
-1, ....
|
||
|
||
After using this process to calculate each element of the output list, the phase is complete, and the output list of this
|
||
phase is used as the new input list for the next phase, if any.
|
||
|
||
Given the input signal 12345678, below are four phases of FFT. Within each phase, each output digit is calculated on a single
|
||
line with the result at the far right; each multiplication operation shows the input digit on the left and the pattern value
|
||
on the right:
|
||
|
||
Input signal: 12345678
|
||
|
||
1*1 + 2*0 + 3*-1 + 4*0 + 5*1 + 6*0 + 7*-1 + 8*0 = 4
|
||
1*0 + 2*1 + 3*1 + 4*0 + 5*0 + 6*-1 + 7*-1 + 8*0 = 8
|
||
1*0 + 2*0 + 3*1 + 4*1 + 5*1 + 6*0 + 7*0 + 8*0 = 2
|
||
1*0 + 2*0 + 3*0 + 4*1 + 5*1 + 6*1 + 7*1 + 8*0 = 2
|
||
1*0 + 2*0 + 3*0 + 4*0 + 5*1 + 6*1 + 7*1 + 8*1 = 6
|
||
1*0 + 2*0 + 3*0 + 4*0 + 5*0 + 6*1 + 7*1 + 8*1 = 1
|
||
1*0 + 2*0 + 3*0 + 4*0 + 5*0 + 6*0 + 7*1 + 8*1 = 5
|
||
1*0 + 2*0 + 3*0 + 4*0 + 5*0 + 6*0 + 7*0 + 8*1 = 8
|
||
|
||
After 1 phase: 48226158
|
||
|
||
4*1 + 8*0 + 2*-1 + 2*0 + 6*1 + 1*0 + 5*-1 + 8*0 = 3
|
||
4*0 + 8*1 + 2*1 + 2*0 + 6*0 + 1*-1 + 5*-1 + 8*0 = 4
|
||
4*0 + 8*0 + 2*1 + 2*1 + 6*1 + 1*0 + 5*0 + 8*0 = 0
|
||
4*0 + 8*0 + 2*0 + 2*1 + 6*1 + 1*1 + 5*1 + 8*0 = 4
|
||
4*0 + 8*0 + 2*0 + 2*0 + 6*1 + 1*1 + 5*1 + 8*1 = 0
|
||
4*0 + 8*0 + 2*0 + 2*0 + 6*0 + 1*1 + 5*1 + 8*1 = 4
|
||
4*0 + 8*0 + 2*0 + 2*0 + 6*0 + 1*0 + 5*1 + 8*1 = 3
|
||
4*0 + 8*0 + 2*0 + 2*0 + 6*0 + 1*0 + 5*0 + 8*1 = 8
|
||
|
||
After 2 phases: 34040438
|
||
|
||
3*1 + 4*0 + 0*-1 + 4*0 + 0*1 + 4*0 + 3*-1 + 8*0 = 0
|
||
3*0 + 4*1 + 0*1 + 4*0 + 0*0 + 4*-1 + 3*-1 + 8*0 = 3
|
||
3*0 + 4*0 + 0*1 + 4*1 + 0*1 + 4*0 + 3*0 + 8*0 = 4
|
||
3*0 + 4*0 + 0*0 + 4*1 + 0*1 + 4*1 + 3*1 + 8*0 = 1
|
||
3*0 + 4*0 + 0*0 + 4*0 + 0*1 + 4*1 + 3*1 + 8*1 = 5
|
||
3*0 + 4*0 + 0*0 + 4*0 + 0*0 + 4*1 + 3*1 + 8*1 = 5
|
||
3*0 + 4*0 + 0*0 + 4*0 + 0*0 + 4*0 + 3*1 + 8*1 = 1
|
||
3*0 + 4*0 + 0*0 + 4*0 + 0*0 + 4*0 + 3*0 + 8*1 = 8
|
||
|
||
After 3 phases: 03415518
|
||
|
||
0*1 + 3*0 + 4*-1 + 1*0 + 5*1 + 5*0 + 1*-1 + 8*0 = 0
|
||
0*0 + 3*1 + 4*1 + 1*0 + 5*0 + 5*-1 + 1*-1 + 8*0 = 1
|
||
0*0 + 3*0 + 4*1 + 1*1 + 5*1 + 5*0 + 1*0 + 8*0 = 0
|
||
0*0 + 3*0 + 4*0 + 1*1 + 5*1 + 5*1 + 1*1 + 8*0 = 2
|
||
0*0 + 3*0 + 4*0 + 1*0 + 5*1 + 5*1 + 1*1 + 8*1 = 9
|
||
0*0 + 3*0 + 4*0 + 1*0 + 5*0 + 5*1 + 1*1 + 8*1 = 4
|
||
0*0 + 3*0 + 4*0 + 1*0 + 5*0 + 5*0 + 1*1 + 8*1 = 9
|
||
0*0 + 3*0 + 4*0 + 1*0 + 5*0 + 5*0 + 1*0 + 8*1 = 8
|
||
|
||
After 4 phases: 01029498
|
||
|
||
Here are the first eight digits of the final output list after 100 phases for some larger inputs:
|
||
|
||
• 80871224585914546619083218645595 becomes 24176176.
|
||
• 19617804207202209144916044189917 becomes 73745418.
|
||
• 69317163492948606335995924319873 becomes 52432133.
|
||
|
||
After 100 phases of FFT, what are the first eight digits in the final output list?
|
||
|
||
Your puzzle answer was 40921727.
|
||
|
||
--- Part Two ---
|
||
|
||
Now that your FFT is working, you can decode the real signal.
|
||
|
||
The real signal is your puzzle input repeated 10000 times. Treat this new signal as a single input list. Patterns are still
|
||
calculated as before, and 100 phases of FFT are still applied.
|
||
|
||
The first seven digits of your initial input signal also represent the message offset. The message offset is the location of
|
||
the eight-digit message in the final output list. Specifically, the message offset indicates the number of digits to skip
|
||
before reading the eight-digit message. For example, if the first seven digits of your initial input signal were 1234567, the
|
||
eight-digit message would be the eight digits after skipping 1,234,567 digits of the final output list. Or, if the message
|
||
offset were 7 and your final output list were 98765432109876543210, the eight-digit message would be 21098765. (Of course,
|
||
your real message offset will be a seven-digit number, not a one-digit number like 7.)
|
||
|
||
Here is the eight-digit message in the final output list after 100 phases. The message offset given in each input has been
|
||
highlighted. (Note that the inputs given below are repeated 10000 times to find the actual starting input lists.)
|
||
|
||
• 03036732577212944063491565474664 becomes 84462026.
|
||
• 02935109699940807407585447034323 becomes 78725270.
|
||
• 03081770884921959731165446850517 becomes 53553731.
|
||
|
||
After repeating your input signal 10000 times and running 100 phases of FFT, what is the eight-digit message embedded in the
|
||
final output list?
|
||
|
||
Your puzzle answer was 89950138.
|
||
|
||
Both parts of this puzzle are complete! They provide two gold stars: **
|
||
|
||
At this point, all that is left is for you to admire your Advent calendar.
|
||
|
||
If you still want to see it, you can get your puzzle input.
|
||
|
||
References
|
||
|
||
Visible links
|
||
. https://adventofcode.com/
|
||
. https://adventofcode.com/2019/about
|
||
. https://adventofcode.com/2019/events
|
||
. https://adventofcode.com/2019/settings
|
||
. https://adventofcode.com/2019/auth/logout
|
||
. Advent of Code Supporter
|
||
https://adventofcode.com/2019/support
|
||
. https://adventofcode.com/2019
|
||
. https://adventofcode.com/2019
|
||
. https://adventofcode.com/2019/support
|
||
. https://adventofcode.com/2019/sponsors
|
||
. https://adventofcode.com/2019/leaderboard
|
||
. https://adventofcode.com/2019/stats
|
||
. https://adventofcode.com/2019/sponsors
|
||
. https://en.wikipedia.org/wiki/Gas_giant
|
||
. https://adventofcode.com/2019
|
||
. https://adventofcode.com/2019/day/16/input
|