@@ -5,22 +5,37 @@ namespace AdventOfCode.Y2022.Day04;
5
5
6
6
[ ProblemName ( "Camp Cleanup" ) ]
7
7
class Solution : Solver {
8
- public object PartOne ( string input ) => DuplicateWorkCount ( input , Contains ) ;
9
- public object PartTwo ( string input ) => DuplicateWorkCount ( input , Overlaps ) ;
8
+ public object PartOne ( string input ) => DuplicatedWorkCount ( input , Contains ) ;
9
+ public object PartTwo ( string input ) => DuplicatedWorkCount ( input , Overlaps ) ;
10
10
11
11
record struct Range ( int from , int to ) ;
12
+
13
+ // True if r1 contains r2 [ { } ]
12
14
bool Contains ( Range r1 , Range r2 ) => r1 . from <= r2 . from && r2 . to <= r1 . to ;
15
+
16
+ // True if r1 overlaps r2 { [ } ], the other direction is not checked.
13
17
bool Overlaps ( Range r1 , Range r2 ) => r1 . to >= r2 . from && r1 . from <= r2 . to ;
14
18
15
- private int DuplicateWorkCount ( string input , Func < Range , Range , bool > rangeCheck ) {
19
+ // DuplicatedWorkCount goes over the lines in the input, converts them to
20
+ // ranges A and B, and counts how many times rangeCheck(A,B) or
21
+ // rangeCheck(B, A) is true. The check is applied in both ways so that the
22
+ // Contains and Overlaps functions don't have to check each directions.
23
+ private int DuplicatedWorkCount (
24
+ string input ,
25
+ Func < Range , Range , bool > rangeCheck
26
+ ) {
27
+ // '36-41,35-40' becomes [Range(36, 41), Range(35, 40)]
16
28
var parseRanges = ( string line ) =>
17
29
from range in line . Split ( ',' )
18
30
let fromTo = range . Split ( '-' ) . Select ( int . Parse )
19
31
select new Range ( fromTo . First ( ) , fromTo . Last ( ) ) ;
20
32
21
- return input . Split ( "\n " ) . Select ( parseRanges ) . Count ( ranges =>
22
- rangeCheck ( ranges . First ( ) , ranges . Last ( ) ) ||
23
- rangeCheck ( ranges . Last ( ) , ranges . First ( ) )
24
- ) ;
33
+ return input
34
+ . Split ( "\n " )
35
+ . Select ( parseRanges )
36
+ . Count ( ranges =>
37
+ rangeCheck ( ranges . First ( ) , ranges . Last ( ) ) ||
38
+ rangeCheck ( ranges . Last ( ) , ranges . First ( ) )
39
+ ) ;
25
40
}
26
41
}
0 commit comments