Current section
Files
Jump to
Current section
Files
src/robot_simulator.gleam
import gleam/list
import gleam/string
pub type Direction {
North
East
South
West
}
pub type Position {
Position(x: Int, y: Int)
}
pub type Robot {
Robot(direction: Direction, position: Position)
}
pub fn create(direction: Direction, position: Position) -> Robot {
Robot(direction, position)
}
pub fn move(
direction: Direction,
position: Position,
instructions: String,
) -> Robot {
let robot = create(direction, position)
let move_folder = fn(robot, instruction) {
case instruction {
"R" -> turn_right(robot)
"L" -> turn_left(robot)
"A" -> advance(robot)
_ -> panic as "unreachable"
}
}
instructions
|> string.to_graphemes()
|> list.fold(robot, move_folder)
}
fn turn_right(robot: Robot) {
case robot.direction {
North -> Robot(..robot, direction: East)
East -> Robot(..robot, direction: South)
South -> Robot(..robot, direction: West)
West -> Robot(..robot, direction: North)
}
}
fn turn_left(robot: Robot) {
case robot.direction {
North -> Robot(..robot, direction: West)
East -> Robot(..robot, direction: North)
South -> Robot(..robot, direction: East)
West -> Robot(..robot, direction: South)
}
}
fn advance(robot: Robot) {
let Position(x: x, y: y) = robot.position
case robot.direction {
North -> Robot(..robot, position: Position(x: x, y: y + 1))
East -> Robot(..robot, position: Position(x: x + 1, y: y))
South -> Robot(..robot, position: Position(x: x, y: y - 1))
West -> Robot(..robot, position: Position(x: x - 1, y: y))
}
}