Capacidade Computacional - Referente a criar Matriz [RESOLVIDO]

1. Capacidade Computacional - Referente a criar Matriz [RESOLVIDO]

André
arsaraiva

(usa Ubuntu)

Enviado em 20/05/2017 - 14:40h

Boa tarde amigos,
estou tentando executar um código que deverá criar uma matriz n x n, depois selecionar uma linha e uma coluna aleatoriamente para imprimir na tela padrao[valor].
import random

tamanho = 193
matriz = []
linha = []

for elemento in range(1, tamanho + 1):
a = str(elemento)
for elemento in range(1, tamanho + 1):
b = str(elemento)
matriz.append(a + b)
print(matriz)

col = str(random.randrange(1,tamanho,1))
print ('Coluna: ', col)
lin = str(random.randrange(1,tamanho,1))
print ('Linha: ', lin)

for item in matriz:
if item not in linha and item[1] == col:
linha.append(item)
if item not in linha and item[0] == lin:
linha.append(item)

print('Resultado: ')
for result in linha:
print('padrao[' + result + ']', end=' = ')


Quando executo com a variável tamanho pequena (por exemplo, 7) funciona perfeitamente.
11 12 13 14 15 16 17
21 22 23 24 25 26 27
31 32 33 34 35 36 37
41 42 43 44 45 46 47
51 52 53 54 55 56 57
61 62 63 64 65 66 67
71 72 73 74 75 76 77

Depois de forma randômica ele escolhe uma linha e uma coluna (em negrito), por exemplo:
Col: 3
Linha: 5

E imprime para mim esta seleção incluindo pardrao[o valor] =
Assim a saída do exemplo ficaria
padrao[13] = padrao[23]= padrao[33]= padrao[43]= padrao[51] = padrao[52] = padrao[53] = padrao[54] = padrao[55] = padrao[56] = padrao[57] = padrao[63] = padrao[73]=


Quando tento fazer com a variável tamanho maior (193) fica por horas executando, sem resultado.
Será a capacidade computacional do python?
Meu hardware: AMD FX9500+ Black, 24GB DDR3, 2 HD 1TB, Placa Mãe Gigabyte 970A, VGA Radeon R7 250.
Sistemas: Windows 10 Pro Original 64bits / Ubuntu 16.01 i386

Alguém poderia me auxiliar para converter este código para outra linguagem que possa ser computacionalmente melhor? Poderia
ser C/C++ ou shell script, ou sei lá.

Desde já agradeço.


  


2. MELHOR RESPOSTA

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 21/05/2017 - 15:26h

arsaraiva escreveu:

Olá Marcelo,

ficou muito legal, e rodou perfeitamente da forma que está. Aí....
Mudei para 10, 11 e 12 para testar e os resultados foram muito estranhos:

padrao[1010] = padrao[110] = padrao[210] = padrao[310] = padrao[410] = padrao[510] = padrao[610] = padrao[710] = padrao[810] = padrao[910], isso para 10.

padrao[310] isso para 11.

Bem, li o seu artigo sobre a função random e pesei em facilitar, tirando isso e definindo o valor de linha e coluna como sempre a metade(se o tamanho for 193, a linha e a coluna seria 193/2=96 pensando em inteiros). Isso não alteraria em nada o meu resultado final e facilitaria bastante o script.

Agora, em relação a execução, fiquei na dúvida. Vamos olhar para o tamanho 10:
11 12 13 14 15 16 17 18 19 110
21 22 23 24 25 26 27 28 29 210
....
101 102 103 104 105 106 107 108 109 1010

No resultado para 10, percebi que ele pegou a coluna 10, mais pegou o ultimo elemento e depois seguiu a sequência 1...9 e não pegou nenhuma linha.

Executei algumas vezes e o comportamento foi mais estranho ainda, às vezes nem retornava nada.

Boa tarde André.
"Estranhamente" aqui funciona normal . . . .
Como eu não tinha gostado da implementação da saida, resolvi alterar para algo mais simples e "matemático" . . . .
Em tempo:
A matéria sobre o RANDOM, não é minha, é do listeiro_037.
Defina o "TAMANHO" da MATRIZ na var "MAT"
#!/bin/bash
MAT=7 #DEFINA A MATRIZ MATxMAT

NNRAND() {
NRD=$((1+(RANDOM%${MAT})))
}

> MATRIZ.txt
tput clear
for ((x=1;x<=MAT;x++));do
for ((y=1;y<=MAT;y++));do
((y<MAT)) && printf "%s%s " ${x} ${y} || printf "%s%s\n" ${x} ${y}
done
done >> MATRIZ.txt

wait

NNRAND
RL="$NRD"
Sd1=($(awk '{if(NR=='$RL') printf "%s " ,$0}' MATRIZ.txt|sed 's/ $//'))
NNRAND
RC="$NRD"
Sd2=($(awk '{printf "%s " ,$'$RC'}' MATRIZ.txt|sed 's/ $//'))
echo -e " PARA EFEITO DE TESTES:\n Linha $RL: ${Sd1[@]}\n Coluna $RC: ${Sd2[@]}\n"
echo -n "${Sd1[*]}" > SAIDA.txt
for ((x=0;x<${#Sd2[*]};x++));do
[[ $(grep "${Sd2[$x]}" <<< "${Sd1[*]}") ]] || echo -n " ${Sd2[$x]}" >> SAIDA.txt
done
echo "" >> SAIDA.txt
sed -r 's/[0-9]+/padrão[&]/g;s/ / = /g' SAIDA.txt
EDITADO: SIMPLIFICANDO
SUBSTITUA:
for ((x=0;x<${#Sd2[*]};x++));do
[[ $(grep "${Sd2[$x]}" <<< "${Sd1[*]}") ]] || echo -n " ${Sd2[$x]}" >> SAIDA.txt
done

POR:
unset Sd2[$((RL-1))]
echo -n " ${Sd1[*]}" >> SAIDA.txt



ESTATISTICAS DO RANDOM:
for n in {1..1000};do printf "%02d\n" $((1+(RANDOM%10)));done|sort|uniq -c|awk '{printf "%s : %03d : %s\n" ,$2,$1,($1/10)}' 


Abç.:
Marcelo Oliver




3. Capacidade Computacional

André
arsaraiva

(usa Ubuntu)

Enviado em 20/05/2017 - 15:08h

Na verdade já consegui analisar aqui e a variável tamanho está suportando os 193, porém parece que o for item não está funcionando, ou pelo menos, parece que a execução está pulando das variáveis col e lin para o print ("Resultado"). Só não sei o motivo disso.


4. Re: Capacidade Computacional - Referente a criar Matriz

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 20/05/2017 - 19:08h

arsaraiva escreveu:

Na verdade já consegui analisar aqui e a variável tamanho está suportando os 193, porém parece que o for item não está funcionando, ou pelo menos, parece que a execução está pulando das variáveis col e lin para o print ("Resultado"). Só não sei o motivo disso.


Boa noite André, segue um teste em shell . . .
O script abaixo, cria uma MATRIZ de 500 x 500 e salva em "MATRIZ.txt",
Gera um nº randômico, imprime a coluna referente.
Gera outro nº . . . e imprime a linha correspondente . . .

#!/bin/bash

NNRAND() {
NRD=$(((RANDOM%500)+1))
}

> MATRIZ.txt

for ((x=1;x<=500;x++));do
for ((y=1;y<=500;y++));do
((y<500)) && printf "Padrão[%s%s] " ${x} ${y} || printf "Padrão[%s%s]\n" ${x} ${y}
done
done >> MATRIZ.txt
wait
NNRAND
RC="$NRD"
awk 'BEGIN {printf "\n PRINTANDO A COLUNA Nº '$RC'\n";} {print $'$RC'}' MATRIZ.txt

NNRAND
NL="$NRD"
awk 'BEGIN {printf "\n PRINTANDO A LINHA Nº '$NL'\n";} {if(NR=='$NL') print $0}' MATRIZ.txt



Abç.:
Marcelo Oliver


5. Capacidade Computacional - Referente a criar Matriz

André
arsaraiva

(usa Ubuntu)

Enviado em 20/05/2017 - 21:03h

Boa noite Marcelo,

A minha maior dificuldade python foi fazer a saída. Na execução do seu script a saída da primeira linha da matriz.txt ficou:

001001 001002 001003 001004 001005 001006 001007 001008 001009 001010 001011 001012 001013 001014 001015 001016 001017 001018 001019 001020 001021 001022 001023 001024 001025 001026 001027 001028 001029 001030 001031 001032 001033 001034 001035 001036 001037 001038 001039 001040 001041 001042 001043 001044 001045 001046 001047 001048 001049 001050 001051 001052 001053 001054 001055 001056 001057 001058 001059 001060 001061 001062 001063 001064 001065 001066 001067 001068 001069 001070 001071 001072 001073 001074 001075 001076 001077 001078 001079 001080 001081 001082 001083 001084 001085 001086 001087 001088 001089 001090 001091 001092 001093 001094 001095 001096 001097 001098 001099 001100 001101 001102 001103 001104 001105 001106 001107 001108 001109 001110 001111 001112 001113 001114 001115 001116 001117 001118 001119 001120 001121 001122 001123 001124 001125 001126 001127 001128 001129 001130 001131 001132 001133 001134 001135 001136 001137 001138 001139 001140 001141 001142 001143 001144 001145 001146 001147 001148 001149 001150 001151 001152 001153 001154 001155 001156 001157 001158 001159 001160 001161 001162 001163 001164 001165 001166 001167 001168 001169 001170 001171 001172 001173 001174 001175 001176 001177 001178 001179 001180 001181 001182 001183 001184 001185 001186 001187 001188 001189 001190 001191 001192 001193

Repare que deveria ser
11 12 13 14 15 16 ...1193
21 22 23 24 25 26...2193
...
1931 1932 1933 1934 1935....193193

Na saída não posso ter números com zero na frente (001193).

Já na saída do terminal, é mais complicado ainda, pois tenho que começar com as colunas até a linha, depois voltar para coluna. Um exemplo:
11 12 13 14 15 16
21 22 23 24 25 26
31 32 33 34 35 36
41 42 43 44 45 46
51 52 53 54 55 56
61 62 63 64 65 66

Se fosse selecionada a coluna 2 e linha 5 a saída teria que ser: 12 22 32 42 51 52 53 54 55 56 62

Se fosse a coluna 4 e linha 1: 11 12 13 14 15 16 24 34 44 54 64 (repare que 14 não se repete)

E para completar e bagunçar o código, a saída acima teria que sair exatamente assim:
padrao[11] = padrao[12] = padrao[13] = padrao[14] = padrao[15] = padrao[16] = padrao[24] = padrao[34] = padrao[44] = padrao[54] = padrao[64]

Essa saída final pode ficar armazenada em um arquivo txt.



6. Re: Capacidade Computacional - Referente a criar Matriz

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 20/05/2017 - 23:13h

Boa noite André, tirei os "zeros" a esquerda . . . . E mais algumas alterações . . .
#!/bin/bash

NNRAND() {
NRD=$(((RANDOM%5)+1))
}

> MATRIZ.txt

for ((x=1;x<=7;x++));do
for ((y=1;y<=7;y++));do
((y<7)) && printf "%s%s " ${x} ${y} || printf "%s%s\n" ${x} ${y}
done
done >> MATRIZ.txt
wait
NNRAND
RC="$NRD"
SAIDA=$(awk '{printf "%s " ,$'$RC'}' MATRIZ.txt)
NNRAND
NL="$NRD"
SAIDA=$(awk '{if(NR=='$NL') printf "%s " ,$0}' MATRIZ.txt)${SAIDA}
sed 's/ /\n/g' <<< "$SAIDA"|sed '/^$/d'|sort|uniq|paste -sd ' '|sed -r 's/[0-9]+/padrao[&] =/g;s/ =$//'


mso


7. Re: Capacidade Computacional - Referente a criar Matriz [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 21/05/2017 - 06:24h

msoliver escreveu:

Boa noite André, tirei os "zeros" a esquerda . . . . E mais algumas alterações . . .
#!/bin/bash

NNRAND() {
NRD=$(((RANDOM%5)+1))
}

> MATRIZ.txt

for ((x=1;x<=7;x++));do
for ((y=1;y<=7;y++));do
((y<7)) && printf "%s%s " ${x} ${y} || printf "%s%s\n" ${x} ${y}
done
done >> MATRIZ.txt
wait
NNRAND
RC="$NRD"
SAIDA=$(awk '{printf "%s " ,$'$RC'}' MATRIZ.txt)
NNRAND
NL="$NRD"
SAIDA=$(awk '{if(NR=='$NL') printf "%s " ,$0}' MATRIZ.txt)${SAIDA}
sed 's/ /\n/g' <<< "$SAIDA"|sed '/^$/d'|sort|uniq|paste -sd ' '|sed -r 's/[0-9]+/padrao[&] =/g;s/ =$//'


mso


Só uma dica: esse módulo 5 da função não é perfeitamente randômico.
Fiz uma dica tempos atrás: https://www.vivaolinux.com.br/dica/Numeros-aleatorios-em-shell-script/

----------------------------------------------------------------------------------------------------------------
Nem direita, nem esquerda. Quando se trata de corrupção o Brasil é ambidestro.
(anônimo)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



8. Capacidade Computacional - Referente a criar Matriz

André
arsaraiva

(usa Ubuntu)

Enviado em 21/05/2017 - 11:21h

Olá Marcelo,

ficou muito legal, e rodou perfeitamente da forma que está. Aí....
Mudei para 10, 11 e 12 para testar e os resultados foram muito estranhos:

padrao[1010] = padrao[110] = padrao[210] = padrao[310] = padrao[410] = padrao[510] = padrao[610] = padrao[710] = padrao[810] = padrao[910], isso para 10.

padrao[310] isso para 11.

Bem, li o seu artigo sobre a função random e pesei em facilitar, tirando isso e definindo o valor de linha e coluna como sempre a metade(se o tamanho for 193, a linha e a coluna seria 193/2=96 pensando em inteiros). Isso não alteraria em nada o meu resultado final e facilitaria bastante o script.

Agora, em relação a execução, fiquei na dúvida. Vamos olhar para o tamanho 10:
11 12 13 14 15 16 17 18 19 110
21 22 23 24 25 26 27 28 29 210
....
101 102 103 104 105 106 107 108 109 1010

No resultado para 10, percebi que ele pegou a coluna 10, mais pegou o ultimo elemento e depois seguiu a sequência 1...9 e não pegou nenhuma linha.

Executei algumas vezes e o comportamento foi mais estranho ainda, às vezes nem retornava nada.




9. Capacidade Computacional - Referente a criar Matriz

André
arsaraiva

(usa Ubuntu)

Enviado em 21/05/2017 - 17:36h

Marcelo ficou ótimo, rodei com a matriz de tamanho 193 e a saída ficou certinha.
Deixa eu te perguntar: Tenho que fazer uma variação deste código, onde ele apenas pegue metade da linha a partir da coluna. Algo assim:

11 12 13 14 15 16 17
21 22 23 24 25 26 27
31 32 33 34 35 36 37
41 42 43 44 45 46 47
51 52 53 54 55 56 57
61 62 63 64 65 66 67
71 72 73 74 75 76 77

Se a coluna escolhida fosse 5 e a linha 2, por exemplo, eu pegaria toda a coluna e apenas 4 elementos da linha (7/2 = 3 +1 para números impares e apenas x/2 para pares).
assim a saída seria:
15 25 26 27 31 35 45 55 65 75

Repare que fui obrigado a pegar o 31, pois 4 elementos da linha 2 a partir da coluna ficaria 25(coluna e primeiro elemento da linha), 26 (segundo elemento da linha), 27 (3º elemento), 31 (4º elemento, já que não existe o 28).

A pergunta é a seguinte: Pensei em abrir um novo tópico, com o seu código, para poder marcar este como melhor resposta, já que está resolvido. Concorda?


10. Re: Capacidade Computacional - Referente a criar Matriz [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 21/05/2017 - 18:14h

arsaraiva escreveu:

Marcelo ficou ótimo, rodei com a matriz de tamanho 193 e a saída ficou certinha.
Deixa eu te perguntar: Tenho que fazer uma variação deste código, onde ele apenas pegue metade da linha a partir da coluna. Algo assim:

11 12 13 14 15 16 17
21 22 23 24 25 26 27
31 32 33 34 35 36 37
41 42 43 44 45 46 47
51 52 53 54 55 56 57
61 62 63 64 65 66 67
71 72 73 74 75 76 77

Se a coluna escolhida fosse 5 e a linha 2, por exemplo, eu pegaria toda a coluna e apenas 4 elementos da linha (7/2 = 3 +1 para números impares e apenas x/2 para pares).
assim a saída seria:
15 25 26 27 31 35 45 55 65 75

Repare que fui obrigado a pegar o 31, pois 4 elementos da linha 2 a partir da coluna ficaria 25(coluna e primeiro elemento da linha), 26 (segundo elemento da linha), 27 (3º elemento), 31 (4º elemento, já que não existe o 28).

A pergunta é a seguinte:
Pensei em abrir um novo tópico, com o seu código, para poder marcar este como melhor resposta, já que está resolvido. Concorda?


Vamos ver se eu entendi.
Coluna 5, Linha 2.
11 12 13 14 15 16 17
21 22 23 24 25 26 27
31 32 33 34 35 36 37
41 42 43 44 45 46 47
51 52 53 54 55 56 57
61 62 63 64 65 66 67
71 72 73 74 75 76 77


Vc quer "pegar" a COLUNA inteira e, na linha,
Somente os elementos a partir da intersecção, é isso?

Pensei em abrir um novo tópico, com o seu código . . .
Concordo em encerrar este e abrir outro, qto a colocar o código . . . Discordo . . .
Quem quiser ajudar, que comece do início . . . :)

att.:
mso


11. Capacidade Computacional - Referente a criar Matriz

André
arsaraiva

(usa Ubuntu)

Enviado em 21/05/2017 - 18:42h

msoliver escreveu:

arsaraiva escreveu:

Marcelo ficou ótimo, rodei com a matriz de tamanho 193 e a saída ficou certinha.
Deixa eu te perguntar: Tenho que fazer uma variação deste código, onde ele apenas pegue metade da linha a partir da coluna. Algo assim:

11 12 13 14 15 16 17
21 22 23 24 25 26 27
31 32 33 34 35 36 37
41 42 43 44 45 46 47
51 52 53 54 55 56 57
61 62 63 64 65 66 67
71 72 73 74 75 76 77

Se a coluna escolhida fosse 5 e a linha 2, por exemplo, eu pegaria toda a coluna e apenas 4 elementos da linha (7/2 = 3 +1 para números impares e apenas x/2 para pares).
assim a saída seria:
15 25 26 27 31 35 45 55 65 75

Repare que fui obrigado a pegar o 31, pois 4 elementos da linha 2 a partir da coluna ficaria 25(coluna e primeiro elemento da linha), 26 (segundo elemento da linha), 27 (3º elemento), 31 (4º elemento, já que não existe o 28).

A pergunta é a seguinte:
Pensei em abrir um novo tópico, com o seu código, para poder marcar este como melhor resposta, já que está resolvido. Concorda?


Vamos ver se eu entendi.
Coluna 5, Linha 2.
11 12 13 14 15 16 17
21 22 23 24 25 26 27
31 32 33 34 35 36 37
41 42 43 44 45 46 47
51 52 53 54 55 56 57
61 62 63 64 65 66 67
71 72 73 74 75 76 77


Vc quer "pegar" a COLUNA inteira e, na linha,
Somente os elementos a partir da intersecção, é isso?

Pensei em abrir um novo tópico, com o seu código . . .
Concordo em encerrar este e abrir outro, qto a colocar o código . . . Discordo . . .
Quem quiser ajudar, que comece do início . . . :)

att.:
mso


Vc quer "pegar" a COLUNA inteira e, na linha,
Somente os elementos a partir da intersecção, é isso?

É mais ou menos isso, a coluna eu quero inteira mesmo, já a linha, será a metade + 1 do tamanho (se for 145 o tamanho da matriz, vou pegar apenas 73 elementos da linha) a partir da coluna. A grande dificuldade é que se, por exemplo, a coluna selecionada de uma matriz 99x99 for a coluna 80, e a linha for a 30, terei que pegar 20 elementos (80 até 100) da linha 30 e mais 30 elementos da linha 31(1 até 30) para fazer o total de 50 elementos (99/2 = 49 +1 = 50).

Pensei em abrir um novo tópico, com o seu código . . .
Concordo em encerrar este e abrir outro, qto a colocar o código . . . Discordo . . .
Quem quiser ajudar, que comece do início . . . :)

Vou abrir um novo tópico, sem o código, kkk.







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts