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

47 lines
1.1 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-05 10:26:36 +01:00
TEST_INPUT == "2-4,6-8
2-3,4-5
5-7,7-9
2-8,3-7
6-6,4-6
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
}