Day 18 part 1
This commit is contained in:
99
src/tasks/day18.rs
Normal file
99
src/tasks/day18.rs
Normal file
@@ -0,0 +1,99 @@
|
||||
use std::collections::HashMap;
|
||||
|
||||
use itertools::Itertools;
|
||||
|
||||
use crate::utils;
|
||||
|
||||
pub fn task1() {
|
||||
let input = utils::read_file("input/day18.txt");
|
||||
let initial: HashMap<Pos, char> = input
|
||||
.lines()
|
||||
.enumerate()
|
||||
.flat_map(|(y, line)| {
|
||||
line.chars()
|
||||
.enumerate()
|
||||
.map(|(x, c)| (Pos(x as i32, y as i32), c))
|
||||
.collect_vec()
|
||||
})
|
||||
.collect();
|
||||
let fin = (0..10).fold(initial, |map, _| {
|
||||
printmap(&map);
|
||||
map.keys()
|
||||
.map(|p| {
|
||||
let old = map[p];
|
||||
let new = match old {
|
||||
'.' => {
|
||||
if neighbors(&map, *p)
|
||||
.into_iter()
|
||||
.filter(|c| *c == '|')
|
||||
.count()
|
||||
>= 3
|
||||
{
|
||||
'|'
|
||||
} else {
|
||||
'.'
|
||||
}
|
||||
}
|
||||
'|' => {
|
||||
if neighbors(&map, *p)
|
||||
.into_iter()
|
||||
.filter(|c| *c == '#')
|
||||
.count()
|
||||
>= 3
|
||||
{
|
||||
'#'
|
||||
} else {
|
||||
'|'
|
||||
}
|
||||
}
|
||||
'#' => {
|
||||
if neighbors(&map, *p).contains(&'#') && neighbors(&map, *p).contains(&'|')
|
||||
{
|
||||
'#'
|
||||
} else {
|
||||
'.'
|
||||
}
|
||||
}
|
||||
_ => panic!("unknown type"),
|
||||
};
|
||||
(*p, new)
|
||||
})
|
||||
.collect()
|
||||
});
|
||||
let trees = fin.values().filter(|c| **c == '|').count();
|
||||
let lumberyards = fin.values().filter(|c| **c == '#').count();
|
||||
println!("Part 1 - {trees} x {lumberyards} = {}", trees * lumberyards);
|
||||
}
|
||||
|
||||
fn printmap(map: &HashMap<Pos, char>) {
|
||||
println!();
|
||||
let (x_min, x_max) = map.keys().map(|p| p.0).minmax().into_option().unwrap();
|
||||
let (_y_min, y_max) = map.keys().map(|p| p.1).minmax().into_option().unwrap();
|
||||
|
||||
for y in 0..=y_max {
|
||||
for x in x_min..=x_max {
|
||||
let s = map[&Pos(x, y)];
|
||||
print!("{s}");
|
||||
}
|
||||
print!("\n");
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Hash, Eq, PartialEq, Clone, Copy)]
|
||||
struct Pos(i32, i32);
|
||||
|
||||
fn neighbors(map: &HashMap<Pos, char>, p: Pos) -> Vec<char> {
|
||||
[
|
||||
Pos(p.0 - 1, p.1 - 1),
|
||||
Pos(p.0 - 1, p.1),
|
||||
Pos(p.0 - 1, p.1 + 1),
|
||||
Pos(p.0, p.1 - 1),
|
||||
Pos(p.0, p.1 + 1),
|
||||
Pos(p.0 + 1, p.1 - 1),
|
||||
Pos(p.0 + 1, p.1),
|
||||
Pos(p.0 + 1, p.1 + 1),
|
||||
]
|
||||
.into_iter()
|
||||
.flat_map(|pos| map.get(&pos).map(|c| *c))
|
||||
.collect_vec()
|
||||
}
|
||||
@@ -14,6 +14,7 @@ pub mod day13;
|
||||
pub mod day14;
|
||||
pub mod day15;
|
||||
pub mod day17;
|
||||
pub mod day18;
|
||||
pub mod day20;
|
||||
pub mod day22;
|
||||
pub mod day23;
|
||||
|
||||
Reference in New Issue
Block a user