"""Mastermind Evaluator.""" from collections import Counter import random BLACK_PEG = 'black' BLUE_PEG = 'blue' GREEN_PEG = 'green' ORANGE_PEG = 'orange' PURPLE_PEG = 'purple' RED_PEG = 'red' WHITE_PEG = 'white' YELLOW_PEG = 'yellow' PEG_COLOR_OPTIONS = { BLUE_PEG, GREEN_PEG, ORANGE_PEG, PURPLE_PEG, RED_PEG, YELLOW_PEG, } DEFAULT_MAX_NUM_GUESSES = 10 DEFAULT_NUM_PEGS_IN_SECRET_CODE = 4 DEFAULT_NUM_SCORING_PEGS = DEFAULT_NUM_PEGS_IN_SECRET_CODE def get_random_colored_pegs(num_pegs=DEFAULT_NUM_PEGS_IN_SECRET_CODE): """Get random colored pegs. Args: num_pegs (int): Number of pegs to get. Returns: Randomly chosen set of pegs. """ color_pegs = random.choices( population=list(PEG_COLOR_OPTIONS), k=num_pegs, ) return color_pegs def _get_scoring_pegs(secret_pegs, guess_pegs, num_scoring_pegs): """Get scoring pegs. Args: secret_pegs (list): Secret pegs to score against. guess_pegs (list): Guess pegs to score. num_scoring_pegs (int): Number of scoring pegs to return. Returns: Scoring pegs. """ secret_peg_color_quantity = dict(Counter(secret_pegs)) num_black_pegs = 0 num_white_pegs = 0 for guess_peg, secret_peg in zip(guess_pegs, secret_pegs): if not secret_peg_color_quantity.get(guess_peg): continue if guess_peg == secret_peg: num_black_pegs += 1 else: num_white_pegs += 1 secret_peg_color_quantity[guess_peg] -= 1 scoring_pegs = [ *num_black_pegs*[BLACK_PEG], *num_white_pegs*[WHITE_PEG], ][:num_scoring_pegs] random.shuffle(scoring_pegs) return scoring_pegs def mastermind_evaluator( secret_pegs, guess_pegs, num_guesses, num_pegs_in_secret_code=DEFAULT_NUM_PEGS_IN_SECRET_CODE, num_scoring_pegs=DEFAULT_NUM_SCORING_PEGS, max_num_guesses=DEFAULT_MAX_NUM_GUESSES, ): """Evaluate a Mastermind game state. Args: secret_pegs (list): Secret pegs. guess_pegs (list): Guess pegs. num_guesses (int): Number of guesses that have been made. num_pegs_in_secret_code (int): Number of pegs that make up secret code. num_scoring_pegs (int): Number of scoring pegs. max_num_guesses (int): Max number of guesses allowed. Returns: dict: Scored game state. """ assert len(secret_pegs) == num_pegs_in_secret_code assert len(guess_pegs) == num_pegs_in_secret_code assert num_guesses <= max_num_guesses is_correct = secret_pegs == guess_pegs return { 'is_game_over': num_guesses >= max_num_guesses or is_correct, 'is_correct': is_correct, 'scoring_pegs': _get_scoring_pegs(secret_pegs, guess_pegs, num_scoring_pegs), } def interview_question_adapter(secret_code, guess): """Answer interview question. https://docs.google.com/document/d/1Pkl8MkGgmV6u7EcMrC4JzLz3NTTEfJ5eb2xDghVWJr0/edit Args: secret_code (str): Secret code e.g.: blue blue red red. guess (str): A secret code guess. Returns: str: Scoring pegs. """ (secretPegA, secretPegB, secretPegC, secretPegD) = secret_code.split(' ') (guessPegA, guessPegB, guessPegC, guessPegD) = guess.split(' ') game_scoring = mastermind_evaluator( [secretPegA, secretPegB, secretPegC, secretPegD], [guessPegA, guessPegB, guessPegC, guessPegD], 0, ) if game_scoring['is_correct']: return 'Winner!' return ' '.join(game_scoring['scoring_pegs'])