Answer: Debug the Robot #383

Here’s the bug

A Forward step is missing. It should come after step 12. Without it, Beep turns too early.

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. Forward
  2. Turn left
  3. Forward
  4. Forward
  5. Turn right
  6. Forward
  7. Forward
  8. Forward
  9. Turn left
  10. Forward
  11. Forward
  12. Turn left
  13. Forward
  14. Turn right
  15. Forward
  16. Forward
  17. Turn left
  18. 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
1Forwardcolumn 1, row 2down
2Turn leftcolumn 1, row 2right
3Forwardcolumn 2, row 2right
4Forwardcolumn 3, row 2right
5Turn rightcolumn 3, row 2down
6Forwardcolumn 3, row 3down
7Forwardcolumn 3, row 4down
8Forwardcolumn 3, row 5down
9Turn leftcolumn 3, row 5right
10Forwardcolumn 4, row 5right
11Forwardcolumn 5, row 5right
12Turn leftcolumn 5, row 5up
13Turn rightcolumn 5, row 5right
14Forwardcolumn 5, row 5rightBump! 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 = "FLFFRFFFLFFLFRFFLF"
walls = [(0, 2), (0, 3), (2, 6), (3, 3), (4, 2), (5, 1), (5, 4), (5, 6), (6, 0), (6, 4)]
width, height = 8, 7
x, y, facing = 0, 0, "down"

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

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