Untitled

 avatar
unknown
plain_text
10 days ago
1.4 kB
3
Indexable
import gleam/list
import gleam/string

pub type Robot {
  Robot(direction: Direction, position: Position)
}

pub type Direction {
  North
  East
  South
  West
}

pub type Position {
  Position(x: Int, y: Int)
}

pub fn create(direction: Direction, position: Position) -> Robot {
  Robot(direction, position)
}

pub fn turn_right(direction: Direction) -> Direction {
  case direction {
    North -> East
    East -> South
    South -> West
    West -> North
  }
}

pub fn turn_left(direction: Direction) -> Direction {
  case direction {
    North -> West
    West -> South
    South -> East
    East -> North
  }
}

pub fn advance(position: Position, direction: Direction) -> Position {
  case direction {
    North -> Position(position.x, position.y + 1)
    East -> Position(position.x + 1, position.y)
    South -> Position(position.x, position.y - 1)
    West -> Position(position.x - 1, position.y)
  }
}

pub fn move(direction: Direction, position: Position, instructions: String) -> Robot {
  string.fold(instructions, Robot(direction, position), fn(robot, instruction) {
    case robot {
      Robot(dir, pos) ->
        case instruction {
          "R" -> Robot(turn_right(dir), pos)
          "L" -> Robot(turn_left(dir), pos)
          "A" -> Robot(dir, advance(pos, dir))
          _ -> robot  // Ignore unknown instructions
        }
    }
  })
}
Editor is loading...
Leave a Comment