generated from janezicmatej/aoc-template
solution: day 3
This commit is contained in:
parent
00000080fc
commit
000000906f
|
@ -0,0 +1,10 @@
|
||||||
|
467..114..
|
||||||
|
...*......
|
||||||
|
..35..633.
|
||||||
|
......#...
|
||||||
|
617*......
|
||||||
|
.....+.58.
|
||||||
|
..592.....
|
||||||
|
......755.
|
||||||
|
...$.*....
|
||||||
|
.664.598..
|
|
@ -0,0 +1,104 @@
|
||||||
|
struct MappedPart {
|
||||||
|
number: u32,
|
||||||
|
line: usize,
|
||||||
|
start: usize,
|
||||||
|
end: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MappedPart {
|
||||||
|
fn is_adjacent(&self, line: usize, column: usize) -> bool {
|
||||||
|
self.line.abs_diff(line) <= 1
|
||||||
|
&& (self.start.abs_diff(column) <= 1 || self.end.abs_diff(column) <= 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn build_map(input: &str) -> Vec<MappedPart> {
|
||||||
|
let mut numbers = Vec::new();
|
||||||
|
for (idl, line) in input.lines().enumerate() {
|
||||||
|
let mut index = 0;
|
||||||
|
for n in line.split(|c: char| !c.is_ascii_digit()) {
|
||||||
|
if n.is_empty() {
|
||||||
|
index += 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let num: u32 = n.parse().unwrap();
|
||||||
|
let num_len = n.len();
|
||||||
|
|
||||||
|
numbers.push(MappedPart {
|
||||||
|
number: num,
|
||||||
|
line: idl,
|
||||||
|
start: index,
|
||||||
|
end: index + num_len - 1,
|
||||||
|
});
|
||||||
|
|
||||||
|
index += num_len + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
numbers
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn part_one(input: &str) -> Option<u32> {
|
||||||
|
let numbers = build_map(input);
|
||||||
|
|
||||||
|
let mut part_numbers = 0;
|
||||||
|
|
||||||
|
for (idl, line) in input.lines().enumerate() {
|
||||||
|
for (idc, _) in line
|
||||||
|
.chars()
|
||||||
|
.enumerate()
|
||||||
|
.filter(|(_, c)| !(*c == '.' || c.is_ascii_digit()))
|
||||||
|
{
|
||||||
|
part_numbers += numbers
|
||||||
|
.iter()
|
||||||
|
.filter(|mp| mp.is_adjacent(idl, idc))
|
||||||
|
.map(|mp| mp.number)
|
||||||
|
.sum::<u32>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Some(part_numbers)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn part_two(input: &str) -> Option<u32> {
|
||||||
|
let numbers = build_map(input);
|
||||||
|
|
||||||
|
let mut gear_ratios = 0;
|
||||||
|
|
||||||
|
for (idl, line) in input.lines().enumerate() {
|
||||||
|
for (idc, _) in line.chars().enumerate().filter(|(_, c)| *c == '*') {
|
||||||
|
let touching: Vec<_> = numbers
|
||||||
|
.iter()
|
||||||
|
.filter(|mp| mp.is_adjacent(idl, idc))
|
||||||
|
.map(|mp| mp.number)
|
||||||
|
.collect();
|
||||||
|
if touching.len() == 2 {
|
||||||
|
gear_ratios += touching.iter().product::<u32>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Some(gear_ratios)
|
||||||
|
}
|
||||||
|
|
||||||
|
aoc::solution!(3);
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
#[test]
|
||||||
|
fn test_part_one() {
|
||||||
|
assert_eq!(
|
||||||
|
part_one(&aoc::template::read_file("examples", 3)),
|
||||||
|
Some(4361)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn test_part_two() {
|
||||||
|
assert_eq!(
|
||||||
|
part_two(&aoc::template::read_file("examples", 3)),
|
||||||
|
Some(467835)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue