游戲鏈接:https://www.powerlanguage.co.uk/wordle/
年前同學(xué)給我安利了一款猜字游戲,該游戲每天會(huì)指定5位字母單詞謎底,玩家有6次機(jī)會(huì)猜中這個(gè)單詞鸠珠。如果字母在謎底中出現(xiàn)且位置對(duì)了就顯示綠色,字母出現(xiàn)了但位置不對(duì)就顯示黃色秋麸,字母在答案的單詞中沒(méi)出現(xiàn)就顯示灰色渐排。
我屬于人菜癮大,單詞量本就薄弱灸蟆,被這些生僻單詞折磨的死去活來(lái)驯耻,我是怒了,反正玩不起就耍流氓炒考,天下武功唯窮舉不破可缚,用代碼暴力破解吧。
一斋枢、代碼思路
1帘靡、找到一份英文單詞詞庫(kù),我把詞庫(kù)分享到網(wǎng)盤(pán)瓤帚。
鏈接:https://pan.baidu.com/s/1lvHw28i9NMxtXuEJkFP3YQ
提取碼:6666
2描姚、對(duì)詞庫(kù)進(jìn)行預(yù)處理涩赢,刪除有標(biāo)點(diǎn)符號(hào)的單詞、統(tǒng)一單詞的大小寫(xiě)轩勘。
3筒扒、依次猜詞:每次猜詞時(shí)盡量保證選擇的單詞的字母是不重復(fù)的,這樣能保證最大化試錯(cuò)概率绊寻;每次猜詞根據(jù)反饋的顏色縮小單詞詞庫(kù)花墩,然后每次從詞庫(kù)中隨機(jī)選擇單詞,選擇的原則還是從重復(fù)單詞數(shù)少的單詞組中選擇一個(gè)榛斯。此外观游,盡可能選擇有元音的單詞,這樣命中率會(huì)高些驮俗。
代碼如下:
## 后面根據(jù)猜中情況篩選:orange懂缕、black、green
def apd_col(color_lst,char,location=0):
color_lst.append([char,location-1])
return color_lst
def select_word_lst(word_lst,org_lst,blk_lst,grn_lst):
next_word_lst = []
for word in word_lst:
org_mark,blk_mark,grn_mark=1,0,1
## 黑名單篩選
for blk_word in blk_lst:
if word.find(blk_word[0])>=0:
blk_mark=1
#綠名單圈選
for grn_word in grn_lst:
if word[grn_word[1]]!=grn_word[0]:
grn_mark=0
#黃名單圈選
for org_word in org_lst:
if word[org_word[1]]==org_word[0] or word.find(org_word[0])==-1:
org_mark=0
if blk_mark==0 and grn_mark==1 and org_mark==1:
next_word_lst.append(word)
return next_word_lst
if __name__=="__main__":
import os
import random
os.chdir(r"C:\Users\bingo\Desktop\wordle")
# 讀取單詞庫(kù)
word_lst=[]
for line in open("data/dic.txt",encoding="utf-8"):
word=line.split("\uf8f5")[0]
if len(word.strip())==5 and word.find("-")<0:
word = word.lower()
word_lst.append(word)
## 第一輪 初始化英文字母:包含元音aeiou王凑、盡可能出現(xiàn)所有字母
init_lst=[]
for word in word_lst:
word=word.lower()
if (word.find("a")>=0 or word.find("e")>=0 or word.find("i")>=0 or word.find("o")>=0 or word.find("u")>=0) and len(set(word))==5 and word.find("-")<0:
init_lst.append(word)
init_word = init_lst[random.randrange(len(init_lst))]
print(init_word)
#第二輪
org_lst,blk_lst,grn_lst=[],[],[] #初始化
blk_lst=apd_col(blk_lst,"p",-1)
blk_lst=apd_col(blk_lst,"a",-1)
blk_lst=apd_col(blk_lst,"s",-1)
blk_lst=apd_col(blk_lst,"t",-1)
blk_lst=apd_col(blk_lst,"e",-1)
grn_lst=apd_col(grn_lst,"e",2)
word_lst_2 = select_word_lst(word_lst,org_lst,blk_lst,grn_lst)
#初始兩輪盡可能多的選出詞匯
#第三輪
org_lst=apd_col(org_lst,"o",1)
org_lst=apd_col(org_lst,"c",3)
blk_lst=apd_col(blk_lst,"r",1)
blk_lst=apd_col(blk_lst,"i",4)
blk_lst=apd_col(blk_lst,"n",5)
word_lst_3 = select_word_lst(word_lst_2,org_lst,blk_lst,grn_lst)
二搪柑、改進(jìn)空間
1、交互做的很垃圾索烹,每次都是在手機(jī)里猜單詞工碾,然后在電腦上根據(jù)反饋結(jié)果輸入到單詞組中,不過(guò)我是不想改了百姓,代碼能用就行渊额。
2、猜中的單詞輪數(shù)略多垒拢,平均要四-五輪旬迹,我看網(wǎng)上有人能做到三輪,我感覺(jué)深深的慚愧求类,這道題就是極大似然概率知識(shí)點(diǎn)的典型應(yīng)用奔垦,話說(shuō)用上算法得多花半天時(shí)間,我是沒(méi)有折騰的勁了尸疆,有緣人看到可以嘗試下椿猎。思路就是每個(gè)單詞之間是有一定相關(guān)概率,每次猜詞時(shí)可以根據(jù)反饋的情況寿弱,選擇詞庫(kù)中單詞中出現(xiàn)概率最高的即可犯眠。