dojo-mars-rover/src/main/kotlin/org/example/Rover.kt

55 lines
1.7 KiB
Kotlin

package org.example
class Rover {
constructor(commands: String) {
val command = commands.split(' ')
if (command.size >= ROVER_MINIMUM_NEEDED_COMMANDS) {
state =
state.copy(
positionX = command[ROVER_STARTING_POSITION_X].toInt(),
positionY = command[ROVER_STARTING_POSITION_Y].toInt(),
heading = Heading.from(command[ROVER_FACING_DIRECTION][ROVER_COMMANDLIST_DIRECTION]) ?: state.heading,
)
}
}
fun go(instructions: String) {
for (instruction in instructions) {
when (instruction) {
COMMAND_TURN_LEFT -> turnLeft()
COMMAND_TURN_RIGHT -> turnRight()
COMMAND_MOVE -> move()
}
}
}
private fun move() {
val (updatedX, updatedY) = state.heading.move(state.positionX, state.positionY)
state = state.copy(positionX = updatedX, positionY = updatedY)
}
private fun turnRight() {
state.heading = state.heading.turnRight()
}
private fun turnLeft() {
state.heading = state.heading.turnLeft()
}
val position: String
get() = "${state.positionX} ${state.positionY} ${state.heading}"
fun pos(): String = position
private var state = RoverState()
}
private const val ROVER_MINIMUM_NEEDED_COMMANDS = 3
private const val ROVER_STARTING_POSITION_X = 0
private const val ROVER_STARTING_POSITION_Y = 1
private const val ROVER_FACING_DIRECTION = 2
private const val ROVER_COMMANDLIST_DIRECTION = 0
private const val COMMAND_TURN_LEFT = 'L'
private const val COMMAND_TURN_RIGHT = 'R'
private const val COMMAND_MOVE = 'M'