Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何改进这种猜测算法?_Python - Fatal编程技术网

Python 如何改进这种猜测算法?

Python 如何改进这种猜测算法?,python,Python,我正试图做一个程序,猜测用户所想的单词,但现在这个程序只是基于消除。有人对如何使它更好有想法吗 下面简要介绍一下它现在的工作原理: 我有一个单词列表存储在“palavras.txt”中,然后将这些单词转换成一个常规列表 第一个问题是:“你的单词有多少字母?”。在此基础上,程序继续删除所有其他字母数量不相同的单词。然后,它创建一个列表,其中包含按字母在给定位置出现的次数组织的所有字母 然后我们有第二个问题:“字母“x”是你单词的第一个字母吗?”。如果响应为“not”,则删除该位置包含该字母的所有单

我正试图做一个程序,猜测用户所想的单词,但现在这个程序只是基于消除。有人对如何使它更好有想法吗

下面简要介绍一下它现在的工作原理:

我有一个单词列表存储在“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