1
1
use super :: day:: { Day } ;
2
- use std:: fmt;
3
2
4
3
5
4
// CrabSubmarine
@@ -28,25 +27,41 @@ impl CrabSubmarine {
28
27
}
29
28
result
30
29
}
30
+
31
+ fn compute_distance2 ( & self ) ->u32 {
32
+ let result: u32 ;
33
+ if self . start_pos >self . dest_pos {
34
+ result =( 0 ..=self . start_pos -self . dest_pos ) . into_iter ( ) . fold ( 0 , |acc, x| acc+x)
35
+ }
36
+ else {
37
+ result =( 0 ..=self . dest_pos -self . start_pos ) . into_iter ( ) . fold ( 0 , |acc, x| acc+x)
38
+ }
39
+ result
40
+ }
31
41
}
32
42
33
43
34
44
35
45
pub struct Day07 { }
36
46
47
+ impl Day07 {
48
+ fn parse_input ( input : & str ) ->Vec < u32 > {
49
+ input. lines ( )
50
+ . next ( )
51
+ . unwrap ( )
52
+ . split ( ',' )
53
+ . map ( |x| x. parse ( ) . unwrap ( ) )
54
+ . collect :: < Vec < u32 > > ( )
55
+ }
56
+ }
57
+
37
58
impl Day for Day07 {
38
59
fn day_number ( & self ) ->& str {
39
60
"07"
40
61
}
41
62
42
63
fn part_1 ( & self ) ->String {
43
- let mut input: Vec < u32 > =self . load_input ( )
44
- . lines ( )
45
- . next ( )
46
- . unwrap ( )
47
- . split ( ',' )
48
- . map ( |x| x. parse ( ) . unwrap ( ) )
49
- . collect :: < Vec < u32 > > ( ) ;
64
+ let mut input: Vec < u32 > =Day07 :: parse_input ( & self . load_input ( ) ) ;
50
65
input. sort ( ) ;
51
66
// Compute median
52
67
let med;
@@ -67,30 +82,22 @@ impl Day for Day07 {
67
82
}
68
83
69
84
fn part_2 ( & self ) ->String {
70
- let mut input: Vec < u32 > =self . load_input ( )
71
- . lines ( )
72
- . next ( )
73
- . unwrap ( )
74
- . split ( ',' )
75
- . map ( |x| x. parse ( ) . unwrap ( ) )
76
- . collect :: < Vec < u32 > > ( ) ;
85
+ let mut input: Vec < u32 > =Day07 :: parse_input ( & self . load_input ( ) ) ;
77
86
input. sort ( ) ;
78
- // Compute median
79
- let med;
80
- let len = input. len ( ) ;
81
- if len %2 !=0 {
82
- med = input[ len /2 ] ;
83
- }
84
- else {
85
- med =( input[ ( len -1 ) /2 ] + input[ len /2 ] ) /2 ;
86
- }
87
- let fuel: u32 = input. iter ( )
88
- . map ( |& x|CrabSubmarine :: new ( x, med) )
89
- . collect :: < Vec < _ > > ( )
90
- . into_iter ( )
91
- . map ( |cs| cs. compute_distance ( ) )
92
- . sum ( ) ;
93
- println ! ( "Fuel: {}" , fuel) ;
87
+ // Run through the full range
88
+ let max = input[ input. len ( ) -1 ] ;
89
+ let fuel: u32 =( 0 ..=max) . into_iter ( )
90
+ . map ( |v|
91
+ {
92
+ input. iter ( )
93
+ . map ( |& x|CrabSubmarine :: new ( x, v) )
94
+ . collect :: < Vec < _ > > ( )
95
+ . into_iter ( )
96
+ . map ( |cs| cs. compute_distance2 ( ) )
97
+ . sum ( )
98
+ } )
99
+ . min ( )
100
+ . unwrap ( ) ;
94
101
fuel. to_string ( )
95
102
}
96
103
}