Как создать поисковую сетку для слов, которая позволяет словам использовать одну и ту же букву

Я пытаюсь сделать сетку для поиска слов со списком заданных слов. Моя проблема в том, что некоторые слова не отображаются должным образом.

Я обновил код, см. Ниже

Я попытался исправить предыдущую ошибку, и теперь я получаю ошибку вне диапазона, которую я не могу исправить, если кто-то может помочь, я был бы признателен

Примечание 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   .
. . . . . . . . .
. . . . . . . . .

Вы видите, что происходит: вы пишете слишком далеко, и вы сталкиваетесь с существующими записями.

РЕШЕНИЕ

Я рекомендую вам следовать тому, что я сделал до сих пор: инициализировать какое-то не-письмо, которое вам легко читать. Теперь, прежде чем вводить слово в сетку, проверьте, что путь свободен. Еще лучше, если вы хотите писать между предыдущими словами, если пересекающиеся буквы совпадают.

После того, как вы разместили все слова из списка, заполните всю сетку.

Другие вопросы по тегам