@@ -27,43 +27,49 @@ type Result = (u32, u32);
27
27
28
28
pub fn parse ( input : & str ) -> Result {
29
29
let tokens: Vec < _ > = input. split_ascii_whitespace ( ) . chunk :: < 5 > ( ) . collect ( ) ;
30
-
31
30
let mut indices = FastMap :: new ( ) ;
31
+
32
32
for [ start, _, end, ..] in & tokens {
33
- if !indices. contains_key ( start) {
34
- indices. insert ( start, indices. len ( ) ) ;
35
- }
36
- if !indices. contains_key ( end) {
37
- indices. insert ( end, indices. len ( ) ) ;
38
- }
33
+ let size = indices. len ( ) ;
34
+ indices. entry ( start) . or_insert ( size) ;
35
+
36
+ let size = indices. len ( ) ;
37
+ indices. entry ( end) . or_insert ( size) ;
39
38
}
40
39
41
40
let stride = indices. len ( ) ;
42
- let mut distances = vec ! [ 0_u32 ; stride * stride] ;
41
+ let mut distances = vec ! [ 0 ; stride * stride] ;
42
+
43
43
for [ start, _, end, _, distance] in & tokens {
44
44
let start = indices[ start] ;
45
45
let end = indices[ end] ;
46
46
let distance = distance. unsigned ( ) ;
47
+
47
48
distances[ stride * start + end] = distance;
48
49
distances[ stride * end + start] = distance;
49
50
}
50
51
51
52
let mut global_min = u32:: MAX ;
52
53
let mut global_max = u32:: MIN ;
53
- let mut middle: Vec < _ > = ( 1 ..stride) . collect ( ) ;
54
-
55
- middle. permutations ( |slice| {
56
- let first = distances[ slice[ 0 ] ] ;
57
- let last = distances[ slice[ stride - 2 ] ] ;
58
- let mut sum = first + last;
59
- let mut local_min = first. min ( last) ;
60
- let mut local_max = first. max ( last) ;
61
-
62
- for w in slice. windows ( 2 ) {
63
- let trip = distances[ stride * w[ 0 ] + w[ 1 ] ] ;
64
- sum += trip;
65
- local_min = local_min. min ( trip) ;
66
- local_max = local_max. max ( trip) ;
54
+ let mut indices: Vec < _ > = ( 1 ..stride) . collect ( ) ;
55
+
56
+ indices. permutations ( |slice| {
57
+ let mut sum = 0 ;
58
+ let mut local_min = u32:: MAX ;
59
+ let mut local_max = u32:: MIN ;
60
+
61
+ let mut trip = |from, to| {
62
+ let distance = distances[ stride * from + to] ;
63
+ sum += distance;
64
+ local_min = local_min. min ( distance) ;
65
+ local_max = local_max. max ( distance) ;
66
+ } ;
67
+
68
+ trip ( 0 , slice[ 0 ] ) ;
69
+ trip ( 0 , slice[ slice. len ( ) - 1 ] ) ;
70
+
71
+ for i in 1 ..slice. len ( ) {
72
+ trip ( slice[ i] , slice[ i - 1 ] ) ;
67
73
}
68
74
69
75
global_min = global_min. min ( sum - local_max) ;
0 commit comments