mars-rover-fe

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit e4bd2597d5fe35ac5d026916df732b60d8dc4edf
parent f09e4d4bee909ea28b0d1691703f5eee0ffb402f
Author: Daniel Barlow <dan@telent.net>
Date:   Thu,  2 Nov 2023 23:16:04 +0000

we can drive a rover with sequence of commands as string

Diffstat:
Msrc/main.rs | 33++++++++++++++++++++++++++++++++-
1 file changed, 32 insertions(+), 1 deletion(-)

diff --git a/src/main.rs b/src/main.rs @@ -8,7 +8,7 @@ mod rover { #[derive(Debug, PartialEq, Copy, Clone)] pub enum Rotation { Left, Right } - type Rover = (i32, i32, Facing); + pub type Rover = (i32, i32, Facing); fn velocity(direction : &Facing) -> (i32, i32) { match direction { @@ -55,6 +55,29 @@ mod rover { } +mod driver { + use super::rover; + + fn perform_insn(command: &str, rover: &rover::Rover) -> rover::Rover { + match command { + "f" => rover::forward(&rover), + "b" => rover::backward(&rover), + "l" => rover::rotate(&rover, rover::Rotation::Left), + "r" => rover::rotate(&rover, rover::Rotation::Right), + _ => rover.clone() + } + } + + pub fn execute(rover: &rover::Rover, instructions: &str) -> rover::Rover { + if instructions.is_empty() { + rover.clone() + } else { + let (first, rest) = instructions.split_at(1); + execute(&perform_insn(first, rover), rest) + } + } +} + #[cfg(test)] mod tests { use super::*; @@ -112,4 +135,12 @@ mod tests { (_, _, facing) => assert_eq!(facing, rover::Facing::W) } } + + #[test] + fn drive() { + let r = (1 as i32, 1 as i32, rover::Facing::S); + assert_eq!(driver::execute(&r, "ffrf"), + (0 as i32, 3 as i32, rover::Facing::W)); + } + }