diff --git a/2022-aoc/src/d4.rs b/2022-aoc/src/d4.rs index 2b4a1f4..3233cc5 100644 --- a/2022-aoc/src/d4.rs +++ b/2022-aoc/src/d4.rs @@ -1,59 +1,24 @@ -use std::ops::RangeInclusive; - use aoc_runner_derive::{aoc as aoc_run, aoc_generator}; -type Contents = (RangeInclusive, RangeInclusive); +type Assignments = ((u32, u32), (u32, u32)); #[aoc_generator(day4)] -fn parse_input(input: &str) -> Vec { - let mut out = Vec::with_capacity(input.len()); - for line in input.lines() { - let mut split = line.split(','); - let a = split.next().unwrap(); - let b = split.next().unwrap(); - let mut asplit = a.split('-'); - let mut bsplit = b.split('-'); - let alo = asplit.next().unwrap().parse().unwrap(); - let ahi = asplit.next().unwrap().parse().unwrap(); - let blo = bsplit.next().unwrap().parse().unwrap(); - let bhi = bsplit.next().unwrap().parse().unwrap(); - out.push(((alo..=ahi), (blo..=bhi))); - } - - out -} - -// with tuples instead of ranges -type AltContents = ((u32, u32), (u32, u32)); - -#[aoc_generator(day4, part1, alt1)] -fn parse_input1a(input: &str) -> Vec { +fn parse_input(input: &str) -> Vec { let mut out = Vec::with_capacity(input.len()); for line in input.lines() { let (a, b) = line.split_once(',').unwrap(); - let (alo, ahi) = a.split_once('-').unwrap(); - let (alo, ahi) = (alo.parse().unwrap(), ahi.parse().unwrap()); - let (blo, bhi) = b.split_once('-').unwrap(); - let (blo, bhi) = (blo.parse().unwrap(), bhi.parse().unwrap()); - out.push(((alo, ahi), (blo, bhi))); + let (a, b) = (get_range(a), get_range(b)); + out.push((a, b)); } out } -// can't define a blanket alt generator? -#[aoc_generator(day4, part2, alt1)] -fn p2a(input: &str) -> Vec { - parse_input1a(input) -} - #[aoc_run(day4, part1)] -fn part1(scheds: &[Contents]) -> u32 { +fn part1(scheds: &[Assignments]) -> u32 { let mut out = 0; for (a, b) in scheds { - if (a.contains(b.start()) && a.contains(b.end())) - || (b.contains(a.start()) && b.contains(a.end())) - { + if contains(a, b) || contains(b, a) { out += 1; } } @@ -61,36 +26,25 @@ fn part1(scheds: &[Contents]) -> u32 { } #[aoc_run(day4, part2)] -fn part2(scheds: &[Contents]) -> u32 { +fn part2(scheds: &[Assignments]) -> u32 { let mut out = 0; for (a, b) in scheds { - if (a.contains(b.start()) || a.contains(b.end())) - || (b.contains(a.start()) || b.contains(a.end())) - { + if overlaps(a, b) || overlaps(b, a) { out += 1; } } out } -#[aoc_run(day4, part1, alt1)] -fn part1a(scheds: &[AltContents]) -> u32 { - let mut out = 0; - for (a, b) in scheds { - if (a.0 <= b.0 && b.1 <= a.1) || (b.0 <= a.0 && a.1 <= b.1) { - out += 1; - } - } - out +fn get_range(r: &str) -> (u32, u32) { + let (lo, hi) = r.split_once('-').unwrap(); + (lo.parse().unwrap(), hi.parse().unwrap()) } -#[aoc_run(day4, part2, alt1)] -fn part2a(scheds: &[AltContents]) -> u32 { - let mut out = 0; - for (a, b) in scheds { - if (a.0 <= b.0 && b.0 <= a.1) || (b.0 <= a.0 && a.0 <= b.1) { - out += 1; - } - } - out +fn contains(a: &(u32, u32), b: &(u32, u32)) -> bool { + a.0 <= b.0 && b.1 <= a.1 +} + +fn overlaps(a: &(u32, u32), b: &(u32, u32)) -> bool { + a.0 <= b.0 && b.0 <= a.1 }