55 lines
1.7 KiB
Kotlin
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'
|