1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
//! # 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:
//!
//! ```txt
//! 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?**
//!
//! [gas giants]: https://en.wikipedia.org/wiki/Gas_giant

use anyhow::Result;

pub const INPUT: &str = include_str!("d16.txt");

pub fn solve_part_one(input: &str) -> Result<i64> {
    Ok(0)
}

pub fn solve_part_two(input: &str) -> Result<i64> {
    Ok(0)
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn part_one() {}

    #[test]
    fn part_two() {}
}