首页 > 解决方案 > 我该如何改进这个猜测算法?

问题描述

我正在尝试做一个程序来猜测用户认为的单词,但现在该程序仅基于消除。有没有人知道如何让它变得更好?

以下是关于它现在如何工作的简要说明:

我有一个存储在“palavras.txt”中的单词列表,然后将这些单词转换为常规列表。

第一个问题是:“你的单词有多少个字母?”。基于此,程序继续消除所有其他字母数量不同的单词。之后,它会创建一个列表,其中包含按出现在给定位置的次数组织的所有字母。

然后我们有第二个问题:“字母“x”是你单词的第一个字母吗?”。如果响应为“不是”,则删除该位置包含该字母的所有单词,然后转到该位置最常用的第二个字母,依此类推。如果是,它会删除在该特定位置不包含该字母的所有单词并转到该单词的下一个字母。以此类推,直到单词完成。

它一直有效,但有时需要很多次。有更好的方法吗?人工智能?机器学习可能吗?

代码并不重要,因为我只是在寻找想法,但如果有人好奇,我是如何做到的:

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))

标签: python

解决方案


您可以存储已经使用过的单词,例如第一个用户使用单词“carro”,然后您可以将其添加到文件中,在几个字母之后,程序可以检查列表中已经说过的单词,看看是否单词匹配给定的描述,即:“首字母为 ac”,并询问下一个用户“carro”是否是他们的单词,您可以通过为每个单词添加一个计数器来进一步改进这一点,以便更多使用的单词出现在使用较少的词的顶部。


推荐阅读