#!/usr/bin/env python3 # https://www.freecodecamp.org/learn/python-v9/review-dictionaries-and-sets/review-dictionaries-and-sets import random class Player: def __init__(self, name: str, achievements: set[str]): self.name = name self.achievements = achievements def gen_player_achievements(player: str, achievements: set[str]): pa = set() list_ach = list(achievements) for _ in range(9): achievement = random.choice(list_ach) pa.add(achievement) return pa if __name__ == "__main__": print("=== Achievement Tracker System ===") achievements = {'Crafting Genius', 'World Savior', 'Master Explorer', 'Collector Supreme', 'Untouchable', 'Boss Slayer', 'Strategist', 'Unstoppable', 'Speed Runner', 'Survivor', 'Treasure Hunter', 'First Steps', 'Sharp Mind'} print() black_for = '\033[0;30m' pink_bak = '\033[48;5;205m' stp_color = '\033[0m' # print players' achievement(s) players_list: list[str] = ['Alice', 'Bob', 'Charlie', 'Dylan'] players = [] i = 0 for player in players_list: players.append(Player(player, gen_player_achievements(player, achievements))) print(f"{black_for}{pink_bak}Player {players[i].name}:" f"{stp_color} {players[i].achievements}") i += 1 print() union = players[0].achievements.union(players[1].achievements, players[2].achievements, players[3].achievements) print(f"{black_for}{pink_bak}All distinct achievements:" f"{stp_color} {union}") print() common_achievements = players[0].achievements.intersection( players[1].achievements, players[2].achievements, players[3].achievements) print(f"{black_for}{pink_bak}Common achievements:" f"{stp_color} {common_achievements}") print() # print players' unique achievement(s) print("Only", players[0].name, "has: ", players[0].achievements.difference(players[1].achievements, players[2].achievements, players[3].achievements)) print("Only", players[1].name, "has: ", players[1].achievements.difference(players[0].achievements, players[2].achievements, players[3].achievements)) print("Only", players[2].name, "has: ", players[2].achievements.difference(players[1].achievements, players[0].achievements, players[3].achievements)) print("Only", players[3].name, "has: ", players[3].achievements.difference(players[1].achievements, players[2].achievements, players[0].achievements)) print() # print what each player is missing i = 0 # iterate through the list of string for player in players_list: missing = set() for key in achievements: # check players' achievement in list of instances if key not in players[i].achievements: missing.add(key) print(f"{black_for}{pink_bak}{players[i].name}" f" is missing\033[0m {missing}") i += 1