Matrices in python

Asked

Viewed 483 times

0

I have to make a program that receives an array of letters a number of words to be searched in the matrix and the words themselves, for example:

u l i o a e a p b e a r y l s j i t u a e e h u b e u o r r c t n e p b i o s b 1 python

and the program should return:

. . . . . . . p . . . . y . . . . t . . . . h . . . . o . . . . n . . . . . . .

but I can not think of an efficient way to find the n letters of the word in the matrix and mark the indices, I had thought to search letter by letter in the matrix but I could not finish, I also saw the function enumerate but I did not succeed in applying.

1 answer

1

The question is not exactly trivial. One way to check whether the words are contained in the columns is to use zip to take a letter from each column and form column strings:

# Criar lista de palavras e matriz
palavras = ['python', 'hub']

matriz = \
"""u l i o a
e a p b e
a r y l s
j i t u a
e e h u b
e u o r r
c t n e p
b i o s b"""

# Pegar linhas da matriz e remover espaços
linhas = [linha.replace(' ', '') for linha in matriz.split('\n')]
print(linhas)  # ['ulioa', 'eapbe', 'aryls', ...]

# Usamos zip pra pegar uma letra de cada linha e join
# pra formar uma string pra cada coluna
colunas = [''.join(coluna) for coluna in zip(*linhas)]
print(colunas)  # ['ueajeecb', 'larieuti', 'ipythono' ...]

# Criamos um set pra guardar a posição das letras que
# vamos mostrar na representação final.
letras_a_mostrar = set()

# Pra cada palavra na nossa lista de palavras a procurar,
# vemos se a palavra está em uma das linhas ou colunas.
# Se estiver, adicionamos a posição de todas as letras
# da palavra ao set letras_a_mostrar.
for palavra in palavras:

    # Pra cada linha na matriz...
    for y, linha in enumerate(linhas):
        # Se a palavra que estamos verificando estiver
        # na linha...
        if palavra in linha:
            # Encontrar a posição de início e fim da palavra na linha
            comeco_palavra = linha.find(palavra)
            fim_palavra = linha.find(palavra) + len(palavra)
            # Adicionar as posições de início, fim, e intermediárias
            for x in range(comeco_palavra, fim_palavra):
                letras_a_mostrar.add((x, y))

    # Fazer a mesma coisa pra colunas da matriz.
    # Como temos um set, não importa se tentarmos
    # adicionar posições duplicadas (se duas palavras se
    # cruzarem)
    for x, coluna in enumerate(colunas):
        if palavra in coluna:
            comeco_palavra = coluna.find(palavra)
            fim_palavra = coluna.find(palavra) + len(palavra)
            for y in range(comeco_palavra, fim_palavra):
                letras_a_mostrar.add((x, y))

print(letras_a_mostrar)  # {(2, 6), (4, 4), (2, 1), ... ]

# Pra apresentar o resultado destacado, iteramos sob
# as posições x, y da matriz e printamos a letra da
# posição se ela estiver na lista de letras a mostrar
for y in range(len(linhas)):
    for x in range(len(linhas[y])):
        if (x, y) in letras_a_mostrar:
            print(linhas[y][x] + ' ', end='')
        else:
            print('. ', end='')
    print('')  # Linha nova

# . . . . .
# . . p . .
# . . y . .
# . . t . .
# . . h u b
# . . o . .
# . . n . .
# . . . . .

Browser other questions tagged

You are not signed in. Login or sign up in order to post.