@@ -2,25 +2,88 @@ use crate::solutions::Solution;
22
33pub struct Day11 ;
44
5+ type Number = usize ;
6+
57impl Solution for Day11 {
6- fn part_one ( & self , _input : & str ) -> String {
7- String :: from ( '0' )
8+ 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 ( )
816 }
917
1018 fn part_two ( & self , _input : & str ) -> String {
1119 String :: from ( '0' )
1220 }
1321}
1422
23+ impl Day11 {
24+ fn parse ( & self , input : & str ) -> Vec < Number > {
25+ input
26+ . split_whitespace ( )
27+ . map ( |x| x. parse :: < usize > ( ) . unwrap ( ) )
28+ . collect ( )
29+ }
30+
31+ fn blink ( & self , numbers : Vec < Number > ) -> Vec < Number > {
32+ numbers
33+ . into_iter ( )
34+ . flat_map ( |n| self . blink_for_number ( n) )
35+ . collect ( )
36+ }
37+
38+ fn blink_for_number ( & self , number : Number ) -> Vec < Number > {
39+ if number == 0 {
40+ return vec ! [ 1 ] ;
41+ }
42+
43+ let number_str = number. to_string ( ) ;
44+ let len = number_str. len ( ) ;
45+ if len % 2 == 0 {
46+ let middle = len / 2 ;
47+
48+ return vec ! [
49+ number_str[ ..middle] . parse:: <Number >( ) . unwrap( ) ,
50+ number_str[ middle..] . parse:: <Number >( ) . unwrap( ) ,
51+ ] ;
52+ }
53+
54+ vec ! [ number * 2024 ]
55+ }
56+ }
57+
1558#[ cfg( test) ]
1659mod tests {
17- use crate :: solutions:: year2024:: day11:: Day11 ;
60+ use crate :: solutions:: year2024:: day11:: { Day11 , Number } ;
1861 use crate :: solutions:: Solution ;
62+ use itertools:: Itertools ;
1963
20- const EXAMPLE : & str = r#""# ;
64+ const EXAMPLE : & str = r#"0 1 10 99 999"# ;
65+ const EXAMPLE_2 : & str = r#"125 17"# ;
2166
2267 #[ test]
2368 fn part_one_example_test ( ) {
24- assert_eq ! ( "0" , Day11 . part_one( EXAMPLE ) ) ;
69+ assert_eq ! ( "55312" , Day11 . part_one( EXAMPLE_2 ) ) ;
70+ }
71+
72+ #[ 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 ) ) ;
80+ }
81+
82+ #[ test]
83+ fn blink ( ) {
84+ let blink_result: Vec < Number > = Day11 . blink ( Day11 . parse ( EXAMPLE ) ) ;
85+ let result_str = blink_result. iter ( ) . map ( |n| n. to_string ( ) ) . join ( " " ) ;
86+
87+ assert_eq ! ( "1 2024 1 0 9 9 2021976" , result_str) ;
2588 }
2689}
0 commit comments