Skip to content

Commit 79b7081

Browse files
committed
refactor(10/2024): refactor to blink fold method
1 parent 211b739 commit 79b7081

File tree

1 file changed

+52
-18
lines changed

1 file changed

+52
-18
lines changed

src/solutions/year2024/day11.rs

Lines changed: 52 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,53 @@ type Number = usize;
66

77
impl Solution for Day11 {
88
fn part_one(&self, input: &str) -> String {
9-
let mut numbers = self.parse(input);
10-
11-
for _ in 0..25 {
12-
numbers = self.blink(numbers)
13-
}
14-
15-
numbers.len().to_string()
9+
self.solve(input, 25)
1610
}
1711

18-
fn part_two(&self, _input: &str) -> String {
19-
String::from('0')
12+
fn part_two(&self, input: &str) -> String {
13+
self.solve(input, 75)
2014
}
2115
}
2216

2317
impl Day11 {
18+
fn solve(&self, input: &str, times: u8) -> String {
19+
let numbers = self.parse(input);
20+
21+
self.blink_fold(numbers, 0, times, 0).to_string()
22+
}
23+
2424
fn parse(&self, input: &str) -> Vec<Number> {
2525
input
2626
.split_whitespace()
2727
.map(|x| x.parse::<usize>().unwrap())
2828
.collect()
2929
}
3030

31+
fn blink_fold(
32+
&self,
33+
numbers: Vec<Number>,
34+
iteration: u8,
35+
max_iteration: u8,
36+
stones_count: usize,
37+
) -> usize {
38+
if iteration == max_iteration {
39+
return stones_count + numbers.len();
40+
}
41+
42+
let mut tmp_stones_count: usize = 0;
43+
44+
for number in numbers {
45+
let new_numbers = self.blink_for_number(number);
46+
47+
// todo cache it - key is number + iteration
48+
tmp_stones_count +=
49+
self.blink_fold(new_numbers, iteration + 1, max_iteration, stones_count);
50+
}
51+
52+
stones_count + tmp_stones_count
53+
}
54+
55+
#[allow(dead_code)]
3156
fn blink(&self, numbers: Vec<Number>) -> Vec<Number> {
3257
numbers
3358
.into_iter()
@@ -70,20 +95,29 @@ mod tests {
7095
}
7196

7297
#[test]
73-
fn blink_for_number() {
74-
assert_eq!(vec![1], Day11.blink_for_number(0));
75-
assert_eq!(vec![2024], Day11.blink_for_number(1));
76-
assert_eq!(vec![1, 0], Day11.blink_for_number(10));
77-
assert_eq!(vec![9, 9], Day11.blink_for_number(99));
78-
assert_eq!(vec![2021976], Day11.blink_for_number(999));
79-
assert_eq!(vec![253, 0], Day11.blink_for_number(253000));
98+
fn blink_for_number_test() {
99+
assert_eq!(vec![1], blink_for_number(0));
100+
assert_eq!(vec![2024], blink_for_number(1));
101+
assert_eq!(vec![1, 0], blink_for_number(10));
102+
assert_eq!(vec![9, 9], blink_for_number(99));
103+
assert_eq!(vec![2021976], blink_for_number(999));
104+
assert_eq!(vec![253, 0], blink_for_number(253000));
80105
}
81106

82107
#[test]
83-
fn blink() {
84-
let blink_result: Vec<Number> = Day11.blink(Day11.parse(EXAMPLE));
108+
fn blink_test() {
109+
let parsed = Day11.parse(EXAMPLE);
110+
let blink_result: Vec<Number> = blink(parsed);
85111
let result_str = blink_result.iter().map(|n| n.to_string()).join(" ");
86112

87113
assert_eq!("1 2024 1 0 9 9 2021976", result_str);
88114
}
115+
116+
fn blink(numbers: Vec<Number>) -> Vec<Number> {
117+
Day11.blink(numbers)
118+
}
119+
120+
fn blink_for_number(number: Number) -> Vec<Number> {
121+
Day11.blink_for_number(number)
122+
}
89123
}

0 commit comments

Comments
 (0)