Criar Matriz e selecionar uma coluna e apenas metade+1 da linha [RESOLVIDO]

1. Criar Matriz e selecionar uma coluna e apenas metade+1 da linha [RESOLVIDO]

André
arsaraiva

(usa Ubuntu)

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

Boa tarde,
Tenho que fazer uma alteração neste código,
import random

tamanho = 9
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)

if (tamanho%2 == 0):
meio = str((tamanho//2)-1)
else:
meio = str(tamanho//2) #+1)

print('Meio: ', meio)

cont = int(meio)
for item in matriz:
if item not in linha and item[1] == col:
linha.append(item)
if item[0] == lin and item[1] == col:
indice = matriz.index(item) + 1
nova = matriz[indice : indice + cont]
linha.extend(nova)

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


Repare que ele apenas pega metade+1 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).
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: 15 (1º elemento da coluna), 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), depois 35, 45, 55, 65 e 75.

Por fim, a saída final tem que ser assim: padrao[15] = padrao[25] = padrao[26] = padrao[27] = padrao[31] = padrao[35] = padrao[45] = padrao[55] = padrao[65] = padrao[75]

O código em python acima até funcionou para matrizes pequenas, porém quando tentei fazer a matriz 145x145 ficou horas processando sem uma saída.
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 24/05/2017 - 19:45h

arsaraiva escreveu:

Bom dia Marcelo,
executei o script aqui e a saída foi:
Lin[7] 71 72 73 74 75 76 77 78 79
Col[1] 11 21 31 41 51 61 71 81 91

11 12 13 14 15 16 17 18 19
21 22 23 24 25 26 27 28 29
31 32 33 34 35 36 37 38 39
41 42 43 44 45 46 47 48 49
51 52 53 54 55 56 57 58 59
61 62 63 64 65 66 67 68 69
71 72 73 74 75 76 77 78 79
81 82 83 84 85 86 87 88 89
91 92 93 94 95 96 97 98 99

71 72 73 74 75 76

Repare que a saída deverá ser toda a coluna 1 e a linha 7, apenas 5 elementos ((9/2)+1 = 5), sendo assim, seria 71, 72, 73, 74 e 75.
O 76 não entraria na saída.
Por fim ficaria: 11 21 31 41 51 61 71 72 73 74 75 81 91.
Lembrando que tudo dentro do padrao[x] (padrao[11] = padrao[21] = padrao[31] = .....
Um grande abraço


Boa noite André.
Segue:
#!/bin/bash
MAT=145
MTZ="MATRIZ.txt"
SDA="SAIDA.txt"

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

>$MTZ
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 >> $MTZ

wait

NNRAND
Cn="$NRD"
Sd2=($(awk '{printf "%s " ,$'$Cn'}' $MTZ|sed 's/ $//'))
NNRAND
Ln="$NRD"
Lm=$((Ln+1))
echo -n "${Sd2[*]}" > $SDA
MLn=$(awk '{printf "%.f\n",($1+0.1)/2 }' <<< "$MAT")
Sd3=$(awk '/^'$Ln'/ || /^'$Lm'/ {printf " " $0}' $MTZ|egrep -o "${Ln}${Cn}( [0-9]+){$(($MLn-1))}")
#RESULTADO FINAL:
sed -ri "s/${Ln}${Cn}/${Sd3}/" "$SDA"
sed -r 's/[0-9]+/padrao[&] =/g;s/ =$/\n/' $SDA


Efetuei vários testes e funcionou . . . .

Abç.:
Marcelo Oliver



3. Re: Criar Matriz e selecionar uma coluna e apenas metade+1 da linha [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

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

arsaraiva escreveu:

Boa tarde,
Tenho que fazer uma alteração neste código,

Repare que ele apenas pega metade+1 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).
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: 15 (1º elemento da coluna), 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), depois 35, 45, 55, 65 e 75.

Desde já agradeço.


André, boa noite.
Pega a linha a partir da coluna, (sempre considerando a metade dos elementos), e se, na LINHA não tiver a quantidade suficiente, pega da proxíma, é isso?

Numa Matriz 10x10,
COLUNA "1" e LINHA "5",
"pega" os 5 elementos somente da própria linha, certo?

mso



4. Re: Criar Matriz e selecionar uma coluna e apenas metade+1 da linha [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 22/05/2017 - 20:41h

Boa noite André.
Verifique se é isso . . .
Segue:
#!/bin/bash
MAT=9 #DEFINA A MATRIZ MATxMAT V_01

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
#SORTEIA E PEGA LINHA/COLUNA
NNRAND
RCol="$NRD"
Sd2=($(awk '{printf "%s " ,$'$RCol'}' MATRIZ.txt|sed 's/ $//'))

NNRAND
RLin="$NRD"
Sd1=($(awk '{if(NR=='$RLin') printf "%s " ,$0}' MATRIZ.txt|sed 's/ $//'))

#TESTES:
echo -e " Lin[$RLin] ${Sd1[@]}\n Col[$RCol] ${Sd2[@]}\n"
sed 's/^/ /' MATRIZ.txt|egrep --color "${RLin}[0-9]+|[0-9]+${RCol}"
echo ""
#TESTES

#TODA A COLUNA
echo -n "${Sd2[*]}" > SAIDA.txt #MANDA A COLUNA P/ A SAIDA

#METADE DA LINHA+
MetLin=$(awk '{printf "%.f\n",($1+0.1)/2 }' <<< "$MAT")
grep -E -A1 "^${RLin}" MATRIZ.txt |paste -s|sed 's/[\t]/ /'|awk '{for(i='${RCol}';i<='$((RCol+MetLin))';i++) printf " %s" ,$i;print ""}'


Att.:
Marcelo Oliver


5. Criar Matriz e selecionar uma coluna e apenas metade+1 da linha

André
arsaraiva

(usa Ubuntu)

Enviado em 23/05/2017 - 11:24h

Bom dia Marcelo,
executei o script aqui e a saída foi:
Lin[7] 71 72 73 74 75 76 77 78 79
Col[1] 11 21 31 41 51 61 71 81 91

11 12 13 14 15 16 17 18 19
21 22 23 24 25 26 27 28 29
31 32 33 34 35 36 37 38 39
41 42 43 44 45 46 47 48 49
51 52 53 54 55 56 57 58 59
61 62 63 64 65 66 67 68 69
71 72 73 74 75 76 77 78 79
81 82 83 84 85 86 87 88 89
91 92 93 94 95 96 97 98 99

71 72 73 74 75 76

Repare que a saída deverá ser toda a coluna 1 e a linha 7, apenas 5 elementos ((9/2)+1 = 5), sendo assim, seria 71, 72, 73, 74 e 75.
O 76 não entraria na saída.
Por fim ficaria: 11 21 31 41 51 61 71 72 73 74 75 81 91.
Lembrando que tudo dentro do padrao[x] (padrao[11] = padrao[21] = padrao[31] = .....
Um grande abraço






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts