feat: day 4 (12:04.60)
This commit is contained in:
parent
e2a7024ca4
commit
2b66459ebf
3 changed files with 1084 additions and 0 deletions
1000
.aoc-cache/4.txt
Normal file
1000
.aoc-cache/4.txt
Normal file
File diff suppressed because it is too large
Load diff
78
src/bin/day_4.rs
Normal file
78
src/bin/day_4.rs
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
use std::ops::RangeInclusive;
|
||||||
|
|
||||||
|
use aoc_2022::prelude::*;
|
||||||
|
|
||||||
|
type Input = Vec<(RangeInclusive<usize>, RangeInclusive<usize>)>;
|
||||||
|
|
||||||
|
fn parse_range(s: &str) -> RangeInclusive<usize> {
|
||||||
|
let (lower, upper) = s.split_once("-").expect("range to have dash");
|
||||||
|
let (lower, upper) = (lower.parse::<usize>().expect("valid number"), upper.parse::<usize>().expect("valid number"));
|
||||||
|
lower..=upper
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse(s: &str) -> Result<Input> {
|
||||||
|
Ok(s.lines().map(|line| {
|
||||||
|
let (a, b) = line.split_once(",").expect("comma in line");
|
||||||
|
(parse_range(a), parse_range(b))
|
||||||
|
}).collect::<Vec<_>>())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[aoc(day = 4, parse = parse, test_cases = ["day_4.txt"])]
|
||||||
|
fn day_4(input: Input) -> Result<()> {
|
||||||
|
// Part 1
|
||||||
|
let mut fully_contained = 0;
|
||||||
|
for (a, b) in &input {
|
||||||
|
let mut overlaps = true;
|
||||||
|
for v in a.clone() {
|
||||||
|
if !b.contains(&v) {
|
||||||
|
overlaps = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if overlaps {
|
||||||
|
fully_contained += 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
overlaps = true;
|
||||||
|
for v in b.clone() {
|
||||||
|
if !a.contains(&v) {
|
||||||
|
overlaps = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if overlaps {
|
||||||
|
fully_contained += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("Part one: {fully_contained} pairs contain themselves!");
|
||||||
|
|
||||||
|
// Part 2
|
||||||
|
let mut overlapping = 0;
|
||||||
|
for (a, b) in &input {
|
||||||
|
let mut overlapped = false;
|
||||||
|
for v in a.clone() {
|
||||||
|
if b.contains(&v) {
|
||||||
|
overlapped = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if overlapped {
|
||||||
|
overlapping += 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for v in b.clone() {
|
||||||
|
if a.contains(&v) {
|
||||||
|
overlapped = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if overlapped {
|
||||||
|
overlapping += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("Part two: {overlapping} pairs overlap in any way");
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
6
test_cases/day_4.txt
Normal file
6
test_cases/day_4.txt
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
2-4,6-8
|
||||||
|
2-3,4-5
|
||||||
|
5-7,7-9
|
||||||
|
2-8,3-7
|
||||||
|
6-6,4-6
|
||||||
|
2-6,4-8
|
Loading…
Reference in a new issue