Python:努力学习如何制作单词猜测程序

时间:2017-05-17 14:06:05

标签: python

所以我开始了一个项目,主要是测试PC计算这些东西的速度。这个想法是用户输入了一个单词,计算机将系统地运行所有可能性,直到它猜到这个单词。例如a-z并且一旦它击中它就会启动aa,ab,ac ......等。显然只需要一个字母就可以使用它而不是问题,但是有两个字母证明是非常困难的。任何帮助,将不胜感激。

def main_menu():

    #Initial menu print and input
    menu = ("""
    0: Exit
    1: Brute Force No Lock
    """)
    choice = int(input(menu))

    #Loop to catch invalid input, requests further input
    while choice != 1 and choice != 0:
        print("Choice Invalid, Please Try Again")
        choice = int(input(menu))

    #If statments to decide what to do with input
    if choice==1:
        brute_force_no_lock()
    elif choice==0:
        exit()

def brute_force_no_lock():
    letters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]

    toCrack = input("Please enter the word for the computer to crack: ")

    counter = 0

    cur_guess = []

    def repeater(letters, toCrack):
        counter = 0
        for x in letters:
            cur_guess = letters[counter]
            counter += 1
            print(cur_guess)
            if cur_guess == toCrack:
                print ("Cracked, Your Word Was", cur_guess)
                break

    repeater(letters, toCrack)

main_menu()

3 个答案:

答案 0 :(得分:0)

查看

itertools.combinations_with_replacement(iterable, r)

  

从输入 iterable 返回元素的 r 长度子序列   允许单个元素重复多次。

     

组合以字典排序顺序发出。所以,如果输入   对iterable进行排序,组合元组将按排序生成   顺序。

     

根据元素的位置而不是元素,将元素视为唯一元素   值。因此,如果输入元素是唯一的,则生成组合   也将是独一无二的。

所以要获得所有2个字母组合:

>>> import itertools
>>> letters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
>>> for word in itertools.combinations_with_replacement(letters, 2):
        print("".join(word), end=" ")

aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz mm mn mo mp mq mr ms mt mu mv mw mx my mz nn no np nq nr ns nt nu nv nw nx ny nz oo op oq or os ot ou ov ow ox oy oz pp pq pr ps pt pu pv pw px py pz qq qr qs qt qu qv qw qx qy qz rr rs rt ru rv rw rx ry rz ss st su sv sw sx sy sz tt tu tv tw tx ty tz uu uv uw ux uy uz vv vw vx vy vz ww wx wy wz xx xy xz yy yz zz 

在以r=1开头并增加r的循环中包装它应该会引导您最终破解这个词。

提示:现在您只生成较低字母的组合,但允许任何输入作为单词。这可能导致无限循环。在开始“破解”它之前,你应该考虑对输入进行消毒。

答案 1 :(得分:0)

这是另一种方法:

from itertools import product
import string

def allwords(chars, length):
    for letters in product(chars, repeat=length):
        yield ''.join(letters)

def main():
    letters = string.ascii_lowercase
    for wordlen in range(0, 10):
        for word in allwords(letters, wordlen):
            print(word)

if __name__=="__main__":
    main()

您可以通过更改以下值来更改单词的minmax长度:for wordlen in range(min, max):

输出:

a
b
c
d
e
.
.
.
zzzzzzzzzz

答案 2 :(得分:0)

突然出现在我脑海中的方法 -

将猜测字母存储为数组ascii值。从97-122增加arr [0],然后增加arr [1]一次,然后重复。从ascii转换为字符串以进行成功检查。我认为转换很便宜。

字="你好"

ARR {104,101,108,108,111,0,0,0,0,0}

可能有更快的计算方法,但我认为这样可以保持简单。