solve year 2023 day 04

This commit is contained in:
2023-12-04 06:53:29 +01:00
parent a53a8412dc
commit 180faf92bb
5 changed files with 256 additions and 1 deletions

View File

@@ -23,4 +23,5 @@ pub mod year2023 {
pub mod day01;
pub mod day02;
pub mod day03;
pub mod day04;
}

View File

@@ -98,5 +98,6 @@ fn year2023() -> Vec<Solution> {
solution!(year2023, day01),
solution!(year2023, day02),
solution!(year2023, day03),
solution!(year2023, day04),
]
}

View File

@@ -11,7 +11,7 @@ fn parse_nums(input: &str) -> BTreeMap<Dim<[i64; 2]>, u32> {
if c.is_ascii_digit() {
let mut num = (c as u8 - b'0') as u32;
let mut end = x;
while let Some((idx, c)) = line.next() {
for (idx, c) in line.by_ref() {
if c.is_ascii_digit() {
num = num * 10 + (c as u8 - b'0') as u32;
end = idx;

48
src/year2023/day04.rs Normal file
View File

@@ -0,0 +1,48 @@
use crate::util::parse::ParseExt;
pub fn part1(input: &str) -> impl std::fmt::Display {
input
.lines()
.map(|line| {
let (_, rest) = line.split_once(':').unwrap();
let (winning, numbers) = rest.split_once('|').unwrap();
let winning = winning.u32s().collect::<Vec<_>>();
let numbers = numbers.u32s().filter(|n| winning.contains(n)).count() as u32;
(numbers > 0).then(|| 2u32.pow(numbers - 1)).unwrap_or(0)
})
.sum::<u32>()
}
pub fn part2(input: &str) -> impl std::fmt::Display {
let lines = input.lines().collect::<Vec<_>>();
let len = lines.len();
let mut mults = vec![1; len];
lines
.iter()
.enumerate()
.map(|(i, line)| {
let (_, rest) = line.split_once(':').unwrap();
let (winning, numbers) = rest.split_once('|').unwrap();
let winning = winning.u32s().collect::<Vec<_>>();
let numbers = numbers.u32s().filter(|n| winning.contains(n)).count();
let mul = mults[i];
mults
.iter_mut()
.take((i + numbers + 1).min(len))
.skip(i + 1)
.for_each(|c| *c += mul);
mul
})
.sum::<u32>()
}
#[test]
fn test_part1() {
assert_eq!("", part1("").to_string())
}
#[test]
fn test_part2() {
assert_eq!("", part2("").to_string())
}