解决单词搜索并删除找到的字符



这就是问题所在:

要解决这个谜题,你需要搜索,然后从单词搜索中删除列表中所有单词的出现次数(如果有多个(。

将保留的图表中的字母按行和列的顺序全部取下,它们将形成游戏的解决方案。

单词可以水平地出现在图表中(从右到左,或从左到右(、垂直(向下或向下顶部(和对角线(从上到下或从下到上(。

定义一个函数es1(ftxt(,它获取文本文件的地址,包含一个关键谜题的单词图并返回字符串游戏的解决方案。

fname文件包含单词列表后面的单词搜索。图表前面的一系列1行或多行空行将图表与列表分隔开的单词,并在单词列表后面。图表按行记录(每行一行和连续行(每行的选项卡由一个字符('\t'(分隔。连续繁忙单词的列表,每行一个单词。

O   T   N   E   G   R   A   S   A   E
R   N   N   C   O   R   A   L   L   O
O   A   I   B   L   U   E   E   V   G
U   T   O   R   E   N   T   I   I   A
V   I   O   L   E   T   T   O   O   R
O   C   R   A   R   I   A   E   L   O
D   A   B   I   M   A   L   V   A   P
I   P   C   I   E   L   O   G   L   R
C   O   R   P   O   S   O   U   A   O
A   P   I   E   N   O   M   I   L   P

ACIDO
ARGENTO
BLU
CIELO
CORALLO
CORPOSO
ELETTRICO
LATTE
LIMONE
MALVA
NERO
OCRA
OPACITA
ORO
PAGLIERINO
PIENO
PORPORA
PRIMITIVO
VIOLA
VIOLETTO

我找到了所有的行、列和50%的对角线,但我不知道如何找到在各个方向上找到的字符的坐标来删除它,然后找到解决方案。

这是我的代码:

with open('cp5_Colori.txt', 'r') as f:
data=f.read().replace("t","")
data=data.split("nn")
lista_parole=data[1].split()
lista_orizzontale=data[0].split()
oriz_contraria=[x[::-1] for x in lista_orizzontale]
diz={}
c=0
b=0
cruzi_verticali=[]
for x in lista_parole:                  #loop to find rows and add the 
found 
words to a diz
for y in lista_orizzontale:
if x in y:
diz[x]=1
for z in oriz_contraria:
if x in z:
diz[x]=1
while c <= len(lista_orizzontale):
cruzi_verticali.append(lista_orizzontale[c][b])     #loop for 
columns
c+=1
if c==len(lista_orizzontale):
cruzi_verticali.append("///")
c=0
b+=1
if b==len(lista_orizzontale):
c=len(lista_orizzontale)+1


joinata="".join(cruzi_verticali)
parole_verticali=joinata.split("///")
vert_contraria=[k[::-1] for k in parole_verticali]    #convert to a list 
of 
strings and find 
the 
reversed of 
colums
conta=0
conta2=0

for x in lista_parole:
for y in parole_verticali:
if x in y:                          #loop to add search word to  
the diz
diz[x]=1
for z in vert_contraria:
if x in z:
diz[x]=1

cruzi_diagonali=[]            
parole_diagonali=[]
diag_contraria=[]            
prova=[]            
itera=len(parole_verticali)**2            
while len(prova)!=len(parole_verticali)-1:
cruzi_diagonali.append(parole_verticali[conta][conta2])        
conta+=1
conta2+=1
if conta==len(lista_orizzontale):
cruzi_diagonali.append("///")                                    
#loop to find a part of 
diagonals
if conta==len(parole_verticali)-1:
conta=0
if conta==0:
prova.append(0)
conta=conta+len(prova)
conta2=0
prova2=[]            
conta3=0
conta4=1
while len(prova2)!=len(parole_verticali)-1:
cruzi_diagonali.append(parole_verticali[conta3][conta4])
conta3+=1
conta4+=1
if conta4==len(lista_orizzontale):
cruzi_diagonali.append("///")
#loop to find lower 
diagonals
if conta4==len(parole_verticali)-1:
conta4=0
if conta4==0:
prova2.append(0)
conta4=conta4+len(prova2)
conta3=0
joinata2="".join(cruzi_diagonali)
parole_diagonali=joinata2.split("///")               #convert diagonals 
into 
a list of strings
diag_contraria=[k[::-1] for k in parole_diagonali]   
for x in lista_parole:
for y in set(parole_diagonali):
if x in y:                          #loop to add the found words in 
the dictionary as keys
diz[x]=1
for z in set(diag_contraria):
if x in z:
diz[x]=1
soluzione=[]            
lista_totale=[]
lista_orizzontale2=lista_orizzontale[:]
for k in diz.keys():
for k2 in lista_orizzontale2:             #all the found words in 
the 
row replaced with "*"
if k in k2:
hg=len(k)*"*"
k3=k2.replace(k,hg)
lista_orizzontale2.append(k3)
if "*" not in k2:
lista_orizzontale2.remove(k2)

有人能帮我在单词搜索中找到所有字母的坐标吗?

你让事情变得相当困难。与其在每个方向上变换拼图,不如依次访问每个字母,并从这个字母开始在八个方向中的每一个方向上寻找单词。

由于这似乎是某种家庭作业,我将让您填写详细信息,但您的代码的基本轮廓应该是这样的:

puzzle = [list(row) for row in 'OTNEGRASAE', 'RNNCORALLO', 'OAIBLUEEVG',
'UTORENTIIA', 'VIOLETTOOR', 'OCRARIAELO', 'DABIMALVAP', 'IPCIELOGLR',
'CORPOSOUAO', 'APIENOMILP']
word_list = ['ACIDO', 'ARGENTO', 'BLU', 'CIELO', 'CORALLO', 'CORPOSO', 'ELETTRICO',
'LATTE', 'LIMONE', 'MALVA', 'NERO', 'OCRA', 'OPACITA', 'ORO', 'PAGLIERINO',
'PIENO', 'PORPORA', 'PRIMITIVO', 'VIOLA', 'VIOLETTO']
for {each word in word_list}:
for {each cell in puzzle}:
if {cell.upper() == first character of word}:
for direction in [(1,0),(1,1),(0,1),(-1,1),(-1,0),(-1,-1),(0,-1),(1,-1)]:
(dx, dy) = direction
{Does the puzzle contain all the other characters of word in this direction?}
{If so change these cells to lower case, and skip to next word}
{extract all the remaining upper case letters from the puzzle}

这是我根据您的想法编写的新代码:

with open('cp5_Colori.txt', 'r') as f:
import pprint
data=f.read().replace("t","")
A=[]
data=data.split("nn")
word_list=data[1].split()
lista_orizzontale=data[0].split()
puzzle=[list(row) for row in lista_orizzontale]
for parola in word_list:
for lista in puzzle:
x=puzzle.index(lista)
for carattere in lista:
y=lista.index(carattere)
if carattere.upper() == parola[0]:
for direction in [(1,0),(1,1),(0,1),(-1,1),(-1,0),(-1,-1),(0,-1),(1,-1)]:
(dx, dy) = direction
for i in range(len(parola)):    
if ((puzzle[x+dx*i][y+dy*i].upper()== parola[i]) and ((x+dx*i)<len(puzzle)) and ((y+dy*i)<len(lista))) == True: 
A.append(puzzle[x+dx*i][y+dy*i])
if "".join(A)==parola:

else:
break
pprint.pprint(puzzle)

此处

我不是为了找到解决办法才去抢救的。解决方案应该是"sangueblu"怎么了?

最新更新