From b296156206a9b1bc4473c163bff44e6f2bc95573 Mon Sep 17 00:00:00 2001 From: Federico Igne Date: Sun, 3 Jan 2021 16:48:43 +0000 Subject: [rust] Robot Simulator --- rust/robot-simulator/src/lib.rs | 85 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 rust/robot-simulator/src/lib.rs (limited to 'rust/robot-simulator/src') diff --git a/rust/robot-simulator/src/lib.rs b/rust/robot-simulator/src/lib.rs new file mode 100644 index 0000000..d6b6719 --- /dev/null +++ b/rust/robot-simulator/src/lib.rs @@ -0,0 +1,85 @@ +// The code below is a stub. Just enough to satisfy the compiler. +// In order to pass the tests you can add-to or change any of this code. + +#[derive(PartialEq, Debug)] +pub enum Direction { + North, + East, + South, + West, +} + +pub struct Robot { + x: i32, + y: i32, + d: Direction, +} + +impl Robot { + pub fn new(x: i32, y: i32, d: Direction) -> Self { + Robot { x, y, d } + } + + pub fn turn_right(self) -> Self { + Robot { + d: { + use Direction::*; + match self.d { + North => East, + East => South, + South => West, + West => North, + } + }, + ..self + } + } + + pub fn turn_left(self) -> Self { + Robot { + d: { + use Direction::*; + match self.d { + North => West, + East => North, + South => East, + West => South, + } + }, + ..self + } + } + + pub fn advance(self) -> Self { + Robot { + x: match self.d { + Direction::West => self.x - 1, + Direction::East => self.x + 1, + _ => self.x, + }, + y: match self.d { + Direction::North => self.y + 1, + Direction::South => self.y - 1, + _ => self.y, + }, + ..self + } + } + + pub fn instructions(self, instructions: &str) -> Self { + instructions.chars().fold(self, |acc, action| match action { + 'A' => acc.advance(), + 'R' => acc.turn_right(), + 'L' => acc.turn_left(), + _ => acc, + }) + } + + pub fn position(&self) -> (i32, i32) { + (self.x, self.y) + } + + pub fn direction(&self) -> &Direction { + &self.d + } +} -- cgit v1.2.3