Skip to content

Commit e922536

Browse files
committed
feat(22/2024): calculate prices and diffs
1 parent ad00465 commit e922536

File tree

1 file changed

+60
-18
lines changed

1 file changed

+60
-18
lines changed

src/solutions/year2024/day22.rs

Lines changed: 60 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use crate::solutions::Solution;
2+
use itertools::Itertools;
23

34
pub struct Day22;
45

@@ -16,15 +17,26 @@ impl Solution for Day22 {
1617
.to_string()
1718
}
1819

19-
fn part_two(&self, _input: &str) -> String {
20+
fn part_two(&self, input: &str) -> String {
21+
let _diffs: Vec<Vec<i8>> = input
22+
.lines()
23+
.map(|line| {
24+
let initial: usize = line.parse().unwrap();
25+
let secrets = self.next_secrets(initial, 2000);
26+
let prices = self.prices(secrets);
27+
28+
self.diffs(prices)
29+
})
30+
.collect();
31+
2032
String::from("0")
2133
}
2234
}
2335

2436
impl Day22 {
2537
fn next_secrets(&self, initial: usize, number_of_secrets: usize) -> Vec<usize> {
2638
let mut secret = initial;
27-
let mut next_secrets = Vec::new();
39+
let mut next_secrets = vec![initial];
2840

2941
for _ in 0..number_of_secrets {
3042
secret = self.mix_and_prune(secret, |s| s * 64);
@@ -40,38 +52,68 @@ impl Day22 {
4052
fn mix_and_prune(&self, current: usize, calculations: fn(usize) -> usize) -> usize {
4153
(current ^ calculations(current)) % 16777216
4254
}
55+
56+
fn prices(&self, secrets: Vec<usize>) -> Vec<i8> {
57+
secrets.iter().map(|secret| (secret % 10) as i8).collect()
58+
}
59+
60+
fn diffs(&self, secrets: Vec<i8>) -> Vec<i8> {
61+
secrets.iter().tuple_windows().map(|(a, b)| b - a).collect()
62+
}
4363
}
4464

4565
#[cfg(test)]
4666
mod tests {
4767
use crate::solutions::year2024::day22::Day22;
4868
use crate::solutions::Solution;
4969

50-
const EXAMPLE: &str = r#"1
70+
const PART_ONE_EXAMPLE: &str = r#"1
5171
10
5272
100
5373
2024"#;
5474

5575
#[test]
5676
fn part_one_example() {
57-
assert_eq!("37327623", Day22.part_one(EXAMPLE));
77+
assert_eq!("37327623", Day22.part_one(PART_ONE_EXAMPLE));
78+
}
79+
80+
const PART_TWO_EXAMPLE: &str = r#"1
81+
2
82+
3
83+
2024"#;
84+
85+
#[test]
86+
#[ignore]
87+
fn part_two_example() {
88+
assert_eq!("23", Day22.part_two(PART_TWO_EXAMPLE));
5889
}
5990

6091
#[test]
6192
fn next_secrets() {
62-
let tmp = Day22.next_secrets(123, 10);
63-
let mut result = tmp.iter();
64-
65-
assert_eq!(Some(&15887950), result.next());
66-
assert_eq!(Some(&16495136), result.next());
67-
assert_eq!(Some(&527345), result.next());
68-
assert_eq!(Some(&704524), result.next());
69-
assert_eq!(Some(&1553684), result.next());
70-
assert_eq!(Some(&12683156), result.next());
71-
assert_eq!(Some(&11100544), result.next());
72-
assert_eq!(Some(&12249484), result.next());
73-
assert_eq!(Some(&7753432), result.next());
74-
assert_eq!(Some(&5908254), result.next());
75-
assert_eq!(None, result.next());
93+
let secrets = Day22.next_secrets(123, 10);
94+
let mut iter = secrets.iter();
95+
96+
assert_eq!(Some(&123), iter.next());
97+
assert_eq!(Some(&15887950), iter.next());
98+
assert_eq!(Some(&16495136), iter.next());
99+
assert_eq!(Some(&527345), iter.next());
100+
assert_eq!(Some(&704524), iter.next());
101+
assert_eq!(Some(&1553684), iter.next());
102+
assert_eq!(Some(&12683156), iter.next());
103+
assert_eq!(Some(&11100544), iter.next());
104+
assert_eq!(Some(&12249484), iter.next());
105+
assert_eq!(Some(&7753432), iter.next());
106+
assert_eq!(Some(&5908254), iter.next());
107+
assert_eq!(None, iter.next());
108+
}
109+
110+
#[test]
111+
fn prices_and_diffs() {
112+
let secrets = Day22.next_secrets(123, 9);
113+
let prices = Day22.prices(secrets);
114+
assert_eq!(vec![3, 0, 6, 5, 4, 4, 6, 4, 4, 2], prices);
115+
116+
let diffs = Day22.diffs(prices);
117+
assert_eq!(vec![-3, 6, -1, -1, 0, 2, -2, 0, -2], diffs);
76118
}
77119
}

0 commit comments

Comments
 (0)