Ir para conteúdo
Fórum Script Brasil
  • 0

Ajuda com Programa


dfop02

Pergunta

Preciso desenvolver um programa que gere uma matriz ixj usando i e j como entrada, e que todos os números dessa matriz sejam de 10 a 99 sem repetição.

Dessa parte eu consegui gerar toda a matriz, porém os números ainda estão se repetindo.

eu usei: 

for k in range(lin):
    matriz.append(random.sample(range(10, 99), col))
    
for i in matriz:
    for j in i:
        print(j, end=' ')
    print(" ")
aparentemente ele só gera números aleatórios sem repetição por linha, ele produz uma linha sem repetição e quando vai produzir a outra leva em conta 
todo os números, inclusive os que já foram usado, não consegui ajeitar =/

Após isso eu preciso fazer com que o programa leia todos os valores dessa matriz e retorne o seguinte:

se o numero for menor que todos os seus 8 vizinhos, então imprima essa matriz 3x3, aqui que é o problema, não consegui nenhuma forma de fazer isso a não ser manualmente, e mesmo manualmente não funciona direito. Tentei assim:

if matriz[1][1] < matriz[0][0] and matriz[0][1] and matriz[0][2] and matriz[1][0] and matriz[1][2] and matriz[2][0] and\
        matriz[2][1] and matriz[2][2]:
    for i in matriz[0:3]:
        for j in i[0:3]:
            print(j, end=' ')
        print(" ")

Preciso que seja automatico, afinal os números de i e j podem variar, se for por exemplo 5x6 ele teria de conferir 12 números (que ficam no interior da matriz) e caso algum deles seja menor imprimir uma matriz 3x3, sendo ele o item central dessa matriz. Alguem pode me ajudar? Espero que não tenha ficado complicado de entender..

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Consegui fazer assim:

import random

lin = 8
col = 8
matriz = []

""" Gera a matriz com números aleatórios entre 10 e 99 sem repetição """
numsrand = random.sample(range(10, 100), lin * col)
for i in range(lin):
    matriz.append(numsrand[ i*col : i*col + col ])

""" Identifica e imprime as matrizes 3x3 """
for i in range(1, lin-1):
    """ Note que não precisamos verificar as bordas da matriz """
    for j in range(1, col-1):
        """ Abaixo formamos uma lista de listas que contém números da 
            submatriz 3x3 que sejam menores que o centro da submatriz """
        numsmaiores = [[k for k in l[j-1:j+2] if k < matriz[i][j]] for l in matriz[i-1:i+2]]
        """Se não houver nenhum número menor:"""
        if numsmaiores == [[],[],[]]:
            """Obtemos e imprimimos a submatriz 3x3"""
            submatriz = [[k for k in l[j-1:j+2]] for l in matriz[i-1:i+2]]
            for m in submatriz:
                print(*m)
            print("")

 

Editado por isrnick
Link para o comentário
Compartilhar em outros sites

  • 0
Em 06/03/2017 at 20:17, isrnick disse:

Consegui fazer assim:


import random

lin = 8
col = 8
matriz = []

""" Gera a matriz com números aleatórios entre 10 e 99 sem repetição """
numsrand = random.sample(range(10, 100), lin * col)
for i in range(lin):
    matriz.append(numsrand[ i*col : i*col + col ])

""" Identifica e imprime as matrizes 3x3 """
for i in range(1, lin-1):
    """ Note que não precisamos verificar as bordas da matriz """
    for j in range(1, col-1):
        """ Abaixo formamos uma lista de listas que contém números da 
            submatriz 3x3 que sejam menores que o centro da submatriz """
        numsmaiores = [[k for k in l[j-1:j+2] if k < matriz[i][j]] for l in matriz[i-1:i+2]]
        """Se não houver nenhum número menor:"""
        if numsmaiores == [[],[],[]]:
            """Obtemos e imprimimos a submatriz 3x3"""
            submatriz = [[k for k in l[j-1:j+2]] for l in matriz[i-1:i+2]]
            for m in submatriz:
                print(*m)
            print("")

 

Poxa muitissimo obrigado, mas deixe-me tirar algumas duvidas:

1 - pode pode explicar mais detalhadamente como fez a parte do numsmaiores? estava sendo minha maior dificuldade.

2 - Na primeira parte eu havia pensado em por todos os numeros em um vetor e depois puxar os vetores por linha, mas não consegui escrever dessa forma, olhando o seu parece que você pensou o mesmo que eu só que conseguiu escreve-lo, pode me explicar tambem a linha a baixo do "For i in range(lin)", por favor.

 

Obrigado por tudo =)

Editado por dfop02
Link para o comentário
Compartilhar em outros sites

  • 0

Obs: Só para clarificar a explicação abaixo se eu escrever "lista de listas" entenda "matriz", e "vetor" é o mesmo que "lista".

 

Bom, primeiro é preciso entender que em Python todo objeto sequencial pode ser fatiado, o que é o caso de listas.

E a notação para fatiar é assim variavel[inicio:fim] ou variavel[inicio:fim:passo], onde início indica a posição onde a fatia começa incluindo a própria posição, fim indica até onde a fatia vai mas sem incluir a posição fim, e passo indica o incremento usado para iterar sobre as posições do objeto sequencial.

Veja alguns exemplos rodados no terminal abaixo:

>>> lista = [11, 12, 13, 14, 15]

Uma fatia contendo as posições 1, 2 e 3 da lista:
>>> lista[1:4]
[12, 13, 14]

Podemos omitir o inicio quando queremos partir do 
começo da lista:
>>> lista[:3]
[11, 12, 13]
>>> lista[:2]
[11, 12]

Ou então omitir o fim para ir até o final da lista:
>>> lista[3:]
[14, 15]

Logo os dois métodos abaixo poderiam ser usados para
indicar a lista inteira:
>>> lista[0:5]
[11, 12, 13, 14, 15]
>>> lista[:]
[11, 12, 13, 14, 15]

E também podemos mudar o passo, que por padrão é 1,
para outro valor:
>>> lista[0:5:2]
[11, 13, 15]
>>> lista[::2]
[11, 13, 15]

E também podemos usar valores negativos, sendo a última
posição da lista -1 e ficando mais negativo a cada avanço
para a esquerda:
>>> lista[-2:]
[14, 15]

E com passo negativo podemos avançar no sentido oposto,
ou seja da direita para a esquerda, invertendo a lista:
>>> lista[::-1]
[15, 14, 13, 12, 11]

Também é possível atribuir valores para uma fatia do objeto, se o objeto não for imutável, assim você pode adicionar ou substituir vários elementos de uma vez numa posição da lista, faça alguns testes no terminal por você mesmo para entender melhor.

 

Então na primeira parte o que eu fiz aqui:

numsrand[ i*col : i*col + col ]

Foi fatiar a lista/vetor numsrand que contém os números aleatórios, separando "col" elementos da lista para formar uma linha da matriz, e "i*col" é o que desloca a posição onde começam estes elementos a serem separados, aí usei isto no append da matriz para adicionar uma linha a ela.

 

Obs: A variável deveria ser numsmenores não numsmaiores, eu originalmente fiz o oposto só que depois vi que você queria que o centro fosse o menor, eu corrigi a lógica mas esqueci de corrigir o nome da variável.

Na segunda parte o que eu usei foi compreensão de lista (list comprehension), que é uma maneira de formar uma lista usando expressões, condições e fórmulas que definem os dados que serão incluídos na lista. (Em Ptyhon também é possível fazer compreensão de outros tipos estruturas de dados, como dicionários (dicts) e conjuntos (sets).)

Vamos primeiro ver o exemplo da submatriz que acho que é mais simples, e numsmenores é igual apenas com uma condição IF a mais. E nesse caso temos:

submatriz = [[k for k in l[j-1:j+2]] for l in matriz[i-1:i+2]]

Com duas compreensões de listas aninhadas uma dentro da outra.

Lembre-se que i indica a linha da matriz na qual está o número ao redor do qual queremos analisar os valores, e j indica sua coluna.

Então quando eu fiz matriz[i-1:i+2] eu fatiei as linhas da matriz separando 3 linhas, indo da linha anterior "i-1" a linha do número até a linha posterior "i+1" (lembre-se que quando fatiamos o "fim" da fatia é apenas o limite e não é incluso, por isso usei "i+2" como fim).

Logo, a submatriz então poderia ser feita assim:

submatriz = [l[j-1:j+2] for l in matriz[i-1:i+2]]

Onde submatriz é uma lista composta pelas fatias de cada l indo da coluna j-1 até j+2, para cada l pertencendo à fatia da matriz indo da linha i-i até i+2. Resultando em uma submatriz (ou lista de listas) 3x3 da matriz em que o número sendo comparado está no centro.

Observe que esta compreensão de lista: [k for k in l[j-1:j+2]] resulta no mesmo que fazer simplesmente l[j-1:j+2], e o código acima seria mais compacto, eu incluí a versão mais longa e desnecessária apenas para facilitar o entendimento do que está sendo feito na variável numsmenores.

 

Para numsmenores eu estendi esta compreensão de lista, para incluir na sublista os elementos k da fatia da linha que sejam menores que o valor sendo analisado, para isso usamos a compreensão de lista assim [k for k in l[j-1:j+2] if k < matriz[ i ][ j ]].

Ficando:

numsmenores = [[k for k in l[j-1:j+2] if k < matriz[i][j]] for l in matriz[i-1:i+2]]

Assim se houver qualquer número menor que matriz[j] ele será incluído na sublista, e caso não haja nenhum as sublistas ficarão vazias, que é a condição que desejamos, e é o que checamos para imprimir a submatriz.

Editado por isrnick
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...