Lesson 3
Move Until Obstacle Game in Kotlin
Introduction

Welcome! This lesson involves a thrilling task that combines basic operations with array manipulation in Kotlin. We will be implementing a "Move Until Obstacle" game using a list of integers. Visualize yourself as a game developer, and get ready to delve into the exciting world of problem-solving!

Task Statement

In the "Move Until Obstacle" game, the player begins at the start of a linear List of integers. The number at each position indicates how many steps a player can move to the right. An obstacle number is one upon which the player cannot land. The goal is to move as far to the right as possible until either an obstacle stops the player or the player reaches the end of the List.

Your function, fun solution(numbers: List<Int>, obstacle: Int): Int, should tally and return the number of moves needed to reach the end of the List without encountering an obstacle. If the player encounters an obstacle, the function should return the index at which this obstacle lies.

For example, if the function receives the input: numbers = listOf(2, 3, 3, 4, 2, 4) and obstacle = 4, it should return 5. This is because the player starts at the 0th index, takes 2 steps as indicated by the number at the 0th index (landing on the 2nd index), and then takes 3 more steps as indicated by the number at the 2nd index to land on the 5th index, which is the obstacle 4.

If the function receives the following input: numbers = listOf(4, 1, 2, 2, 4, 2, 2) and obstacle = 2, the output should be 2. The player starts at the 0th index, takes 4 steps, lands on the 4th index, then takes 4 more steps, which brings the player outside the List, so the total number of steps the player takes is 2.

Solution Building: Step 1

Our first step is to ensure we have variables to track the player, i.e., their current position and the moves they've taken so far. We'll name them position and moves, initializing both to 0:

Kotlin
1fun solution(numbers: List<Int>, obstacle: Int): Int { 2 var position = 0 3 var moves = 0
Solution Building: Step 2 - Main Loop

Next, we'll use a while loop to iterate over the List. It continues as long as position is less than the size of numbers, which we obtain using numbers.size:

Kotlin
1fun solution(numbers: List<Int>, obstacle: Int): Int { 2 var position = 0 3 var moves = 0 4 while (position < numbers.size) {
Solution Building: Step 3 - Obstacle Check

During each iteration, we need to check whether the player has encountered an obstacle. If so, we should return the position at which this obstacle is located:

Kotlin
1fun solution(numbers: List<Int>, obstacle: Int): Int { 2 var position = 0 3 var moves = 0 4 while (position < numbers.size) { 5 if (numbers[position] == obstacle) { 6 return position 7 }
Solution Building: Step 4 - Move Player and Increment Steps

If the current number is not an obstacle, the player proceeds. The number of steps taken corresponds to the value at the current position. We add this to position and increment moves:

Kotlin
1fun solution(numbers: List<Int>, obstacle: Int): Int { 2 var position = 0 3 var moves = 0 4 while (position < numbers.size) { 5 if (numbers[position] == obstacle) { 6 return position 7 } 8 moves++ 9 position += numbers[position] 10 }
Final Solution: Outside the Loop

Once the loop ends, the player either has reached the end of the List or has encountered an obstacle. If the player managed to navigate the entirety of the List without encountering an obstacle, we want to return the total number of moves:

The complete function looks like this:

Kotlin
1fun solution(numbers: List<Int>, obstacle: Int): Int { 2 var position = 0 3 var moves = 0 4 5 while (position < numbers.size) { 6 // Check for obstacle at the current position 7 if (numbers[position] == obstacle) { 8 return position // Return the index of the obstacle 9 } 10 // Increment moves and update position 11 moves++ 12 position += numbers[position] // Move to the next position 13 } 14 15 // If loop ends without obstacles, return total moves taken 16 return moves 17} 18 19fun main() { 20 println(solution(listOf(2, 3, 3, 4, 2, 4), 4)) // Output: 5 21}
Lesson Summary

Congratulations on successfully implementing the "Move Until Obstacle" game using Kotlin! You've navigated the challenges of this task by applying basic List manipulation concepts and operations with numbers in Kotlin. Celebrate your achievements, but don't stop there! Up next, we have practice sessions filled with similar exercises to reinforce your understanding and skills. So, gear up and let's keep moving!

Enjoy this lesson? Now it's time to practice with Cosmo!
Practice is how you turn knowledge into actual skills.