mirror of
https://gitlab.com/MisterBiggs/aoc-2023-rust.git
synced 2025-06-16 06:56:50 +00:00
day4 complete
This commit is contained in:
parent
64b51388ab
commit
b9c2973c07
1000
inputs/day4.txt
Normal file
1000
inputs/day4.txt
Normal file
File diff suppressed because it is too large
Load Diff
84
src/day4.rs
Normal file
84
src/day4.rs
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
use std::collections::HashSet;
|
||||||
|
use std::fs;
|
||||||
|
|
||||||
|
pub fn run() {
|
||||||
|
println!("Day 4:");
|
||||||
|
let input = fs::read_to_string("./inputs/day4.txt").expect("Could not read file");
|
||||||
|
|
||||||
|
println!("\tPart 1: {}", part1(&input));
|
||||||
|
println!("\tPart 2: {}", part2(&input));
|
||||||
|
}
|
||||||
|
|
||||||
|
struct SectionAssignment {
|
||||||
|
left: HashSet<usize>,
|
||||||
|
right: HashSet<usize>,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize(line: &str) -> SectionAssignment {
|
||||||
|
let (left, right) = line.split_once(',').unwrap();
|
||||||
|
let left = left
|
||||||
|
.split_once('-')
|
||||||
|
.map(|(l, r)| l.parse().unwrap()..=r.parse().unwrap())
|
||||||
|
.unwrap()
|
||||||
|
.collect();
|
||||||
|
let right = right
|
||||||
|
.split_once('-')
|
||||||
|
.map(|(l, r)| l.parse().unwrap()..=r.parse().unwrap())
|
||||||
|
.unwrap()
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
SectionAssignment { left, right }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part1(input: &str) -> usize {
|
||||||
|
let assignments = input.split_whitespace().map(deserialize);
|
||||||
|
let mut sum = 0;
|
||||||
|
for assignment in assignments {
|
||||||
|
if assignment.left.is_subset(&assignment.right)
|
||||||
|
|| assignment.right.is_subset(&assignment.left)
|
||||||
|
{
|
||||||
|
sum += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sum
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part2(input: &str) -> usize {
|
||||||
|
let assignments = input.split_whitespace().map(deserialize);
|
||||||
|
let mut sum = 0;
|
||||||
|
for assignment in assignments {
|
||||||
|
if assignment.left.intersection(&assignment.right).count() >= 1 {
|
||||||
|
sum += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sum
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_1() {
|
||||||
|
let 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";
|
||||||
|
|
||||||
|
assert_eq!(part1(input), 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_2() {
|
||||||
|
let 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";
|
||||||
|
|
||||||
|
assert_eq!(part2(input), 4);
|
||||||
|
}
|
||||||
|
}
|
@ -1,9 +1,11 @@
|
|||||||
mod day1;
|
mod day1;
|
||||||
mod day2;
|
mod day2;
|
||||||
mod day3;
|
mod day3;
|
||||||
|
mod day4;
|
||||||
fn main() {
|
fn main() {
|
||||||
println!("Running Advent of Code 2022");
|
println!("Running Advent of Code 2022");
|
||||||
day1::run();
|
day1::run();
|
||||||
day2::run();
|
day2::run();
|
||||||
day3::run();
|
day3::run();
|
||||||
|
day4::run();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user