solve year 2023 day 04
This commit is contained in:
@@ -23,4 +23,5 @@ pub mod year2023 {
|
||||
pub mod day01;
|
||||
pub mod day02;
|
||||
pub mod day03;
|
||||
pub mod day04;
|
||||
}
|
||||
|
@@ -98,5 +98,6 @@ fn year2023() -> Vec<Solution> {
|
||||
solution!(year2023, day01),
|
||||
solution!(year2023, day02),
|
||||
solution!(year2023, day03),
|
||||
solution!(year2023, day04),
|
||||
]
|
||||
}
|
||||
|
@@ -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
48
src/year2023/day04.rs
Normal 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())
|
||||
}
|
Reference in New Issue
Block a user