11use aoc:: { common, grid:: Grid , io} ;
22
3+ enum Operation {
4+ Add ,
5+ Multiply ,
6+ }
7+
38fn solve2 ( input : & str ) -> usize {
4- let mut grid = Grid :: from_str_no_trim ( input, |c| c) ;
5- //grid.print();
6- let max_l = grid. values . iter ( ) . map ( |v| v. len ( ) ) . max ( ) . unwrap_or ( 0 ) ;
7- //dbg!(max_l);
8- for val in grid. values . iter_mut ( ) {
9- val. resize ( max_l, ' ' ) ;
10- }
11- grid. cols = max_l;
12- //grid.print();
9+ let grid = Grid :: from_str_no_trim ( input, |c| c, & ' ' ) ;
10+ grid. print ( ) ;
1311 let grid2 = grid. rotate_clockwise ( ) ;
14- // grid2.print();
12+ grid2. print ( ) ;
1513
1614 let mut ans = 0 ;
17- let mut op_mul = false ;
15+ let mut op = Operation :: Add ;
1816 let mut ret = 0 ;
1917 for val in grid2. values . iter ( ) {
20- let str = val. iter ( ) . collect :: < String > ( ) ;
21- //println!("{}\n", str);
22- if str. trim ( ) . is_empty ( ) {
23- //dbg!(ret);
24- ans += ret;
18+ if val[ 0 ] == '+' {
19+ op = Operation :: Add ;
2520 ret = 0 ;
26- op_mul = false ;
27- continue ;
28- }
29- let x = if str. contains ( "*" ) {
30- op_mul = true ;
21+ } else if val[ 0 ] == '*' {
22+ op = Operation :: Multiply ;
3123 ret = 1 ;
32- str[ 1 ..]
33- . trim ( )
34- . chars ( )
35- . rev ( )
36- . collect :: < String > ( )
37- . parse :: < usize > ( )
38- . unwrap ( )
39- } else if str. contains ( "+" ) {
40- op_mul = false ;
41- ret = 0 ;
42- str[ 1 ..]
43- . trim ( )
44- . chars ( )
45- . rev ( )
46- . collect :: < String > ( )
47- . parse :: < usize > ( )
48- . unwrap ( )
49- } else {
50- str. trim ( )
51- . chars ( )
52- . rev ( )
53- . collect :: < String > ( )
54- . parse :: < usize > ( )
55- . unwrap ( )
5624 } ;
57-
58- //dbg!(x);
59- if op_mul {
60- ret *= x;
25+ if let Ok ( number) = val
26+ . iter ( )
27+ . skip ( 1 )
28+ . rev ( )
29+ . collect :: < String > ( )
30+ . trim ( )
31+ . parse :: < usize > ( )
32+ {
33+ //dbg!(number);
34+ match op {
35+ Operation :: Add => ret += number,
36+ Operation :: Multiply => ret *= number,
37+ }
6138 } else {
62- ret += x ;
39+ ans += ret ;
6340 }
6441 }
6542 ans += ret;
6643 ans
6744}
6845
69- fn solve < const PART : usize > ( input : & str ) -> usize {
46+ fn solve1 ( input : & str ) -> usize {
7047 let mut ans = 0 ;
7148 let mut nums_tot: Vec < Vec < usize > > = Vec :: new ( ) ;
7249 for line in input. lines ( ) {
@@ -80,15 +57,15 @@ fn solve<const PART: usize>(input: &str) -> usize {
8057 match * op {
8158 "+" => {
8259 let mut ret = 0 ;
83- for i in 0 .. nums_tot. len ( ) {
84- ret += nums_tot [ i ] [ j] ;
60+ for row in & nums_tot {
61+ ret += row [ j] ;
8562 }
8663 ans += ret;
8764 }
8865 "*" => {
8966 let mut ret = 1 ;
90- for i in 0 .. nums_tot. len ( ) {
91- ret *= nums_tot [ i ] [ j] ;
67+ for row in & nums_tot {
68+ ret *= row [ j] ;
9269 }
9370 ans += ret;
9471 }
@@ -106,7 +83,7 @@ fn solve<const PART: usize>(input: &str) -> usize {
10683
10784fn main ( ) {
10885 if let Some ( input) = common:: get_input ( ) {
109- common:: timed ( & input, solve :: < 1 > , true ) ;
86+ common:: timed ( & input, solve1 , true ) ;
11087 common:: timed ( & input, solve2, false ) ;
11188 }
11289}
@@ -118,7 +95,7 @@ mod tests {
11895 #[ test]
11996 fn test_samples ( ) {
12097 let sample_input = "123 328 51 64\n 45 64 387 23\n 6 98 215 314\n * + * + " ;
121- assert_eq ! ( solve :: < 1 > ( sample_input) , 4277556 ) ;
98+ assert_eq ! ( solve1 ( sample_input) , 4277556 ) ;
12299 assert_eq ! ( solve2( sample_input) , 3263827 ) ;
123100 }
124101}
0 commit comments