13
13
//! score for each board. Sort each result by turn and the answers for part 1 and part1 are the
14
14
//! first and last values respectively.
15
15
use crate :: util:: parse:: * ;
16
+ use std:: array:: from_fn;
16
17
17
18
pub struct Input {
18
19
turn : usize ,
@@ -23,23 +24,25 @@ pub fn parse(input: &str) -> Vec<Input> {
23
24
let mut to_turn = [ 0 ; 100 ] ;
24
25
let mut from_turn = [ 0 ; 100 ] ;
25
26
26
- let chunks: Vec < Vec < usize > > =
27
- input. split ( "\n \n " ) . map ( |s| s. iter_unsigned ( ) . collect ( ) ) . collect ( ) ;
27
+ let mut chunks = input. split ( "\n \n " ) ;
28
28
29
- for ( i, & n) in chunks[ 0 ] . iter ( ) . enumerate ( ) {
29
+ for ( i, n) in chunks. next ( ) . unwrap ( ) . iter_unsigned ( ) . enumerate ( ) {
30
30
to_turn[ n] = i;
31
31
from_turn[ i] = n;
32
32
}
33
33
34
- let score = |board : & Vec < usize > | {
35
- let turns: Vec < _ > = board. iter ( ) . map ( |& n| to_turn[ n] ) . collect ( ) ;
34
+ let score = |chunk : & str | {
35
+ let mut iter = chunk. iter_unsigned ( ) ;
36
+ let board: [ usize ; 25 ] = from_fn ( |_| iter. next ( ) . unwrap ( ) ) ;
37
+ let turns: [ usize ; 25 ] = from_fn ( |i| to_turn[ board[ i] ] ) ;
38
+
36
39
let row_and_cols = [
37
40
turns[ 0 ..5 ] . iter ( ) . max ( ) . unwrap ( ) ,
38
41
turns[ 5 ..10 ] . iter ( ) . max ( ) . unwrap ( ) ,
39
42
turns[ 10 ..15 ] . iter ( ) . max ( ) . unwrap ( ) ,
40
43
turns[ 15 ..20 ] . iter ( ) . max ( ) . unwrap ( ) ,
41
44
turns[ 20 ..25 ] . iter ( ) . max ( ) . unwrap ( ) ,
42
- turns. iter ( ) . skip ( 0 ) . step_by ( 5 ) . max ( ) . unwrap ( ) ,
45
+ turns. iter ( ) . step_by ( 5 ) . max ( ) . unwrap ( ) ,
43
46
turns. iter ( ) . skip ( 1 ) . step_by ( 5 ) . max ( ) . unwrap ( ) ,
44
47
turns. iter ( ) . skip ( 2 ) . step_by ( 5 ) . max ( ) . unwrap ( ) ,
45
48
turns. iter ( ) . skip ( 3 ) . step_by ( 5 ) . max ( ) . unwrap ( ) ,
@@ -48,18 +51,19 @@ pub fn parse(input: &str) -> Vec<Input> {
48
51
let winning_turn = * * row_and_cols. iter ( ) . min ( ) . unwrap ( ) ;
49
52
let unmarked: usize = board. iter ( ) . filter ( |& & n| to_turn[ n] > winning_turn) . sum ( ) ;
50
53
let just_called = from_turn[ winning_turn] ;
54
+
51
55
Input { turn : winning_turn, score : unmarked * just_called }
52
56
} ;
53
57
54
- let mut result : Vec < _ > = chunks. iter ( ) . skip ( 1 ) . map ( score) . collect ( ) ;
55
- result . sort_unstable_by ( |a , b| a . turn . cmp ( & b . turn ) ) ;
56
- result
58
+ let mut scores : Vec < _ > = chunks. map ( score) . collect ( ) ;
59
+ scores . sort_unstable_by_key ( |s| s . turn ) ;
60
+ scores
57
61
}
58
62
59
63
pub fn part1 ( input : & [ Input ] ) -> usize {
60
- input[ 0 ] . score
64
+ input. first ( ) . unwrap ( ) . score
61
65
}
62
66
63
67
pub fn part2 ( input : & [ Input ] ) -> usize {
64
- input[ input . len ( ) - 1 ] . score
68
+ input. last ( ) . unwrap ( ) . score
65
69
}
0 commit comments