File tree Expand file tree Collapse file tree 1 file changed +46
-1
lines changed
Expand file tree Collapse file tree 1 file changed +46
-1
lines changed Original file line number Diff line number Diff line change @@ -37,12 +37,57 @@ pub fn part_1(data: crate::DataIn) -> crate::AoCResult<String> {
3737 Ok ( ret. to_string ( ) )
3838}
3939
40+ pub fn part_2 ( data : crate :: DataIn ) -> crate :: AoCResult < String > {
41+ let mut ranges: Vec < _ > = data
42+ . take_while ( |line| !line. is_empty ( ) )
43+ . map ( |line| -> AoCResult < RangeInclusive < Num > > {
44+ let ( start, end) = line. split_once ( '-' ) . ok_or_else ( || {
45+ AoCError :: new ( format ! ( "Input range {line} doesn't have a - in it?" ) )
46+ } ) ?;
47+ Ok ( start. parse ( ) ?..=end. parse ( ) ?)
48+ } )
49+ . try_collect ( ) ?;
50+ ranges. sort_by_key ( |range| * range. start ( ) ) ;
51+
52+ // I'm sure there's a smarter way to do this.
53+ let mut ret = 0 ;
54+ let mut last: Option < RangeInclusive < Num > > = None ;
55+
56+ for range in ranges. into_iter ( ) {
57+ log:: debug!( "Looking at {range:?}. Last is {last:?}, count is {ret}" ) ;
58+ match last. as_mut ( ) {
59+ Some ( last) => {
60+ if last. end ( ) >= range. start ( ) {
61+ // bah
62+ if last. end ( ) >= range. end ( ) {
63+ continue ;
64+ }
65+ ret += range. end ( ) - last. end ( )
66+ } else {
67+ ret += range. end ( ) - range. start ( ) + 1 ;
68+ }
69+ * last = range;
70+ }
71+ None => {
72+ ret += range. end ( ) - range. start ( ) + 1 ;
73+ last = Some ( range) ;
74+ }
75+ }
76+ log:: debug!( "> count is now {ret}" ) ;
77+ }
78+
79+ Ok ( ret. to_string ( ) )
80+ }
81+
4082inventory:: submit!( crate :: AoCDay {
4183 year: "2025" ,
4284 day: "5" ,
4385 part_1: crate :: AoCPart {
4486 main: part_1,
4587 example: part_1
4688 } ,
47- part_2: None
89+ part_2: Some ( crate :: AoCPart {
90+ main: part_2,
91+ example: part_2
92+ } )
4893} ) ;
You can’t perform that action at this time.
0 commit comments