@@ -6,28 +6,53 @@ type Number = usize;
66
77impl 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
2317impl 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