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)) } }