Transformar uma matriz

16

Escreva um programa ou função em que uma matriz A (valor máximo das dimensões da matriz é 100) seja transformada em uma nova matriz B. Cada elemento da nova matriz B é a soma dos vizinhos positivos do elemento correspondente da matriz A .

Somente vizinhos nas quatro direções ortogonais são considerados e as bordas não se enrolam.

Exemplo de entrada:

 1  2  3
 4 -1 -2
-3 -4 10
 1  2 10

Resultado:

 6  4  2
 1  6 13
 5 12 10
 2 11 12

Regras:

  • Como entrada, use números inteiros.
  • Este é um , portanto o código mais curto em bytes vence.
MT
fonte
3
Bem-vindo à programação de quebra-cabeças e código de golfe! Todos os desafios aqui exigem um critério de vitória objetivo, para determinar indiscutivelmente qual solução deve vencer. Normalmente, isso é código-golfe , o que significa que o código mais curto em bytes vence. Além disso, seria útil especificar os formatos de entrada / saída válidos (array 2d? String única? Etc.). Finalmente, existem alguns casos extremos que você não abordou; por exemplo, um número será cercado apenas por números negativos?
Maçaneta da porta
Obrigado. Eu acho que até [100] [100], e sim um número será cercado por números negativos.
MT
De que maneiras podemos receber sugestões?
Maltysen
1
@Doorknob A soma de um conjunto vazio de números é 0.
orlp 26/04
@ Maltysen STDIN, eu acho.
MT

Respostas:

10

MATL , 9 bytes

t0>*1Y6Z+

Experimente online!

Explicação

A matriz de entrada é multiplicada por uma máscara apropriada para tornar os valores negativos iguais a 0. Em seguida, uma convolução 2D é aplicada para calcular a soma dos vizinhos de cada entrada.

t     % Take input implicitly: 2D array. Duplicate
0>    % Is each entry positive? This gives a mask of positive values
*     % Multiply: set negative values of input array to zero
1Y6   % Predefined literal: [0 1 0; 1 0 1; 0 1 0]
Z+    % 2D convolution preserving size. Implicitly display
Luis Mendo
fonte
4
Os telefones são permitidos como E / S?
orlp
Bem, então, eu duvido se este é superável: p
Adnan
@Adnan Em Python não é
R. Kap
4
Esse cara fez isso quando no telefone, e aqui estou eu, ter que dedicar algum do meu tempo para tentar resolver alguns destes problemas ...
R. Kap
@ R.Kap eu quis dizer "digitado no telefone" (não "digitado enquanto falava no telefone"). Desculpe pelo meu inglês :-)
Luis Mendo
7

Oitava, 46 44 40 bytes

Saved 2 bytes graças a @flawr
de @ LuisMendo do kernel foi de 4 bytes menor do que @ flawr de.

@(M)conv2(M.*(M>0),(x='aba')~=x','same')

Assim como a resposta do @ LuisMendo ! Apenas menos ... golfe.

Você pode vê-lo aqui no ideone .

taça
fonte
COMON, eu estava prestes a postar esta resposta exata.
flawr
1
Você pode usar salvar 6 bytes usando em (x='aba')~=x'vez de[0 1 0;1 0 1;0 1 0]
Luis Mendo
2
@LuisMendo O que é essa bruxaria?
26416
1
@cat .*é a multiplicação de matrizes em elementos. A matriz booleana é o MATLAB, em grande parte sem fonte, tratado como numérico. Então, M>0está apenas agindo como uma máscara.
copo
1
(x='aba')~=x'. Isso é incrível @Luis!
Stewie Griffin
2

JavaScript (ES6), 99 94 bytes

a=>a.map((b,i)=>b.map((_,j)=>(g=(c=j,k=j)=>c[k]>0&&c[k])(a[i-1])+g(a[i+1])+g(b,j-1)+g(b,j+1)))

Aceita e retorna uma matriz bidimensional.

Editar: completamente reescrito quando descobri que os argumentos padrão funcionam quando você passa um valor explicitamente indefinido, como quando você indexa o final de uma matriz.

Neil
fonte
A versão do @Socialz Neils é mais antiga.
flawr
@flawr Algumas pessoas podem estar olhando para esta cadeia de mensagens em ordem de voto, não na data da postagem, por isso comentei essa resposta relacionada. Este tem 4 bytes a mais que o do usuário.
ascx
Então você basicamente quer anunciar o outro post?
flawr
@Socialz foi de 4 bytes mais longas, sim ;-)
Neil
2

JavaScript (ES6), 95 93 bytes

document.write("<pre>"+(

m=>m.map((a,r)=>a.map((_,c)=>(s=(x,y=0)=>(n=(m[r+y]||0)[c+x])>0&&n)(1)+s(-1)+s(0,1)+s(0,-1)))

)([[  1,  2,  3 ],
   [  4, -1, -2 ],
   [ -3, -4, 10 ],
   [  1,  2, 10 ]])

.join`\n`)

user81655
fonte
1

Python com SciPy, 127 bytes

from scipy.signal import*
lambda A,r=range(3):convolve2d([[x*(x>0)for x in y]for y in A],[[0,1,0],[1,0,1],[0,1,0]],mode='same')

Isso calcula o resultado usando o método de Luis Mendo .

Experimente online

Mego
fonte
0

Mathcad, bytes

Usa convolução 2D padrão da matriz filtrada com um kernel 3x3. Variantes com somas de elemento negativo e núcleo diagonal também foram adicionadas como compensação parcial para o programa não estar em execução por menos bytes.

insira a descrição da imagem aqui


Nenhuma contagem de bytes inserida como a pontuação do Mathcad ainda não foi determinada. No entanto, usando a equivalência do teclado, é a região de 28 bytes, assumindo que a entrada da matriz não conte para o total.

Observe que o que você vê na imagem acima é exatamente como a solução é inserida e exibida no Mathcad.

Stuart Bruff
fonte
0

Geléia, 23 20 18 bytes

0;+ḊṖ
ZÇ€Z+Ç€
+AHÇ

Experimente online!

Algoritmo

Digamos que haja apenas uma linha: [1,2,3,4].

Digamos que A é o resultado da adição de um zero, ou seja, [0,1,2,3,4].

B é o resultado da remoção do primeiro item, ou seja, [2,3,4].

Então o resultado final é simplesmente vetorizado A + B, removendo o último item.

Agora, o algoritmo deve aplicar isso a todas as linhas e colunas e, em seguida, encontre sua soma vetorizada.

Para cada coluna ?! Eu pensei que Jelly não suporta isso ...

Você está certo. Portanto, eu o transpus, apliquei a cada linha e, em seguida, novamente.

Algoritmo para remover números negativos

Aqui, você apenas adiciona a cada número o seu absoluto. Ele efetivamente elimina números negativos enquanto dobra cada número positivo. Depois, reduza pela metade a matriz inteira.

Freira Furada
fonte