File tree Expand file tree Collapse file tree 3 files changed +91
-0
lines changed Expand file tree Collapse file tree 3 files changed +91
-0
lines changed Original file line number Diff line number Diff line change
1
+ 7 6 4 2 1
2
+ 1 2 7 8 9
3
+ 9 7 6 2 1
4
+ 1 3 2 4 5
5
+ 8 6 4 4 1
6
+ 1 3 6 7 9
Original file line number Diff line number Diff line change
1
+ use advent_of_code:: template:: parse:: splitn;
2
+
3
+ advent_of_code:: solution!( 2 ) ;
4
+
5
+ pub fn part_one ( input : & str ) -> Option < u32 > {
6
+ Some (
7
+ splitn :: < u32 > ( input)
8
+ . map ( |report| {
9
+ if report. len ( ) < 2 {
10
+ 1
11
+ } else {
12
+ let increase = report[ 0 ] < report[ 1 ] ;
13
+ if report
14
+ . iter ( )
15
+ . zip ( report[ 1 ..] . iter ( ) )
16
+ . all ( |( & a, & b) | ( 1 ..=3 ) . contains ( & a. abs_diff ( b) ) && ( a < b) == increase)
17
+ {
18
+ 1
19
+ } else {
20
+ 0
21
+ }
22
+ }
23
+ } )
24
+ . sum ( ) ,
25
+ )
26
+ }
27
+
28
+ pub fn part_two ( input : & str ) -> Option < u32 > {
29
+ Some (
30
+ splitn :: < u32 > ( input)
31
+ . map ( |report| {
32
+ if report. len ( ) < 3 {
33
+ 1
34
+ } else {
35
+ let mut sub = vec ! [ ] ;
36
+ if ( 0 ..report. len ( ) ) . any ( |bad_idx| {
37
+ sub. clear ( ) ;
38
+ sub. extend_from_slice ( & report[ ..bad_idx] ) ;
39
+ sub. extend_from_slice ( & report[ ( bad_idx + 1 ) ..] ) ;
40
+ let increase = sub[ 0 ] < sub[ 1 ] ;
41
+ sub. iter ( )
42
+ . zip ( sub[ 1 ..] . iter ( ) )
43
+ . all ( |( & a, & b) | ( 1 ..=3 ) . contains ( & a. abs_diff ( b) ) && ( a < b) == increase)
44
+ } ) {
45
+ 1
46
+ } else {
47
+ 0
48
+ }
49
+ }
50
+ } )
51
+ . sum ( ) ,
52
+ )
53
+ }
54
+
55
+ #[ cfg( test) ]
56
+ mod tests {
57
+ use super :: * ;
58
+
59
+ #[ test]
60
+ fn test_part_one ( ) {
61
+ let result = part_one ( & advent_of_code:: template:: read_file ( "examples" , DAY ) ) ;
62
+ assert_eq ! ( result, Some ( 2 ) ) ;
63
+ }
64
+
65
+ #[ test]
66
+ fn test_part_two ( ) {
67
+ let result = part_two ( & advent_of_code:: template:: read_file ( "examples" , DAY ) ) ;
68
+ assert_eq ! ( result, Some ( 4 ) ) ;
69
+ }
70
+ }
Original file line number Diff line number Diff line change @@ -148,6 +148,21 @@ pub fn split5<
148
148
} )
149
149
}
150
150
151
+ /// Parse some number items from each line, separated by ASCII whitespace
152
+ pub fn splitn < ' a , T : MyFromStr < ' a > > ( input : & ' a str ) -> impl ' a + Iterator < Item = Vec < T > > {
153
+ lines ( input) . filter_map ( |line| {
154
+ let mut parts = line. split_ascii_whitespace ( ) ;
155
+ let Some ( part0) = parts. next ( ) else {
156
+ // skip blank lines
157
+ cold ( ) ;
158
+ return None ;
159
+ } ;
160
+ let mut vec = vec ! [ part0. my_parse( ) . unwrap( ) ] ;
161
+ vec. extend ( parts. map ( |part| part. my_parse ( ) . unwrap ( ) ) ) ;
162
+ Some ( vec)
163
+ } )
164
+ }
165
+
151
166
#[ cfg( test) ]
152
167
mod tests {
153
168
use super :: * ;
You can’t perform that action at this time.
0 commit comments