# markov hunter

 Author zacstewart Submission date 2019-09-04 03:44:58.179853 Rating 5165 Matches played 224 Win rate 49.55

Use rpsrunner.py to play unranked matches on your computer.

## Source code:

``````from random import sample, choice
from collections import defaultdict

class Markov(object):
MAX_SUBMOVE = 10
BEATS = {
'R': 'P',
'P': 'S',
'S': 'R'
}

def __init__(self):
self.moves = []
self.reset()

def incrememnt_next_move(self, preceding_moves, move):
if not preceding_moves in self.next_moves:
self.next_moves[preceding_moves] = []
self.next_moves[preceding_moves].append(move)

move = moves[-1]
preceding_moves = tuple(moves[:-1])

self.incrememnt_next_move(preceding_moves, move)

self.moves.append(move)

for n in range(self.MAX_SUBMOVE):
if len(self.moves) > n:

def reset(self):
self.next_moves = {}

# Least likely choice
def choice(self):
candiate_moves = list('RPS')

for n in range(self.MAX_SUBMOVE):
preceding_moves = tuple(self.moves[-(n+2):])

if preceding_moves in self.next_moves:
candiate_moves += self.next_moves[preceding_moves]

freqs = defaultdict(int)
for candiate_move in candiate_moves:
freqs[candiate_move] += 1

return min(freqs, key=freqs.get)

class MarkovHunter(object):

PATTERN_LENGTH = 10
BEATS = {
'R': 'P',
'P': 'S',
'S': 'R'
}

def __init__(self):
pass
self.markov = Markov()
self.pattern = [choice(self.BEATS.keys()) for _ in range(self.PATTERN_LENGTH)]
self.i = 0
self.matches_played = 0

def choice(self):
if self.matches_played > 10:
move = self.markov.choice()
else:
move = self.pattern[self.i]
self.i = (self.i + 1) % self.PATTERN_LENGTH