The Great Robot Race print_result bug

Here is the link to the exercise https://www.codecademy.com/courses/learn-intermediate-python-3/projects/the-great-robot-race-python-project

all steps seam correct. The program runs well when using the command python3 robot_race.py. But when it is time to print the result I get this eror:

Traceback (most recent call last):
File “robot_race.py”, line 62, in
rr.print_results(bot_scores)
File “/home/ccuser/workspace/the-great-robot-race-python-project-workspace/robot_race_functions.py”, line 31, in print_results
bot_score_data.sort(key=lambda b: b.score)
TypeError: ‘<’ not supported between instances of ‘Counter’ and ‘Counter’

it seems to be a problem with the provided functions in robot_race_functions.py, but I saw no instance of ‘<’ in the function. Can someone help me out on why the whole race is printed but the results are not?

Here is the code:

import robot_race_functions as rr
from collections import deque, Counter, namedtuple
from time import time, sleep

maze_file_name = 'maze_data_1.csv'
seconds_between_turns = 0.3
max_turns = 35

# Initialize the robot race
maze_data = rr.read_maze(maze_file_name)
rr.print_maze(maze_data)
walls, goal, bots = rr.process_maze_init(maze_data)

# Populate a deque of all robot commands for the provided maze
robot_moves = deque()
num_of_turns = 0
while not rr.is_race_over(bots) and num_of_turns < max_turns:
  # For every bot in the list of bots, if the bot has not reached the end, add a new move to the robot_moves deque
  # Add your code below!
  for bot in bots:
    if bot.has_finished == False:
      robot_moves.append(rr.compute_robot_logic(walls, goal, bot))
  num_of_turns += 1

# Count the number of moves based on the robot names
# Add your code below!
moves_by_robot = Counter(move[0] for move in robot_moves)

# Count the number of collisions by robot name
# Add your code below!
colisions_by_robot = Counter(move[0]for move in robot_moves if move[2] ==True)

# Create a namedtuple to keep track of our robots' points
# Add your code below!
BotScoredData = namedtuple('BotScoredData', ['name', 'num_moves', 'num_collisions', 'score'])

# Calculate the scores (moves + collisions) for each robot and append it to bot_scores 
bot_scores = []
# Add your code below!
for bot in bots:
  bot_scores.append(BotScoredData(bot.name, moves_by_robot, colisions_by_robot, moves_by_robot + colisions_by_robot))

# Populate a dict to keep track of the robot movements
bot_data = {}
# Add your code below!
for bot in bots:
  bot_data[bot.name] = bot

# Move the robots and update the map based on the moves deque
while len(robot_moves) > 0:
  # Make sure to pop moves from the front of the deque
  # Add your code below!
  bot_name, direction, has_collided = robot_moves.popleft()
  bot_data[bot_name].process_move(direction)
  
  # Update the maze characters based on the robot positions and print it to the console
  rr.update_maze_characters(maze_data, bots)
  rr.print_maze(maze_data)
  sleep(seconds_between_turns - time() % seconds_between_turns)

# Print out the results!
rr.print_results(bot_scores)

Aaannnnd I found the problem :slight_smile:

I decided to print bot_scores to check it and noticed that each bot had the entire counter for all bot moves and all bots collisions.
I had to specify the moves and the collisions of the specific bot name when appending to scores.
like so:

for bot in bots:
  bot_scores.append(BotScoredData(bot.name, moves_by_robot[bot.name], colisions_by_robot[bot.name], moves_by_robot[bot.name] + colisions_by_robot[bot.name]))

Hi, this solution was really helpful, thank you!

I know this sounds stupid, but how do you print out an object onto the console for this project? I only see the terminal.

Hi, I’m glad it was helpful :slight_smile:

To print, I printed to the terminal. The least suggested debugging technique, I think… I commented out most of it and added print() to the variables to check that the results were what I expected them to be.

for example: print(robot_moves)
print(moves_by_robot)
etc… and after each step I ran the file to see the result on the terminal.

Well, I didn’t actually printed everything… I did it with about two variables… then I decided to print(bot_scores) instead of rr.print_results(bot_scores) at the end. Since the error mentioned calling this with bot_scores. (if I am remembering correctly. That was more than a month ago)