-
Notifications
You must be signed in to change notification settings - Fork 0
/
Agent.py
101 lines (82 loc) · 4.16 KB
/
Agent.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import math
class Agent:
def __init__(self, letras_nao, letras_sim, tamanho_palavra):
self.letras_nao = letras_nao # letras q nao sao parte da resposta do hangman
self.letras_sim = letras_sim # letras q sao parte da resposta do hangman
self.tamanho_palavra = tamanho_palavra # tamanho da palavra a ser adivinhada
self.palavra = ['_' for i in range(tamanho_palavra)]
def escolher_letra(self):
with open('wordlist.txt', 'r') as f:
wordlist = f.read().splitlines()
wordlist = [word for word in wordlist if len(word) == self.tamanho_palavra]
# precisamos descartar as palavras que contem as letras que ja sabemos q nao sao parte da resposta
for letter in self.letras_nao:
wordlist = [word for word in wordlist if letter not in word]
# precisamos descartar as palavras que nao contem as letras que ja sabemos q sao parte da resposta no lugar certo
for idx in range(self.tamanho_palavra):
if self.palavra[idx] != '_':
wordlist = [word for word in wordlist if word[idx] == self.palavra[idx]]
# faremos uma decisao de qual letra escolher baseado na frequencia de cada letra
# na wordlist
# para isso, criaremos um dicionario com a frequencia de cada letra
frequencia_letras = {}
for word in wordlist:
for letter in word:
if letter in frequencia_letras:
frequencia_letras[letter] += 1
else:
frequencia_letras[letter] = 1
# agora, vamos ordenar as letras por frequencia
frequencia_letras = sorted(frequencia_letras.items(), key=lambda x: x[1], reverse=True)
# e retornar a letra mais frequente que nao esteja na lista de letras que ja sabemos
for letter in frequencia_letras:
if letter[0] not in self.letras_sim and letter[0] not in self.letras_nao:
return letter[0]
# se nao houver nenhuma letra que nao sabemos, retornamos a letra mais frequente
return frequencia_letras[0][0]
def escolher_letra_entropia(self):
with open('wordlist.txt', 'r') as f:
wordlist = f.read().splitlines()
wordlist = [word for word in wordlist if len(word) == self.tamanho_palavra]
for letter in self.letras_nao:
wordlist = [word for word in wordlist if letter not in word]
for idx in range(self.tamanho_palavra):
if self.palavra[idx] != '_':
wordlist = [word for word in wordlist if word[idx] == self.palavra[idx]]
frequencia_letras = {}
total_letras = 0
for word in wordlist:
for letter in word:
total_letras += 1
if letter in frequencia_letras:
frequencia_letras[letter] += 1
else:
frequencia_letras[letter] = 1
# Calcular a probabilidade de cada letra
probabilidade_letras = {letter: freq / total_letras for letter, freq in frequencia_letras.items()}
# Calcular a entropia de cada letra
entropia_letras = {letter: -prob * math.log2(prob) for letter, prob in probabilidade_letras.items()}
entropia_letras = {k: v for k, v in sorted(entropia_letras.items(), key=lambda item: item[1], reverse=True)}
print("Entropia de cada letra:", entropia_letras)
frequencia_letras = sorted(frequencia_letras.items(), key=lambda x: x[1], reverse=True)
for letter in frequencia_letras:
if letter[0] not in self.letras_sim and letter[0] not in self.letras_nao:
return letter[0]
return frequencia_letras[0][0]
def receber_feedback(self, letra, feedback):
try:
if feedback != []:
self.letras_sim.append(letra)
for idx in feedback:
self.palavra[idx] = letra
else:
self.letras_nao.append(letra)
except:
# jogo acabou
pass
def palavra_completa(self):
if '_' not in self.palavra:
# list to string
return ''.join(self.palavra)
else:
return False