@@ -16,43 +16,26 @@ fn main() {
1616 println ! ( "Part 2: {}" , part2( & input) ) ;
1717}
1818
19- #[ derive( Debug , Copy , Clone ) ]
20- enum Op {
21- Add ,
22- Mul ,
23- Concat ,
24- }
25-
26- impl Op {
27- fn apply ( & self , left : u64 , right : u64 ) -> u64 {
28- match self {
29- Op :: Add => left + right,
30- Op :: Mul => left * right,
31- Op :: Concat => left * right. next_multiple_of ( 10 ) + right,
32- }
33- }
34- }
35-
3619fn part1 ( input : & Input ) -> u64 {
3720 let mut sum = 0 ;
3821
3922 for ( result, values) in input. values . iter ( ) {
40- let result = * result;
41-
4223 let mut edge = vec ! [ ( 1 , values[ 0 ] ) ] ;
4324 while let Some ( ( n, x) ) = edge. pop ( ) {
4425 if n == values. len ( ) {
45- if x == result {
46- // solved!
47- sum += result;
26+ if x == * result {
27+ sum += * result;
4828 break ;
4929 }
5030 } else {
51- for op in [ Op :: Add , Op :: Mul ] {
52- let val = op. apply ( x, values[ n] ) ;
53- if val <= result {
54- edge. push ( ( n + 1 , val) ) ;
55- }
31+ let add = x + values[ n] ;
32+ if add <= * result {
33+ edge. push ( ( n + 1 , add) ) ;
34+ }
35+
36+ let mul = x * values[ n] ;
37+ if mul <= * result {
38+ edge. push ( ( n + 1 , mul) ) ;
5639 }
5740 }
5841 }
@@ -65,22 +48,27 @@ fn part2(input: &Input) -> u64 {
6548 let mut sum = 0 ;
6649
6750 for ( result, values) in input. values . iter ( ) {
68- let result = * result;
69-
7051 let mut edge = vec ! [ ( 1 , values[ 0 ] ) ] ;
7152 while let Some ( ( n, x) ) = edge. pop ( ) {
7253 if n == values. len ( ) {
73- // solved!
74- if x == result {
75- sum += result;
54+ if x == * result {
55+ sum += * result;
7656 break ;
7757 }
7858 } else {
79- for op in [ Op :: Add , Op :: Mul , Op :: Concat ] {
80- let val = op. apply ( x, values[ n] ) ;
81- if val <= result {
82- edge. push ( ( n + 1 , val) ) ;
83- }
59+ let add = x + values[ n] ;
60+ if add <= * result {
61+ edge. push ( ( n + 1 , add) ) ;
62+ }
63+
64+ let mul = x * values[ n] ;
65+ if mul <= * result {
66+ edge. push ( ( n + 1 , mul) ) ;
67+ }
68+
69+ let concat = format ! ( "{}{}" , x, values[ n] ) . parse ( ) . unwrap ( ) ;
70+ if concat <= * result {
71+ edge. push ( ( n + 1 , concat) ) ;
8472 }
8573 }
8674 }
0 commit comments