Compare commits

...

2 commits

Author SHA1 Message Date
182cea15a7
Add day 04 part 1 2025-12-04 13:16:32 +01:00
879272687b
Add day 3 2025-12-04 12:24:05 +01:00
4 changed files with 123 additions and 0 deletions

View file

@ -0,0 +1,53 @@
use crate::days::Solution;
pub struct Day03;
impl Solution for Day03 {
type Input = Vec<Vec<u32>>;
fn parse(&self, data: &str) -> Self::Input {
data.split("\n")
.filter(|s| !s.is_empty())
.map(|s| s.chars().map(|c| c.to_digit(10).unwrap_or(0)).collect())
.collect()
}
fn part1(&self, input: &Self::Input) -> usize {
input
.iter()
.map(|l| {
let (i1, m1) = max(&l[..l.len() - 1]);
let (_, m2) = max(&l[i1 + 1..]);
10 * m1 + m2
})
.sum::<u32>() as usize
}
fn part2(&self, input: &Self::Input) -> usize {
println!("Part2");
input
.iter()
.map(|l| {
(0..12)
.rfold((0, 0), |(start_index, joltage), n| {
let (i, m) = max(&l[start_index..l.len() - n]);
(
start_index + i + 1,
usize::pow(10, n as u32) * m as usize + joltage,
)
})
.1
})
.sum()
}
}
fn max(l: &[u32]) -> (usize, u32) {
let x = l.iter().enumerate().fold(
(0, 0),
|(index_m, m), (i, &x)| if x > m { (i, x) } else { (index_m, m) },
);
println!("Max of {:?} is {:?}", l, x);
x
}

View file

@ -0,0 +1,66 @@
use crate::days::Solution;
use std::cmp::{max, min};
pub struct Day04;
impl Solution for Day04 {
type Input = Vec<Vec<bool>>;
fn parse(&self, data: &str) -> Self::Input {
data.split("\n")
.filter(|s| !s.is_empty())
.map(|s| s.chars().map(|c| c == '@').collect())
.collect()
}
fn part1(&self, input: &Self::Input) -> usize {
input
.iter()
.enumerate()
.map(|(x, l)| {
l.iter()
.enumerate()
.filter(move |(y, v)| {
**v && neighbors((x, *y), input.len())
.iter()
.filter(|(nx, ny)| input[*nx][*ny])
.count()
< 4
})
.count()
})
.sum()
}
fn part2(&self, input: &Self::Input) -> usize {
0
}
}
fn coord_in_range((x, y): (i32, i32), size: usize) -> (usize, usize) {
(
min(max(x, 0) as usize, size - 1),
min(max(y, 0) as usize, size - 1),
)
}
fn neighbors((x, y): (usize, usize), size: usize) -> Vec<(usize, usize)> {
(0..=2)
.map(|i| i as i32 - 1)
.flat_map(|dx| {
(0..=2)
.map(|i| i as i32 - 1)
.filter_map(|dy| {
if dx != 0 || dy != 0 {
Some(coord_in_range((x as i32 + dx, y as i32 + dy), size))
} else {
None
}
})
.filter(|n| *n != (x, y))
.collect::<Vec<(usize, usize)>>()
})
.collect::<std::collections::HashSet<(usize, usize)>>()
.into_iter()
.collect::<Vec<(usize, usize)>>()
}

View file

@ -1,5 +1,7 @@
pub mod day01;
pub mod day02;
pub mod day03;
pub mod day04;
pub trait Solution {
type Input;

View file

@ -35,6 +35,8 @@ fn main() {
match cli.day {
1 => run(cli.day, days::day01::Day01),
2 => run(cli.day, days::day02::Day02),
3 => run(cli.day, days::day03::Day03),
4 => run(cli.day, days::day04::Day04),
_ => {
eprintln!("Day {:02} is not implemented yet!", cli.day);
process::exit(1);