Как создать поисковую сетку для слов, которая позволяет словам использовать одну и ту же букву
Я пытаюсь сделать сетку для поиска слов со списком заданных слов. Моя проблема в том, что некоторые слова не отображаются должным образом.
Я обновил код, см. Ниже
Я попытался исправить предыдущую ошибку, и теперь я получаю ошибку вне диапазона, которую я не могу исправить, если кто-то может помочь, я был бы признателен
Примечание 1: я не включил все функции программы, при необходимости я включу их позже
Программа принимает текстовый файл следующим образом:
9 9 white black blue green pink yellow red grey purple
где первые 2 числа в файле - это размеры сетки, а остальные - слова для размещения в сетке.
import random
import string
fi=input('Insert the entry file name(entry.txt): ')
fo=input('Insert the exit file name(.txt): ')
grid_size=[]
words=[]
matrix=[]
def read_file(storage):
file=open(storage)
n=file.readline()
lista=n.split()
lista=list(map(int,lista)) #sets the size of the grid
for i in lista:
grid_size.append(i)
for line in file:
line=line.replace("\n","")
words.append(line)
file.close()
def grid_generator(grid_size):
n, p = grid_size
for i in range(n):
matriz.append([])
for j in range(p):
matriz[i].append(".")
def sets_word_inside(grid_size, word, grid):
n, p = grid_size
word = random.choice([word,word[::-1]])
#horizontal,vertical,diagonal
d = random.choice([[1,0],[0,1],[1,1]])
xsize = n if d[0] == 0 else n - len(word)
ysize = p if d[1] == 0 else p - len(word)
x= random.randrange(0,xsize)
y= random.randrange(0,ytsize) #position
for i, letter in enumerate(word):
char = grid[y+d[1]*i][x+d[0]*i]
if char != " " and char != letter:
# If it reaches an already filled space - restart the process.
# The second condition allow the words that cross with repeated words are created.
return False
grid[y+d[1]*i][x+d[0]*i] = letter[i]
return True
На данный момент вывод кода выглядит примерно так:
9
white
black
blue
green
pink
yellow
red
grey
purple
p w b i t y l d i
p v w o l e e y t
x g a x j r i m g
q i c j b g j e x
s s k g q l g r r
p i n k i o u t r
e l p r u p g e o
l a b l s r p g y
c o r y e u f r x
1 ответ
Я вижу две основные проблемы: вы перезаписываете существующие слова новыми и пишете за пределами фактического слова.
Первая проблема заключается в том, что вы не потрудились искать предыдущие слова, прежде чем добавлять новые. Вторая проблема заключается в том, что вы не можете удалить пробелы из ввода.
Я добавил несколько простых инструментов отладки, чтобы отследить это. Сначала я инициализировал сетку точками вместо букв, чтобы я мог видеть, что происходит:
for j in range(p):
matrix[i].append(".")
Затем я напечатал матрицу после добавления каждого слова:
for i in range(0,len(word)):
grid[y+d[1]*i][x+d[0]*i]=word[i]
print "\nUpdated grid with\t", word, "\n",
for row in range(n):
print " ".join(matrix[row])
return grid
Затем я запустил его и получил этот вывод:
Updated grid with white
. . . . . . . . .
. . . . . . . . .
. w h i t e .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
Updated grid with kcalb
. . . . . . . .
. . . . . . . .
. w h k t e .
. . . . c . . . .
. . . . . a . . .
. . . . . . l . .
. . . . . . . b .
. . . . . . . . .
. . . . . . . . .
Updated grid with blue
. . . . . . . .
. . b . . . . . .
. w h l t e .
. . . . u . . . .
. . . . . e . . .
. . . . . . . .
. . . . . . . .
. . . . . . . . .
. . . . . . . . .
Updated grid with neerg
. . . . . . .
. b . . . . . .
. w n l t e .
. . . e u . . . .
. . . . e e . . .
. . . . . r . .
. . . . . . g .
. . . . . . . . .
. . . . . . . . .
Вы видите, что происходит: вы пишете слишком далеко, и вы сталкиваетесь с существующими записями.
РЕШЕНИЕ
Я рекомендую вам следовать тому, что я сделал до сих пор: инициализировать какое-то не-письмо, которое вам легко читать. Теперь, прежде чем вводить слово в сетку, проверьте, что путь свободен. Еще лучше, если вы хотите писать между предыдущими словами, если пересекающиеся буквы совпадают.
После того, как вы разместили все слова из списка, заполните всю сетку.