Diagonais python

Pessoal, preciso de uma ajuda, denovo, dessa vez eu tenho uma Matriz MxN (definido pelo usuário), que eu preciso mostrar os valores de todas as diagonais, por exemplo:

Matriz:

8 3 2 5
0 1 9 1
2 7 1 0

Saída:

8
0 3
2 1 2
7 9 5
1 1
0
2
0 7
8 1 1
3 9 0
2 1
5

Alguma ideia que pode ajudar?

Detalhe: Não posso importar nenhum módulo para me ajudar nisso.

O mais próximo que cheguei foi usando list comprehension, mas só pega de uma ponta a outra…

# cima-baixo, esquerda-direita
print([m[i][i] for i in range(0, len(m))], "\n") # 8 1 1

# cima-baixo, direita-esquerda
print([m[i][~i] for i in range(0, len(m))], "\n") # 5 9 7

# baixo-cima, esquerda-direita
print([m[~i][i] for i in range(0, len(m))], "\n") # 2 1 2

# baixo-cima, direita-esquerda
print([m[~i][~i] for i in range(0, len(m))], "\n") # 0 9 3

Tirei do final desse post

Talvez você vai ter que fazer algo nesse sentido + laços for ou while para atingir “os miolos” da matriz, boa sorte!

Valeu, vou tentar e depois digo se eu consegui.

1 curtida

Em se tratando de matrizes, você deve procurar por “propriedades observáveis”, as explicações são tediosas pois tem que ficar procurando por deduções e suposições em busca de padrões estes sim importantes.

Os esboço a seguir precisa de uma boa revisão, pois não considerei a explicação de fácil entendimento (itens de 1 a 5).

Fiz uma implementação em outra linguagem, pois não entendo python, entretanto, creio que seja compreensível, pois usa basicamente o for, mas … .

Obs.: variável++ é o equivalente a variável = variável + 1, em outra linguagem pois como dito, não entendo python

   public static void main(String[] args) {
        int[][] matriz = new int[3][4];
        int linhas = matriz.length, colunas = matriz[0].length, linhaAtual, colunaAtual;
        for (int diagonais = 0; diagonais < linhas + colunas - 1; diagonais++) {
            
            linhaAtual = diagonais < linhas ? diagonais : linhas - 1;
            colunaAtual = diagonais < linhas ? 0 : 1 + (diagonais - linhas);
            
            for (int percorrer = linhaAtual; percorrer >= 0; percorrer--) {
                if (colunaAtual > colunas - 1) {
                    break;
                }                
                System.out.print(percorrer + "" + colunaAtual++);
            }
            System.out.println("");
        }
    }

Saída em linha X coluna:

00
1001
201102
211203
2213
23

Não fiz as diagonais que iniciam pela base, mas ao meu ver é questão de procurar por propriedades/padrões, você pode manter a análise atual, ou poderia inverter a matriz, de forma que a última linha tomasse o lugar da primeira, a penúltima o lugar da segunda etc, mas é só uma exemplificação de que há mais de uma forma de resolver o mesmo problema.

Té+

Ola! Natan o anon passou a idéia principal, ou seja dos padrões…
Primeiro Dado uma Matriz Ai,j,…
O padrão na Matriz bidimensional é simples…
https://www.clubedohardware.com.br/uploads/monthly_06_2011/post-884224-13884959751314.jpg

No Exemplo do link acima. Se vc reparar numa Matriz 6x6 por Exemplo
as Diagonais sempre:
1 ) começam na primeira linha A1,1 / A1,2 / A1,3 /… A1,n
2) O numero de elementos é igual ao número da coluna. Ex para A1,3 tem 3 elementos
3) E os elementos são sempre, a partir de um Ai,j qualquer…
Exemplo Ai,j / A(i= i+1),(j = j-1) / A(i = i+2),(j = j-2) e assim por diante
4) O último i é quando i = j
5) O último j é quando j = 1

Daí é só usar If ou For depende de como vc prefere…

Espero ter ajudado!