Bad day 6 solution.
This commit is contained in:
parent
c97f1fb794
commit
7613b12ca0
4 changed files with 145 additions and 0 deletions
2
day06/.gitignore
vendored
Normal file
2
day06/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
target
|
||||||
|
debug
|
7
day06/Cargo.lock
generated
Normal file
7
day06/Cargo.lock
generated
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 4
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "day06"
|
||||||
|
version = "0.1.0"
|
6
day06/Cargo.toml
Normal file
6
day06/Cargo.toml
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
[package]
|
||||||
|
name = "day06"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
130
day06/src/main.rs
Normal file
130
day06/src/main.rs
Normal file
|
@ -0,0 +1,130 @@
|
||||||
|
use std::fs;
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy)]
|
||||||
|
enum Dir {
|
||||||
|
Up,
|
||||||
|
Down,
|
||||||
|
Left,
|
||||||
|
Right,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<Dir> for i32 {
|
||||||
|
fn from(value: Dir) -> Self {
|
||||||
|
match value {
|
||||||
|
Dir::Up => 1,
|
||||||
|
Dir::Down => 2,
|
||||||
|
Dir::Left => 3,
|
||||||
|
Dir::Right => 4,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Dir {
|
||||||
|
fn move_point(&self, point: (usize, usize), max: (usize, usize)) -> Option<(usize, usize)> {
|
||||||
|
match self {
|
||||||
|
Dir::Up if point.1 > 0 => Some((point.0, point.1 - 1)),
|
||||||
|
Dir::Down if point.1 < max.1 => Some((point.0, point.1 + 1)),
|
||||||
|
Dir::Left if point.0 > 0 => Some((point.0 - 1, point.1)),
|
||||||
|
Dir::Right if point.0 < max.0 => Some((point.0 + 1, point.1)),
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn rotate(&self) -> Dir {
|
||||||
|
match self {
|
||||||
|
Dir::Up => Dir::Right,
|
||||||
|
Dir::Down => Dir::Left,
|
||||||
|
Dir::Left => Dir::Up,
|
||||||
|
Dir::Right => Dir::Down,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let input = fs::read_to_string("input.txt").unwrap();
|
||||||
|
|
||||||
|
let mut pos = (0, 0);
|
||||||
|
let mut dir = Dir::Up;
|
||||||
|
let mut no_edit_grid = input
|
||||||
|
.lines()
|
||||||
|
.filter(|&l| !l.is_empty())
|
||||||
|
.enumerate()
|
||||||
|
.map(|(y, l)| {
|
||||||
|
l.chars()
|
||||||
|
.enumerate()
|
||||||
|
.map(|(x, c)| match c {
|
||||||
|
'#' => -1,
|
||||||
|
'.' => 0,
|
||||||
|
'^' => {
|
||||||
|
pos = (x, y);
|
||||||
|
0
|
||||||
|
}
|
||||||
|
_ => panic!("invalid char"),
|
||||||
|
})
|
||||||
|
.collect::<Vec<i32>>()
|
||||||
|
})
|
||||||
|
.collect::<Vec<Vec<i32>>>();
|
||||||
|
let original_grid = no_edit_grid.clone();
|
||||||
|
let oirignal_pos = pos;
|
||||||
|
let original_dir = dir;
|
||||||
|
|
||||||
|
loop {
|
||||||
|
no_edit_grid[pos.1][pos.0] = dir.into();
|
||||||
|
let next_pos =
|
||||||
|
match dir.move_point(pos, (no_edit_grid[0].len() - 1, no_edit_grid.len() - 1)) {
|
||||||
|
Some(p) => p,
|
||||||
|
None => break,
|
||||||
|
};
|
||||||
|
|
||||||
|
match no_edit_grid[next_pos.1][next_pos.0] {
|
||||||
|
-1 => dir = dir.rotate(),
|
||||||
|
_ => pos = next_pos,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
println!(
|
||||||
|
"Part 1: {}",
|
||||||
|
no_edit_grid
|
||||||
|
.iter()
|
||||||
|
.map(|l| l.iter().filter(|&x| *x > 0).count())
|
||||||
|
.sum::<usize>()
|
||||||
|
);
|
||||||
|
|
||||||
|
let mut loops = -1;
|
||||||
|
for (x, y) in no_edit_grid
|
||||||
|
.iter()
|
||||||
|
.map(|l| {
|
||||||
|
l.iter().enumerate().filter_map(|(x, c)| match *c > 0 {
|
||||||
|
true => Some(x),
|
||||||
|
false => None,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.enumerate()
|
||||||
|
.flat_map(|(y, l)| l.map(move |x| (x, y)))
|
||||||
|
{
|
||||||
|
let mut edited_grid = original_grid.clone();
|
||||||
|
let mut pos = oirignal_pos;
|
||||||
|
let mut dir = original_dir;
|
||||||
|
edited_grid[y][x] = -1;
|
||||||
|
|
||||||
|
loop {
|
||||||
|
if (edited_grid[pos.1][pos.0] & (2 << i32::from(dir))) != 0 {
|
||||||
|
loops += 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
edited_grid[pos.1][pos.0] |= 2 << i32::from(dir);
|
||||||
|
let next_pos =
|
||||||
|
match dir.move_point(pos, (no_edit_grid[0].len() - 1, no_edit_grid.len() - 1)) {
|
||||||
|
Some(p) => p,
|
||||||
|
None => break,
|
||||||
|
};
|
||||||
|
|
||||||
|
match edited_grid[next_pos.1][next_pos.0] {
|
||||||
|
-1 => dir = dir.rotate(),
|
||||||
|
_ => pos = next_pos,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("Part 2: {}", loops);
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue