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

49 lines
1.2 KiB
Rust
Raw Normal View History

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
}