Add movement to Position2D

This commit is contained in:
kageru 2019-12-15 11:49:30 +01:00
parent 9e63affcf6
commit 10b1b09fda
Signed by: kageru
GPG Key ID: 8282A2BEA4ADA3D2
2 changed files with 41 additions and 20 deletions

View File

@ -1,14 +1,7 @@
use intcode::*;
use grid::*; use grid::*;
use intcode::*;
use std::collections::HashMap; use std::collections::HashMap;
enum Direction {
Up,
Down,
Left,
Right,
}
struct Robot { struct Robot {
direction: Direction, direction: Direction,
position: Position2D, position: Position2D,
@ -34,14 +27,8 @@ impl Robot {
} }
} }
fn mv(&mut self) { fn mov(&mut self) {
let pos = self.position; self.position.mov(&self.direction);
self.position = match self.direction {
Direction::Up => pos + (0, 1).into(),
Direction::Right => pos + (1, 0).into(),
Direction::Left => pos + (-1, 0).into(),
Direction::Down => pos + (0, -1).into(),
}
} }
fn paint(&mut self, color: i64) { fn paint(&mut self, color: i64) {
@ -64,7 +51,7 @@ fn start_with_input(input: Vec<i64>, color: i64) -> Robot {
robot.paint(o); robot.paint(o);
let turn_int = pc.run().unwrap(); let turn_int = pc.run().unwrap();
robot.turn(turn_int); robot.turn(turn_int);
robot.mv(); robot.mov();
pc.params.push(robot.current_color()); pc.params.push(robot.current_color());
} }
robot robot
@ -76,5 +63,10 @@ fn main() {
println!("Part 1: {}", part1_robot.visited.len()); println!("Part 1: {}", part1_robot.visited.len());
let part2_robot = start_with_input(input, 1); let part2_robot = start_with_input(input, 1);
println!("Part 2:\n{}", draw_ascii(&part2_robot.visited, 0).replace('0', " ").replace('1', "")); println!(
"Part 2:\n{}",
draw_ascii(&part2_robot.visited, 0)
.replace('0', " ")
.replace('1', "")
);
} }

View File

@ -2,6 +2,7 @@ use itertools::join;
use std::collections::HashMap; use std::collections::HashMap;
use std::fmt::Display; use std::fmt::Display;
use std::hash::BuildHasher; use std::hash::BuildHasher;
use std::ops::{Add, AddAssign};
#[derive(Hash, PartialEq, Eq, Debug, Clone, Copy)] #[derive(Hash, PartialEq, Eq, Debug, Clone, Copy)]
pub struct Position2D { pub struct Position2D {
@ -9,6 +10,13 @@ pub struct Position2D {
pub y: i64, pub y: i64,
} }
pub enum Direction {
Up,
Down,
Left,
Right,
}
struct Boundaries { struct Boundaries {
x_min: i64, x_min: i64,
x_max: i64, x_max: i64,
@ -25,7 +33,10 @@ fn get_boundaries(input: &[&Position2D]) -> Boundaries {
Boundaries { x_min, x_max, y_min, y_max } Boundaries { x_min, x_max, y_min, y_max }
} }
pub fn draw_ascii<T: Display, S: BuildHasher>(coordinates: &HashMap<Position2D, T, S>, default: T) -> String { pub fn draw_ascii<T: Display, S: BuildHasher>(
coordinates: &HashMap<Position2D, T, S>,
default: T,
) -> String {
let b = get_boundaries(&coordinates.keys().collect::<Vec<_>>()); let b = get_boundaries(&coordinates.keys().collect::<Vec<_>>());
join( join(
(b.y_min..=b.y_max).rev().map(|y| { (b.y_min..=b.y_max).rev().map(|y| {
@ -42,7 +53,25 @@ pub fn draw_ascii<T: Display, S: BuildHasher>(coordinates: &HashMap<Position2D,
) )
} }
impl std::ops::Add for Position2D { impl Position2D {
pub fn mov(&mut self, dir: &Direction) {
*self = *self
+ match dir {
Direction::Up => (0, 1).into(),
Direction::Right => (1, 0).into(),
Direction::Left => (-1, 0).into(),
Direction::Down => (0, -1).into(),
}
}
}
impl AddAssign for Position2D {
fn add_assign(&mut self, rhs: Position2D) {
*self = *self + rhs;
}
}
impl Add for Position2D {
type Output = Position2D; type Output = Position2D;
fn add(self, rhs: Position2D) -> Position2D { fn add(self, rhs: Position2D) -> Position2D {