Python 如何改进这种猜测算法?
我正试图做一个程序,猜测用户所想的单词,但现在这个程序只是基于消除。有人对如何使它更好有想法吗 下面简要介绍一下它现在的工作原理: 我有一个单词列表存储在“palavras.txt”中,然后将这些单词转换成一个常规列表 第一个问题是:“你的单词有多少字母?”。在此基础上,程序继续删除所有其他字母数量不相同的单词。然后,它创建一个列表,其中包含按字母在给定位置出现的次数组织的所有字母 然后我们有第二个问题:“字母“x”是你单词的第一个字母吗?”。如果响应为“not”,则删除该位置包含该字母的所有单词,然后转到该位置中使用最多的第二个字母,依此类推。如果是,它将删除在该特定位置不包含该字母的所有单词,并转到该单词的下一个字母。等等,直到单词完成 它一直在工作,但有时需要很多时间。有更好的方法吗?人工智能?也许是机器学习 代码并不重要,因为我只是在寻找想法,但如果有人好奇我是如何做到的:Python 如何改进这种猜测算法?,python,Python,我正试图做一个程序,猜测用户所想的单词,但现在这个程序只是基于消除。有人对如何使它更好有想法吗 下面简要介绍一下它现在的工作原理: 我有一个单词列表存储在“palavras.txt”中,然后将这些单词转换成一个常规列表 第一个问题是:“你的单词有多少字母?”。在此基础上,程序继续删除所有其他字母数量不相同的单词。然后,它创建一个列表,其中包含按字母在给定位置出现的次数组织的所有字母 然后我们有第二个问题:“字母“x”是你单词的第一个字母吗?”。如果响应为“not”,则删除该位置包含该字母的所有单
import os
from unicodedata import normalize
import random
import string
# Define a função que retira os acentos das palavras
def remover_pont(txt):
import string
return txt.translate(str.maketrans('', '', string.punctuation))
def remover_acentos(txt):
return normalize('NFKD', txt).encode('ASCII', 'ignore').decode('ASCII')
# Retorna uma lista com as letras mais usadas naquela posição, em ordem
def letramusada(lista, pletra):
pletraordem = []
pletraordem2 = []
pl = []
for n in lista:
try:
pl.append(n[pletra - 1])
except:
pass
dict = {}
for k in pl:
if k in dict:
dict[k] += 1
else:
dict[k] = 1
pletraordem2 = (sorted(dict.items(), key=lambda t: t[1], reverse=True))
for c in pletraordem2:
pletraordem.append(c[0])
return pletraordem
# Lê o "banco de dados" que contém as palavras e as armazena na variável "palavras", sem acentos
file = open('palavras.txt')
palavras = file.read().split("\n")
# Armazena a quantidade de letras que a palavra pensada tem
nletras = int(input('Digite o número de letras da palavra (considerando hífen, caso haja) que você pensou, com máximo de 8: '))
# Declara listas que serão usadas em seguida
npalavras = []
palavras2 = []
palavras3 = []
# Armazena todas as palavras que contém a quantidade de letras escolhida anteriormente em uma nova lista chamada "nletras", desconsiderando pontos
for n in palavras:
if nletras == len(n):
npalavras.append(remover_acentos(n).lower())
c = 0
n = 0
for k in range(1, nletras + 1):
ordem = letramusada(npalavras, k)
cond = 0
try:
while cond == 0:
if len(npalavras) < 20 and c == 0:
print("\nHmmm, estou chegando perto!\n")
c += 1
if len(npalavras) < 3:
break
for c in ordem:
if c != 0:
r = str(input("A {} letra da sua palavra é a letra \"{}\"? [S/N] ".format(k, c))).lower()
r = r[0]
if r == "s":
for n in npalavras:
if n[k-1] == c:
palavras2.append(n)
npalavras.clear()
npalavras = palavras2[:]
palavras2.clear()
ordem.clear()
cond += 1
break
else:
for n in npalavras:
if n[k-1] != c:
palavras2.append(n)
npalavras.clear()
npalavras = palavras2[:]
palavras2.clear()
r = 0
pass
except:
n = 1
print("\nDesculpe, não achei nenhuma palavra :(")
escolha = random.choice(npalavras)
if n != 0:
print("\nA palavra que você pensou é: \"{}\"".format(escolha))
导入操作系统
从Unicode数据导入规范化
随机输入
导入字符串
#定义一个有趣的宫殿
def去除器(txt):
导入字符串
返回txt.translate(str.maketrans('','',string.parantion))
def清除器(txt):
返回normalize('NFKD',txt)。encode('ASCII','ignore')。decode('ASCII'))
#我们的目标是让我们的目标实现
def letramusada(lista,pletra):
pletraordem=[]
pletraordem2=[]
pl=[]
对于lista中的n:
尝试:
pl.append(n[pletra-1])
除:
通过
dict={}
对于pl中的k:
如果在dict中为k:
dict[k]+=1
其他:
dict[k]=1
pletraordem2=(已排序(dict.items(),key=lambda t:t[1],reverse=True))
对于pletraordem2中的c:
pletraordem.append(c[0])
回程折叠式
#Lêo“护墙板银行”将其视为宫殿,如armazena variável“宫殿”,sem acentos
文件=打开('palavras.txt')
palavras=file.read().split(“\n”)
#阿玛泽纳是一个数量巨大的宫殿
nletras=int(输入('Digite o número de letras da palavra(considerando hífen,caso haja)que vocêpensou,comáximo de 8:'))
#《宣言》是一部非常成功的作品
npalavras=[]
palavras2=[]
palavras3=[]
#阿玛泽纳·托达斯(Armazena todas)是一座宫殿,它是一座由兰多·庞托斯(desconsiderando pontos)设计的“新城市”的前卫建筑
对于palavras的n:
如果nletras==len(n):
npalavras.append(remover\u acentos(n.lower())
c=0
n=0
对于范围(1,nletras+1)内的k:
ordem=letramusada(npalavras,k)
cond=0
尝试:
当cond==0时:
如果len(npalavras)<20且c==0:
打印(“\nHmmm,estou chegando perto!\n”)
c+=1
如果len(npalavras)<3:
打破
对于ordem中的c:
如果c!=0:
r=str(输入(“A{}letra da sua palavraéA letra\“{}\”?[S/N]”。格式(k,c))。下()
r=r[0]
如果r==“s”:
对于n,在npalavras中:
如果n[k-1]==c:
palavras2.append(n)
npalavras.clear()
npavras=palavras2[:]
palavras2.clear()
ordem.clear()
cond+=1
打破
其他:
对于n,在npalavras中:
如果n[k-1]!=c:
palavras2.append(n)
npalavras.clear()
npavras=palavras2[:]
palavras2.clear()
r=0
通过
除:
n=1
印刷品(“\n斯库普,não achei nenhuma palavra:(”)
escolha=随机选择(npalavras)
如果n!=0:
打印(“\nA palavra que vocêpensoué:\”{}\”.格式(escolha))
您可以存储已经使用过的单词,比如说第一个用户使用了单词“carro”,然后您可以将其添加到一个文件中,在几个字母之后,程序可以检查列表中已经说过的单词,查看单词是否与给定的描述相匹配,即:“第一个字母是c”,并询问下一个用户是否为“carro”如果是他们的话,你可以通过在每个单词上添加一个计数器来进一步改进,这样使用较多的单词就会出现在使用较少的单词之上。暴力就是你的朋友。
人们可能会认为“机器学习”是一颗灵丹妙药,但是,学习什么?特别是当提供的信息很少的时候。你能优化什么?你的描述听起来像一股纯粹的蛮力,而生活在今天的黑客正是支持这一点的
这可能有点离题,但即使有一个GPU,搜索也会很困难。如果您不受特定语言/平台的限制,上面指向hashcat的链接很有用。在MacBookPro上,可以在5分钟内列举出著名的内容,这比Python中的猜测功能强大得多
搜索空间和单词模式
另外一个是大约8,这种情况与典型的密码非常相似。也就是说,你的搜索空间很大-上限是26^8=208827064576个单词!-只是玩家只能在游戏中使用有限的单词列表
实际的搜索空间可能会小一些,因为英语单词中有模式(例如s
是最常见的字母表,ae