Answer: Debug the Robot #361

Here’s the bug

Step 13 is an extra Forward that shouldn’t be there. Beep walks one square too far.

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 right
  2. Forward
  3. Turn right
  4. Forward
  5. Forward
  6. Forward
  7. Forward
  8. Forward
  9. Forward
  10. Turn right
  11. Forward
  12. Turn left
  13. Forward

What the buggy program did

Here is what happens if Beep follows the program with the bug, step by step. Beep bumps into a wall.

StepCommandBeep is now atFacingNote
1Turn rightcolumn 1, row 7up
2Forwardcolumn 1, row 6up
3Turn rightcolumn 1, row 6right
4Forwardcolumn 2, row 6right
5Forwardcolumn 3, row 6right
6Forwardcolumn 4, row 6right
7Forwardcolumn 5, row 6right
8Forwardcolumn 6, row 6right
9Forwardcolumn 7, row 6right
10Turn rightcolumn 7, row 6down
11Forwardcolumn 7, row 7down
12Turn leftcolumn 7, row 7right
13Forwardcolumn 8, row 7right
14Forwardcolumn 8, row 7rightBump! A wall or the edge is in the way.

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 = "RFRFFFFFFRFLF"
walls = [(2, 2), (3, 0), (3, 6), (4, 0), (6, 3), (7, 5)]
width, height = 8, 7
x, y, facing = 0, 6, "left"

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 (7, 6) facing right

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