Import the Kotlin project from Dojo assignment
This commit is contained in:
parent
2276f60b2f
commit
98c91a107a
11 changed files with 245 additions and 22 deletions
24
.run/Rover [check].run.xml
Normal file
24
.run/Rover [check].run.xml
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Rover [check]" type="GradleRunConfiguration" factoryName="Gradle">
|
||||
<ExternalSystemSettings>
|
||||
<option name="executionName" />
|
||||
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||
<option name="externalSystemIdString" value="GRADLE" />
|
||||
<option name="scriptParameters" value="" />
|
||||
<option name="taskDescriptions">
|
||||
<list />
|
||||
</option>
|
||||
<option name="taskNames">
|
||||
<list>
|
||||
<option value="check" />
|
||||
</list>
|
||||
</option>
|
||||
<option name="vmOptions" />
|
||||
</ExternalSystemSettings>
|
||||
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
|
||||
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
|
||||
<DebugAllEnabled>false</DebugAllEnabled>
|
||||
<RunAsTest>false</RunAsTest>
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
</component>
|
||||
25
.run/Rover [detekt ktlintCheck].run.xml
Normal file
25
.run/Rover [detekt ktlintCheck].run.xml
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Rover [detekt ktlintCheck]" type="GradleRunConfiguration" factoryName="Gradle" nameIsGenerated="true">
|
||||
<ExternalSystemSettings>
|
||||
<option name="executionName" />
|
||||
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||
<option name="externalSystemIdString" value="GRADLE" />
|
||||
<option name="scriptParameters" value="" />
|
||||
<option name="taskDescriptions">
|
||||
<list />
|
||||
</option>
|
||||
<option name="taskNames">
|
||||
<list>
|
||||
<option value="detekt" />
|
||||
<option value="ktlintCheck" />
|
||||
</list>
|
||||
</option>
|
||||
<option name="vmOptions" />
|
||||
</ExternalSystemSettings>
|
||||
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
|
||||
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
|
||||
<DebugAllEnabled>false</DebugAllEnabled>
|
||||
<RunAsTest>false</RunAsTest>
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
</component>
|
||||
24
.run/Rover [test].run.xml
Normal file
24
.run/Rover [test].run.xml
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Rover [test]" type="GradleRunConfiguration" factoryName="Gradle">
|
||||
<ExternalSystemSettings>
|
||||
<option name="executionName" />
|
||||
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||
<option name="externalSystemIdString" value="GRADLE" />
|
||||
<option name="scriptParameters" value="" />
|
||||
<option name="taskDescriptions">
|
||||
<list />
|
||||
</option>
|
||||
<option name="taskNames">
|
||||
<list>
|
||||
<option value="test" />
|
||||
</list>
|
||||
</option>
|
||||
<option name="vmOptions" />
|
||||
</ExternalSystemSettings>
|
||||
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
|
||||
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
|
||||
<DebugAllEnabled>false</DebugAllEnabled>
|
||||
<RunAsTest>false</RunAsTest>
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
</component>
|
||||
BIN
02_OrangeBelt.v.2.1.pdf
Normal file
BIN
02_OrangeBelt.v.2.1.pdf
Normal file
Binary file not shown.
101
README.md
101
README.md
|
|
@ -1,9 +1,7 @@
|
|||
# Rover
|
||||
# 🛰️ Mars Rover
|
||||
|
||||
 [](https://codecov.io/gh/appsoluut/dojo-mars-rover) [](https://app.deepsource.com/gh/appsoluut/dojo-mars-rover/) [](https://app.deepsource.com/gh/appsoluut/dojo-mars-rover/) [](https://app.deepsource.com/gh/appsoluut/dojo-mars-rover/)
|
||||
|
||||
A Kotlin project bootstrapped with **Gradle**, **Detekt**, **Ktlint**, **JUnit**, and **JaCoCo**.
|
||||
|
||||
## 🚀 Features
|
||||
|
||||
- 🔧 Gradle wrapper included
|
||||
|
|
@ -26,11 +24,98 @@ cd Rover
|
|||
|
||||
# Run Detekt and Ktlint checks
|
||||
./gradlew detekt ktlintCheck
|
||||
|
||||
# Run
|
||||
./gradlew run
|
||||
```
|
||||
|
||||
# License
|
||||
## Problem
|
||||
|
||||
MIT - feel free to use and modify.
|
||||
NASA is landing a robotic rover on a rectangular plateau on Mars.
|
||||
This plateau must be explored systematically so that the rover’s on-board cameras can survey the terrain and send images back to Earth.
|
||||
|
||||
A rover’s position is represented by:
|
||||
- Two integers (**X**, **Y**) indicating its coordinates, and
|
||||
- A letter indicating its current heading:
|
||||
- **N** (North)
|
||||
- **E** (East)
|
||||
- **S** (South)
|
||||
- **W** (West)
|
||||
|
||||
The plateau is divided into a grid, and the rover moves across it based on simple navigation commands.
|
||||
|
||||
For example, a position of `0 0 N` means the rover is at the bottom-left corner, facing North.
|
||||
|
||||
---
|
||||
|
||||
## Instructions
|
||||
|
||||
NASA can send the following commands to the rover:
|
||||
|
||||
- `L` ➔ Turn 90 degrees **left** without moving from the current spot.
|
||||
- `R` ➔ Turn 90 degrees **right** without moving from the current spot.
|
||||
- `M` ➔ Move **forward** one grid point in the direction it is facing.
|
||||
|
||||
> **Important**:
|
||||
> Moving North from `(x, y)` goes to `(x, y+1)`.
|
||||
> Moving East from `(x, y)` goes to `(x+1, y)`, and so on.
|
||||
|
||||
---
|
||||
|
||||
## Input
|
||||
|
||||
The input consists of:
|
||||
|
||||
1. **First parameter**: The rover’s **starting position**: two integers and a letter (e.g., `1 2 N`).
|
||||
|
||||
2. **Second parameter**: A string of **movement instructions** (e.g., `LMLMLMLMM`).
|
||||
|
||||
The rover processes all instructions in sequence.
|
||||
|
||||
---
|
||||
|
||||
## Output
|
||||
|
||||
After executing all the commands, the rover reports its **final coordinates and heading**.
|
||||
|
||||
---
|
||||
|
||||
## Example
|
||||
|
||||
| Starting Position | Instructions | Expected Output |
|
||||
|:------------------|:-------------|:----------------|
|
||||
| 1 2 N | | 1 2 N |
|
||||
| 1 2 N | L | 1 2 W |
|
||||
| 1 2 W | L | 1 2 S |
|
||||
| 1 2 S | L | 1 2 E |
|
||||
| 1 2 E | L | 1 2 N |
|
||||
| 1 2 N | R | 1 2 E |
|
||||
| 1 2 E | R | 1 2 S |
|
||||
| 1 2 S | R | 1 2 W |
|
||||
| 1 2 W | R | 1 2 N |
|
||||
| 1 2 N | M | 1 3 N |
|
||||
| 1 2 E | M | 2 2 E |
|
||||
| 1 2 S | M | 1 1 S |
|
||||
| 1 2 W | M | 0 2 W |
|
||||
| 1 2 N | LMLMLMLMM | 1 3 N |
|
||||
| 3 3 E | MMRMMRMRRM | 5 1 E |
|
||||
|
||||
---
|
||||
|
||||
# 🎯 Your Mission
|
||||
|
||||
You have been given a **working but fragile** codebase that controls a **single** rover.
|
||||
|
||||
Your goal:
|
||||
- **Refactor** the code to make it clean, expressive, and easy to maintain.
|
||||
- Prepare the code for **future enhancements**.
|
||||
- Eliminate technical debt, improve readability, and structure it to allow **easily adding new features** later.
|
||||
|
||||
> 🧠 **Hint**:
|
||||
> Future missions may require **handling multiple rovers** at once.
|
||||
> Your design should naturally evolve toward making this possible.
|
||||
|
||||
✅ **Do not change the existing behavior.**
|
||||
✅ **All existing tests must continue to pass.**
|
||||
|
||||
---
|
||||
|
||||
# 🌟 Good luck, engineer of Mars!
|
||||
Craft code that's ready for exploration... and evolution! 🚀
|
||||
|
|
|
|||
5
TECHDEBT.md
Normal file
5
TECHDEBT.md
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
# TODO
|
||||
- [ ] Make ktlint pass checks
|
||||
|
||||
# RPP
|
||||
- [ ] ...
|
||||
|
|
@ -7,7 +7,7 @@ plugins {
|
|||
}
|
||||
|
||||
application {
|
||||
mainClass.set("MainKt")
|
||||
mainClass.set("RoverKt")
|
||||
}
|
||||
|
||||
repositories {
|
||||
|
|
|
|||
|
|
@ -1,3 +0,0 @@
|
|||
fun main() {
|
||||
println("Hello, Kotlin CI/CD world!")
|
||||
}
|
||||
43
src/main/kotlin/Rover.kt
Normal file
43
src/main/kotlin/Rover.kt
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
package org.example
|
||||
|
||||
class Rover {
|
||||
constructor(p: String) {
|
||||
val s = p.split(' ')
|
||||
if (s.size >= 3) {
|
||||
rs.xx = s[0].toInt()
|
||||
rs.yy = s[1].toInt()
|
||||
rs.dd = s[2][0]
|
||||
}
|
||||
}
|
||||
|
||||
fun go(cms: String) {
|
||||
for (c in cms) {
|
||||
when (c) {
|
||||
'L' -> { when (rs.dd) { 'E' -> rs.dd = 'N' 'N' -> rs.dd = 'W' 'W' -> rs.dd = 'S' 'S' -> rs.dd = 'E'}}
|
||||
'R' -> { when (rs.dd) { 'E' -> rs.dd = 'S' 'S' -> rs.dd = 'W' 'W' -> rs.dd = 'N' 'N' -> rs.dd = 'E'}}
|
||||
'M' -> { when (rs.dd) { 'E' -> rs.xx++ 'S' -> rs.yy-- 'W' -> rs.xx-- 'N' -> rs.yy++}}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun g(z: Char) {
|
||||
go(z.toString())
|
||||
}
|
||||
|
||||
val xyd: String
|
||||
get() = "${rs.xx} ${rs.yy} ${rs.dd}"
|
||||
|
||||
fun pos(): String {
|
||||
return xyd
|
||||
}
|
||||
|
||||
constructor() : this("")
|
||||
|
||||
private var rs = RoverState()
|
||||
}
|
||||
|
||||
class RoverState {
|
||||
var xx: Int = 0
|
||||
var yy: Int = 0
|
||||
var dd: Char = 'N'
|
||||
}
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
import kotlin.test.Test
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
class MainTest {
|
||||
@Test
|
||||
fun testExample() {
|
||||
val result = 2 + 2
|
||||
assertEquals(4, result)
|
||||
}
|
||||
}
|
||||
30
src/test/kotlin/MarsRoverTests.kt
Normal file
30
src/test/kotlin/MarsRoverTests.kt
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
import org.example.Rover
|
||||
import org.junit.jupiter.api.Assertions.assertEquals
|
||||
import org.junit.jupiter.params.ParameterizedTest
|
||||
import org.junit.jupiter.params.provider.CsvSource
|
||||
|
||||
class MarsRoverTests {
|
||||
@ParameterizedTest
|
||||
@CsvSource(
|
||||
"1 2 N, ' ', 1 2 N",
|
||||
"1 2 N, L, 1 2 W",
|
||||
"1 2 W, L, 1 2 S",
|
||||
"1 2 S, L, 1 2 E",
|
||||
"1 2 E, L, 1 2 N",
|
||||
"1 2 N, R, 1 2 E",
|
||||
"1 2 E, R, 1 2 S",
|
||||
"1 2 S, R, 1 2 W",
|
||||
"1 2 W, R, 1 2 N",
|
||||
"1 2 N, M, 1 3 N",
|
||||
"1 2 E, M, 2 2 E",
|
||||
"1 2 S, M, 1 1 S",
|
||||
"1 2 W, M, 0 2 W",
|
||||
"1 2 N, LMLMLMLMM, 1 3 N",
|
||||
"3 3 E, MMRMMRMRRM, 5 1 E"
|
||||
)
|
||||
fun `execute commands`(startingPosition: String, instructions: String, expectedOutput: String) {
|
||||
val rover = Rover(startingPosition)
|
||||
rover.go(instructions)
|
||||
assertEquals(expectedOutput, rover.pos())
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue