Added Day6
This commit is contained in:
parent
ee319bfd84
commit
e6000bafb6
130
resources/input6.txt
Normal file
130
resources/input6.txt
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
.#..#......................#........#........................................#.............#......#...............#...............
|
||||||
|
.......#...........#........................#..............#.....#......#..##............#.....#.....................##...........
|
||||||
|
.#.....#........#.##..#.............#...........#................#............#.#.........#.....................#......#..........
|
||||||
|
...........#...#.#.................................#.....................#............#.....#.#................#..#...............
|
||||||
|
..................................................................................#...............................................
|
||||||
|
..................#....................#.................#.........#..#.................#...........#...................#.........
|
||||||
|
.......#......#................#.......#............................#.................#.........................#...#........#....
|
||||||
|
................................#..............................................................#.........#.........#..............
|
||||||
|
.......................................................#............#......#........#.#...................#............#..........
|
||||||
|
.....#......#..............................................#..............................................#.......................
|
||||||
|
......#..........................................................................................#................#...............
|
||||||
|
............................#..................#............#..#.#..............#..........#......................................
|
||||||
|
......#..........................#...................#..........#....#.........................#.......................#....#..#..
|
||||||
|
..................................#..........#....................................................................#........#......
|
||||||
|
..#.................................#..................................................#......................#...................
|
||||||
|
.....#............#..................#......#...................................#.#........#.#......#........#....................
|
||||||
|
........#......................#.....#...#.##................................#......#.............................................
|
||||||
|
...........#.........#...............................................................................#............................
|
||||||
|
..................................#...##...............................#.............#.........................................##.
|
||||||
|
..........................#.#..#......................................#........#..............................#...................
|
||||||
|
......#...........###..#....#........................................................................................#............
|
||||||
|
..............#.....................................................................#......##.............#.......................
|
||||||
|
.................................#...................#.........#..............................................#...........#.......
|
||||||
|
....................#..#...................................................#................................#........#............
|
||||||
|
........................................#.#.#..................#....................#.....#.................#.....................
|
||||||
|
.........................#....#.....#.................##...............................................#.......#...#..............
|
||||||
|
..#.........................#....................#.........................#..............................#...................#...
|
||||||
|
..................##....#..#..#.#.................................................................#...............................
|
||||||
|
..............#........................................................#.............................#......#.....................
|
||||||
|
.................#...........#........................#......#..........##....................#.................................#.
|
||||||
|
..........................#.............................................#..#.................................#.........#...#......
|
||||||
|
..#..................##.....................................................#.....................#.......#.....#.................
|
||||||
|
....#.........................................#..................#.#.........................#.......................#............
|
||||||
|
...#.....#.#..............................................................#................#......................#...#........#..
|
||||||
|
.............................#..#......#.....................................................##...................................
|
||||||
|
...........#......................#....#.........#........................#......................................................#
|
||||||
|
............#.............................................#.................................#....#................................
|
||||||
|
..............................................................#.............#................#.........#.........................#
|
||||||
|
..........................................#....#........#......................#.....#.............#..............................
|
||||||
|
..#..#.............#...............................................#.....................................................#........
|
||||||
|
................................................................................#.............#...................................
|
||||||
|
...............................................#.......................#................#............#....................#.#.....
|
||||||
|
.......................#.............................#.#..................#...#....#.................................#...#.....#..
|
||||||
|
.......................#...........................#.........................................#.........#.........................#
|
||||||
|
...#.........#.....#..........................................#...................................................................
|
||||||
|
..........#..#...#...#........................#..........#..........................................#......#.........#............
|
||||||
|
...............#............................#.#...................##.....................................................#........
|
||||||
|
.........................................................#....................#........................#.........#....##....#...#.
|
||||||
|
......................................#.#................................................#........................#...............
|
||||||
|
..........#.............................................................#..#..#..............................#...#...#.#..........
|
||||||
|
.........#.....................................................................................#...........#..#......#..........#.
|
||||||
|
............................#....................#..............#...#.............................................................
|
||||||
|
...........................................................#........#......................#.................................#....
|
||||||
|
.........#..................#.........#.......#...............................#................#.............#...........#........
|
||||||
|
............................#.........#...........................................................................................
|
||||||
|
................................#...........#.......................................#..........#.#.....#..........................
|
||||||
|
..........................................#.................................................................................#.....
|
||||||
|
..............#...............................................#...................................................................
|
||||||
|
...#....#.....................#..........#..#......................#..............................................................
|
||||||
|
.......................#..........#.................................................#......#.............#........#....#..........
|
||||||
|
.........................................................................#.#......................................#...............
|
||||||
|
..........................................#.......................#...............................................#.........#...#.
|
||||||
|
............................#.......................................................#...#.........#..#...##........#..............
|
||||||
|
...........................................................................#..............#..........#.............#..............
|
||||||
|
#............#..#...#..#........#....................#...........#..#.........................................#..........#........
|
||||||
|
...........................................................................#......#..^.........#.........#........................
|
||||||
|
......#............................#.............................................................................................#
|
||||||
|
......................#.....#.......................................................#........................#..........#.........
|
||||||
|
................#....#.......#.............................#..............#....................#....#....................#........
|
||||||
|
......#...................................#..................................................................#....................
|
||||||
|
.....#..............#.#...........................................................#.................#.........#......#........#...
|
||||||
|
..#..#..#..#........#...........#...........#....##...........#.....................#.............................................
|
||||||
|
......................##..........................................................................................................
|
||||||
|
...........#............#.........................................................#.....#.....#....................#..............
|
||||||
|
#.............#..........#...............#..#.......................................#..............................#..............
|
||||||
|
#.......................................#........#....#.......................................................#..#.............#..
|
||||||
|
.......................#...#.....#..#...........................#...........#.........................#...#...#................#..
|
||||||
|
#...............................................................#........................................#.....................#..
|
||||||
|
..#.....................#............................##..........#..................##...#.....................................#..
|
||||||
|
.......#...................##..........................................#........#.................................................
|
||||||
|
.........................................................#............................................#...............##..........
|
||||||
|
.......................#......#..............................................................................................#....
|
||||||
|
...........#.......................................#.................................#..........#.............#..................#
|
||||||
|
....#.............#......#............................#........................#...................#......#.....#..........#......
|
||||||
|
.................................................................#................................#...............................
|
||||||
|
..........................................................#.......................#...#...........................................
|
||||||
|
.#............#...........................................#............................#..............................#...#.#.....
|
||||||
|
..#.................................................#.............................................#.....................#.........
|
||||||
|
.....#...............#...#.......................#.......................#......................................#...........#.....
|
||||||
|
...........#...#................................#.............................#........#.........................................#
|
||||||
|
..............................#.....................#......................#...#................................#.................
|
||||||
|
.........#.....................................................#...#......................................#................#......
|
||||||
|
.....#.....................#.................................#...................................................#....#......#....
|
||||||
|
................#.........#.........................#...........#...#..............................................#..............
|
||||||
|
.................................#....................................................................#..................#......#.
|
||||||
|
#..............#......................................................................#.....#.....................................
|
||||||
|
.............#......#..............##.#............#.#.....................#..........#.......#..........................#........
|
||||||
|
.......#............#.................#...........................................................#.............................#.
|
||||||
|
...........................#.......................#..................#....#....................................#.................
|
||||||
|
....#.....##...........................................#...........#.............#........................#.....#.................
|
||||||
|
............................#..............................................##..........#..................#.......#...............
|
||||||
|
#.............................#.............#...............................#..........#...#.....................................#
|
||||||
|
.............#.......#.....................................#...###......##...............#..#..............#.........#............
|
||||||
|
.......#......##.....#..................#....................................#............#................#...................#..
|
||||||
|
..............#......................#............#........#.....................................................#.........#....#.
|
||||||
|
.............#.......#...............................................##......#...........#...........#............................
|
||||||
|
#.#....#..............................................................#.........................................#...............#.
|
||||||
|
...#....#........................#.#.......#.....................#.............................#.#......................#.#.......
|
||||||
|
.##........................................................#.#...................#.....#.................................#........
|
||||||
|
............................#.#..................................#....#...........................................................
|
||||||
|
..................................................#......#...............#...............................#..#..#.......#..........
|
||||||
|
..........#......................#..........#.........................#...............#..##.....................#.................
|
||||||
|
...#.......#.........................................................#............#.........#...#................................#
|
||||||
|
....................#...................................#..........#.....#...#..#........#............#................#..........
|
||||||
|
...............................#........#.....................................#.....................................#.........#...
|
||||||
|
....#....................#...................................#.#........................#.........................................
|
||||||
|
.........#............................#.....................#.............#...........##.........#................................
|
||||||
|
.............................................##........................................#......#................................#..
|
||||||
|
...#...............................#.#...#...........#.............................#.............................................#
|
||||||
|
.............................#...........#................#..................................................#............#.......
|
||||||
|
................#....................................................................................#..#.#.......................
|
||||||
|
...#.............#.#..#.......................#.................#...............#..#....#..............#............#......#......
|
||||||
|
...........#......#............................#.....#..........#.#.................#..........#...........#...............#...#..
|
||||||
|
....#..................#...........................#.........#............#........#..........#..............................#....
|
||||||
|
..........#.......#...................#......#.......#.......#....................#.....................................#.........
|
||||||
|
...#....................................................#......#...#...................#.....................#....................
|
||||||
|
....................#..#.....#......#...................#............#.......................................#...............#....
|
||||||
|
.........................#.......#.....#..#.......#...........#......##..............................#.........#..................
|
||||||
|
.#...........#...#.........#....#...#.......#....#........................#...................#...#..................#............
|
||||||
|
.........##......#..............................#....................#..#...#..................#............................#.....
|
258
src/days/day6.rs
Normal file
258
src/days/day6.rs
Normal file
@ -0,0 +1,258 @@
|
|||||||
|
use std::path::Path;
|
||||||
|
|
||||||
|
use advent_derive::advent_day;
|
||||||
|
use itertools::Itertools;
|
||||||
|
|
||||||
|
use crate::{error::AdventError, input::get_lines};
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[derive(PartialEq, Clone, Copy, PartialOrd, Eq)]
|
||||||
|
enum Direction {
|
||||||
|
Up,
|
||||||
|
Right,
|
||||||
|
Down,
|
||||||
|
Left
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Ord for Direction {
|
||||||
|
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
|
||||||
|
match self {
|
||||||
|
Direction::Up => {
|
||||||
|
match other {
|
||||||
|
Direction::Up => std::cmp::Ordering::Equal,
|
||||||
|
Direction::Right => std::cmp::Ordering::Greater,
|
||||||
|
Direction::Down => std::cmp::Ordering::Greater,
|
||||||
|
Direction::Left => std::cmp::Ordering::Greater,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Direction::Right => {
|
||||||
|
match other {
|
||||||
|
Direction::Up => std::cmp::Ordering::Less,
|
||||||
|
Direction::Right => std::cmp::Ordering::Equal,
|
||||||
|
Direction::Down => std::cmp::Ordering::Greater,
|
||||||
|
Direction::Left => std::cmp::Ordering::Greater,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Direction::Down => {
|
||||||
|
match other {
|
||||||
|
Direction::Up => std::cmp::Ordering::Less,
|
||||||
|
Direction::Right => std::cmp::Ordering::Less,
|
||||||
|
Direction::Down => std::cmp::Ordering::Equal,
|
||||||
|
Direction::Left => std::cmp::Ordering::Greater,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Direction::Left => {
|
||||||
|
match other {
|
||||||
|
Direction::Up => std::cmp::Ordering::Less,
|
||||||
|
Direction::Right => std::cmp::Ordering::Less,
|
||||||
|
Direction::Down => std::cmp::Ordering::Less,
|
||||||
|
Direction::Left => std::cmp::Ordering::Equal,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Guard {
|
||||||
|
position: (i32, i32),
|
||||||
|
direction: Direction
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Day6Part1 {
|
||||||
|
obstacles: Vec<(i32, i32)>,
|
||||||
|
guard: Guard,
|
||||||
|
width: usize,
|
||||||
|
height: usize
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Day6Part1 {
|
||||||
|
fn new() -> Self {
|
||||||
|
Self {
|
||||||
|
obstacles: vec![],
|
||||||
|
guard: Guard {
|
||||||
|
position: (0, 0),
|
||||||
|
direction: Direction::Up
|
||||||
|
},
|
||||||
|
width: 0,
|
||||||
|
height: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Day6Part2 {
|
||||||
|
obstacles: Vec<(i32, i32)>,
|
||||||
|
guard: Guard,
|
||||||
|
width: usize,
|
||||||
|
height: usize
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Day6Part2 {
|
||||||
|
fn new() -> Self {
|
||||||
|
Self {
|
||||||
|
obstacles: vec![],
|
||||||
|
guard: Guard {
|
||||||
|
position: (0, 0),
|
||||||
|
direction: Direction::Up
|
||||||
|
},
|
||||||
|
width: 0,
|
||||||
|
height: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn read_input_part1(part1: &mut Day6Part1, path: &Path) -> Result<(), AdventError> {
|
||||||
|
let iter = get_lines(path).enumerate();
|
||||||
|
for (y, s) in iter {
|
||||||
|
let s = s?;
|
||||||
|
part1.width = s.len();
|
||||||
|
part1.height = y+1;
|
||||||
|
for (x, _) in s.chars().enumerate().filter(|(_, c)| { *c == '#'}) {
|
||||||
|
part1.obstacles.push((x as i32, y as i32));
|
||||||
|
}
|
||||||
|
if let Some(x) = s.chars().position(|c| { c == '^'}) {
|
||||||
|
part1.guard.position = (x as i32, y as i32);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn solve_part1(part1: &mut Day6Part1) -> Result<u64, AdventError> {
|
||||||
|
let mut spaces = vec![];
|
||||||
|
spaces.push(part1.guard.position);
|
||||||
|
loop {
|
||||||
|
if let Some(x) = step(part1) {
|
||||||
|
spaces.push(x);
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(spaces.iter().unique().count() as u64)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn step(part1: &mut Day6Part1) -> Option<(i32, i32)> {
|
||||||
|
let next_space = match part1.guard.direction {
|
||||||
|
Direction::Up => (part1.guard.position.0, part1.guard.position.1 - 1),
|
||||||
|
Direction::Right => (part1.guard.position.0 + 1, part1.guard.position.1),
|
||||||
|
Direction::Down => (part1.guard.position.0, part1.guard.position.1 + 1),
|
||||||
|
Direction::Left => (part1.guard.position.0 - 1, part1.guard.position.1)
|
||||||
|
};
|
||||||
|
|
||||||
|
if part1.obstacles.contains(&next_space) {
|
||||||
|
part1.guard.direction = match part1.guard.direction {
|
||||||
|
Direction::Up => Direction::Right,
|
||||||
|
Direction::Right => Direction::Down,
|
||||||
|
Direction::Down => Direction::Left,
|
||||||
|
Direction::Left => Direction::Up,
|
||||||
|
};
|
||||||
|
return step(part1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if next_space.0 < 0 || next_space.0 > part1.width as i32 || next_space.1 < 0 || next_space.1 >= part1.height as i32 {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
part1.guard.position = next_space;
|
||||||
|
Some(next_space)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn read_input_part2(part2: &mut Day6Part2, path: &Path) -> Result<(), AdventError> {
|
||||||
|
let iter = get_lines(path).enumerate();
|
||||||
|
for (y, s) in iter {
|
||||||
|
let s = s?;
|
||||||
|
part2.width = s.len();
|
||||||
|
part2.height = y+1;
|
||||||
|
for (x, _) in s.chars().enumerate().filter(|(_, c)| { *c == '#'}) {
|
||||||
|
part2.obstacles.push((x as i32, y as i32));
|
||||||
|
}
|
||||||
|
if let Some(x) = s.chars().position(|c| { c == '^'}) {
|
||||||
|
part2.guard.position = (x as i32, y as i32);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn step2(part2: &mut Day6Part2) -> Option<(i32, i32)> {
|
||||||
|
let next_space = match part2.guard.direction {
|
||||||
|
Direction::Up => (part2.guard.position.0, part2.guard.position.1 - 1),
|
||||||
|
Direction::Right => (part2.guard.position.0 + 1, part2.guard.position.1),
|
||||||
|
Direction::Down => (part2.guard.position.0, part2.guard.position.1 + 1),
|
||||||
|
Direction::Left => (part2.guard.position.0 - 1, part2.guard.position.1)
|
||||||
|
};
|
||||||
|
|
||||||
|
if let Ok(_) = part2.obstacles.binary_search(&next_space) {
|
||||||
|
part2.guard.direction = match part2.guard.direction {
|
||||||
|
Direction::Up => Direction::Right,
|
||||||
|
Direction::Right => Direction::Down,
|
||||||
|
Direction::Down => Direction::Left,
|
||||||
|
Direction::Left => Direction::Up,
|
||||||
|
};
|
||||||
|
return step2(part2);
|
||||||
|
}
|
||||||
|
|
||||||
|
if next_space.0 < 0 || next_space.0 > part2.width as i32 || next_space.1 < 0 || next_space.1 >= part2.height as i32 {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
part2.guard.position = next_space;
|
||||||
|
Some(next_space)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn solve_part2(part2: &mut Day6Part2) -> Result<u64, AdventError> {
|
||||||
|
let start_pos = part2.guard.position;
|
||||||
|
let start_dir = part2.guard.direction;
|
||||||
|
|
||||||
|
part2.obstacles.sort();
|
||||||
|
let mut spaces = vec![];
|
||||||
|
loop {
|
||||||
|
if let Some(x) = step2(part2) {
|
||||||
|
spaces.push(x);
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let obstacles_to_be = spaces.into_iter().unique().collect::<Vec<(i32, i32)>>();
|
||||||
|
let mut loops = 0u64;
|
||||||
|
for item in obstacles_to_be.into_iter() {
|
||||||
|
let mut been = vec![];
|
||||||
|
part2.guard.position = start_pos;
|
||||||
|
part2.guard.direction = start_dir;
|
||||||
|
let remove_index;
|
||||||
|
match part2.obstacles.binary_search(&item) {
|
||||||
|
Ok(_) => {
|
||||||
|
return Err(AdventError("Should not happen".to_string()));
|
||||||
|
}
|
||||||
|
Err(pos) => {
|
||||||
|
remove_index = pos;
|
||||||
|
part2.obstacles.insert(pos, item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
loop {
|
||||||
|
if let Some(pos) = step2(part2) {
|
||||||
|
let needle = (pos, part2.guard.direction);
|
||||||
|
if let Ok(_) = been.binary_search(&(pos, part2.guard.direction)) {
|
||||||
|
loops += 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
match been.binary_search(&needle) {
|
||||||
|
Ok(_) => {
|
||||||
|
return Err(AdventError("Should not happen".to_string()));
|
||||||
|
}
|
||||||
|
Err(pos) => {
|
||||||
|
been.insert(pos, needle)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
part2.obstacles.remove(remove_index);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(loops)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#[advent_day(Day6Part1, Day6Part2)]
|
||||||
|
struct Day6;
|
@ -20,5 +20,24 @@ pub mod day2;
|
|||||||
pub mod day3;
|
pub mod day3;
|
||||||
pub mod day4;
|
pub mod day4;
|
||||||
pub mod day5;
|
pub mod day5;
|
||||||
|
pub mod day6;
|
||||||
|
|
||||||
pub mod day14;
|
pub mod day14;
|
||||||
|
|
||||||
|
/*
|
||||||
|
fn read_input_part1(part1: &mut Day5Part1, path: &Path) -> Result<(), AdventError> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn solve_part1(part1: &mut Day5Part1) -> Result<u64, AdventError> {
|
||||||
|
Ok(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn read_input_part2(part2: &mut Day5Part2, path: &Path) -> Result<(), AdventError> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn solve_part2(part2: &mut Day5Part2) -> Result<u64, AdventError> {
|
||||||
|
Ok(0)
|
||||||
|
}
|
||||||
|
*/
|
@ -10,6 +10,7 @@ use day2::Day2;
|
|||||||
use day3::Day3;
|
use day3::Day3;
|
||||||
use day4::Day4;
|
use day4::Day4;
|
||||||
use day5::Day5;
|
use day5::Day5;
|
||||||
|
use day6::Day6;
|
||||||
|
|
||||||
use crate::error::AdventError;
|
use crate::error::AdventError;
|
||||||
use crate::days::*;
|
use crate::days::*;
|
||||||
@ -42,7 +43,7 @@ fn main() -> Result<(), AdventError> {
|
|||||||
Box::new(Day3::new()),
|
Box::new(Day3::new()),
|
||||||
Box::new(Day4::new()),
|
Box::new(Day4::new()),
|
||||||
Box::new(Day5::new()),
|
Box::new(Day5::new()),
|
||||||
Box::new(DummyDay::new()),
|
Box::new(Day6::new()),
|
||||||
Box::new(DummyDay::new()),
|
Box::new(DummyDay::new()),
|
||||||
Box::new(DummyDay::new()),
|
Box::new(DummyDay::new()),
|
||||||
Box::new(DummyDay::new()),
|
Box::new(DummyDay::new()),
|
||||||
|
Loading…
Reference in New Issue
Block a user