所以我开始了一个项目,主要是测试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()
答案 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()
您可以通过更改以下值来更改单词的min
和max
长度: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}
可能有更快的计算方法,但我认为这样可以保持简单。