Answer: Debug the Robot #227

Here’s the bug

Step 9 says Turn right, but it should say Turn left. Beep turned the wrong way!

Did you find a different fix that also gets Beep to the battery? That counts too! There is often more than one way to fix a bug. The important thing is that you tested it step by step.

The fixed program, with Beep's route to the battery drawn as an orange line.
With the bug fixed, Beep reaches the battery.

The fixed program

  1. Turn left
  2. Forward
  3. Turn right
  4. Forward
  5. Turn left
  6. Forward
  7. Forward
  8. Forward
  9. Turn left
  10. Forward

What the buggy program did

Here is what happens if Beep follows the program with the bug, step by step. Beep doesn’t bump into anything, but ends up in the wrong square.

StepCommandBeep is now atFacingNote
1Turn leftcolumn 1, row 5up
2Forwardcolumn 1, row 4up
3Turn rightcolumn 1, row 4right
4Forwardcolumn 2, row 4right
5Turn leftcolumn 2, row 4up
6Forwardcolumn 2, row 3up
7Forwardcolumn 2, row 2up
8Forwardcolumn 2, row 1up
9Turn rightcolumn 2, row 1right
10Forwardcolumn 3, row 1right

Check it with Python

This Python program pretends to be Beep. It follows the fixed program and checks for walls on the way. In Python, squares are counted from 0, so column 1, row 1 is (0, 0).

program = "LFRFLFFFLF"
walls = [(0, 1), (0, 2), (1, 4), (4, 2), (5, 3)]
width, height = 6, 5
x, y, facing = 0, 4, "right"

moves = {"up": (0, -1), "right": (1, 0), "down": (0, 1), "left": (-1, 0)}
turn_left = {"up": "left", "left": "down", "down": "right", "right": "up"}
turn_right = {"up": "right", "right": "down", "down": "left", "left": "up"}

for step in program:
    if step == "F":
        dx, dy = moves[facing]
        if (x + dx, y + dy) in walls or not (0 <= x + dx < width and 0 <= y + dy < height):
            print("Bump! Beep hit a wall at", (x, y))
            break
        x, y = x + dx, y + dy
    elif step == "L":
        facing = turn_left[facing]
    elif step == "R":
        facing = turn_right[facing]

print("Beep finished at", (x, y), "facing", facing)

When you run it, it prints:

Beep finished at (0, 0) facing left

The battery is at (0, 0) in Python’s counting, so Beep made it! Try putting the buggy program, "LFRFLFFFRF", back in and see what Python says.