Last active
October 27, 2015 08:32
-
-
Save mahanmarwat/2d2d61601ed3f8ab4b7d to your computer and use it in GitHub Desktop.
AI Guess, to solve this challenge: https://realpython.com/blog/python/python-programming-contest-first-to-five/
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from collections import Counter | |
import random | |
def base_strategy(): | |
return random.randrange(1, 10) | |
def computer_strategy(scores, player_answers, computer_answers, | |
total_iterations, current_iteration): | |
"""Guess a number with human like logic. | |
Result: | |
- Won 94 out of 100, when propponent played in range (1, 10) | |
Results - Player 6, Computer 94, Tie 0 | |
- Won 9256 out of 10000, when propponent played in range (1, 10) | |
Results - Player 744, Computer 9256, Tie 0 | |
- Won 77 out of 100, when propponent played in range (1, 3) | |
Results - Player 23, Computer 77, Tie 0 | |
- Won 7805 out of 10000, when propponent played in range (1, 3) | |
Results - Player 2195, Computer 7805, Tie 0 | |
""" | |
DEBUG = False | |
# Increament the user repeated num by 1 and return it. | |
if len(player_answers) >= 2 and player_answers[-1] == player_answers[-2]: | |
if player_answers[-1] == 4: | |
our_guess = 2 | |
elif player_answers[-1] == 3: | |
our_guess = 1 | |
elif player_answers[-1] == 2: | |
our_guess = 3 | |
elif player_answers[-1] == 1: | |
our_guess = 2 | |
else: | |
our_guess = random.randint(1, 3) | |
if DEBUG: print('Repeated: {0}'.format(our_guess)) | |
return our_guess | |
# If one point to win return 1 or 2. | |
if scores['computer'] == 4: | |
our_guess = random.randint(1, 2) | |
if DEBUG: print('1 to Win: {0}'.format(our_guess)) | |
return our_guess | |
# Increament user most guessed number by 1 and return it. | |
try: | |
counter = Counter(player_answers) | |
except NameError: | |
from collections import Counter | |
finally: | |
counter = Counter(player_answers) | |
if (len(player_answers) >= 4 and counter.most_common(1)[0][-1] >= 2 | |
and counter.most_common(1)[0][1] <= 2): | |
our_guess = counter.most_common(1)[0][1] + 1 | |
if DEBUG: print('Common: {0}'.format(our_guess)) | |
return our_guess | |
# Guess number in a lower range. | |
our_guess = random.randint(1, 3) | |
if our_guess == 3: | |
our_guess = random.randint(1, 3) | |
if DEBUG: print('Guess: {0}'.format(our_guess)) | |
if DEBUG: print('End: {0}'.format(our_guess)) | |
return our_guess | |
def compute_score(player_answer, computer_answer, scores): | |
if player_answer + 1 == computer_answer: | |
scores['computer'] += 2 | |
elif computer_answer + 1 == player_answer: | |
scores['player'] += 2 | |
elif player_answer < computer_answer: | |
scores['player'] += 1 | |
elif player_answer > computer_answer: | |
scores['computer'] += 1 | |
return scores | |
def calculate_winner(scores, outcomes): | |
if scores['player'] > scores['computer']: | |
outcomes['player'] += 1 | |
elif scores['computer'] > scores['player']: | |
outcomes['computer'] += 1 | |
else: | |
outcomes['ties'] += 1 | |
return outcomes | |
# run! | |
if __name__ == '__main__': | |
iterations = 100 | |
scores = {'player': 0, 'computer': 0} | |
outcomes = {'player': 0, 'computer': 0, 'ties': 0} | |
player_nums = [] | |
computer_nums = [] | |
for x in range(0, iterations): | |
while scores['player'] < 5 and scores['computer'] < 5: | |
player_answer = base_strategy() | |
computer_answer = computer_strategy( | |
scores, player_nums, computer_nums, iterations, x) | |
player_nums.append(player_answer) | |
computer_nums.append(computer_answer) | |
compute_score(player_answer, computer_answer, scores) | |
calculate_winner(scores, outcomes) | |
scores = {'player': 0, 'computer': 0} | |
player_nums = [] | |
computer_nums = [] | |
print('Results - Player {0}, Computer {1}, Tie {2}'.format( | |
outcomes['player'], outcomes['computer'], outcomes['ties'])) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment