advent-of-code/2022/src/bin/day04.rs

49 lines
1.2 KiB
Rust

#![feature(test)]
extern crate test;
use std::ops::RangeInclusive;
use aoc2022::{boilerplate, common::*};
const DAY: usize = 4;
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)
}
fn parse_input(raw: &str) -> Parsed {
raw.lines()
.map(|line| {
let (a, b) = line.split_once(',').unwrap();
(parse_range(a), parse_range(b))
})
.collect()
}
fn part1(parsed: &Parsed) -> usize {
parsed.iter().filter(|(a, b)| (a.start() <= b.start() && a.end() >= b.end()) || (b.start() <= a.start() && b.end() >= a.end())).count()
}
fn part2(parsed: &Parsed) -> usize {
parsed.iter().filter(|(a, b)| a.contains(b.start()) || a.contains(b.end()) || b.contains(a.start()) || b.contains(a.end())).count()
}
boilerplate! {
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\
",
tests: {
part1: { TEST_INPUT => 2 },
part2: { TEST_INPUT => 4 },
},
bench1 == 494,
bench2 == 833,
bench_parse: Vec::len => 1000,
}