2022-12-05 10:02:52 +01:00
#![ feature(test) ]
extern crate test ;
2022-12-05 10:26:36 +01:00
use std ::ops ::RangeInclusive ;
2022-12-05 10:02:52 +01:00
use aoc2022 ::{ boilerplate , common ::* } ;
const DAY : usize = 4 ;
2022-12-05 10:26:36 +01:00
type Parsed = Vec < ( RangeInclusive < usize > , RangeInclusive < usize > ) > ;
fn parse_range ( r : & str ) -> RangeInclusive < usize > {
let ( a , b ) = r . split_once ( '-' ) . unwrap ( ) ;
parse_num ( a ) ..= parse_num ( b )
}
2022-12-05 10:02:52 +01:00
fn parse_input ( raw : & str ) -> Parsed {
2022-12-05 10:26:36 +01:00
raw . lines ( )
. map ( | line | {
let ( a , b ) = line . split_once ( ',' ) . unwrap ( ) ;
( parse_range ( a ) , parse_range ( b ) )
} )
. collect ( )
2022-12-05 10:02:52 +01:00
}
fn part1 ( parsed : & Parsed ) -> usize {
2022-12-05 10:26:36 +01:00
parsed . iter ( ) . filter ( | ( a , b ) | ( a . start ( ) < = b . start ( ) & & a . end ( ) > = b . end ( ) ) | | ( b . start ( ) < = a . start ( ) & & b . end ( ) > = a . end ( ) ) ) . count ( )
2022-12-05 10:02:52 +01:00
}
fn part2 ( parsed : & Parsed ) -> usize {
2022-12-05 10:26:36 +01:00
parsed . iter ( ) . filter ( | ( a , b ) | a . contains ( b . start ( ) ) | | a . contains ( b . end ( ) ) | | b . contains ( a . start ( ) ) | | b . contains ( a . end ( ) ) ) . count ( )
2022-12-05 10:02:52 +01:00
}
boilerplate! {
2022-12-09 12:50:12 +01:00
TEST_INPUT = = " \
2 - 4 , 6 - 8 \ n \
2 - 3 , 4 - 5 \ n \
5 - 7 , 7 - 9 \ n \
2 - 8 , 3 - 7 \ n \
6 - 6 , 4 - 6 \ n \
2 - 6 , 4 - 8 \
" ,
2022-12-05 10:02:52 +01:00
tests : {
2022-12-05 10:26:36 +01:00
part1 : { TEST_INPUT = > 2 } ,
part2 : { TEST_INPUT = > 4 } ,
2022-12-05 10:02:52 +01:00
} ,
2022-12-05 10:26:36 +01:00
bench1 = = 494 ,
bench2 = = 833 ,
bench_parse : Vec ::len = > 1000 ,
2022-12-05 10:02:52 +01:00
}