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 código de golfe , portanto o código mais curto em bytes vence.
Respostas:
MATL , 9 bytes
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.
fonte
Oitava,
464440 bytesSaved 2 bytes graças a @flawrde @ LuisMendo do kernel foi de 4 bytes menor do que @ flawr de.
Assim como a resposta do @ LuisMendo ! Apenas menos ... golfe.
Você pode vê-lo aqui no ideone .
fonte
(x='aba')~=x'
vez de[0 1 0;1 0 1;0 1 0]
.*
é a multiplicação de matrizes em elementos. A matriz booleana é o MATLAB, em grande parte sem fonte, tratado como numérico. Então,M>0
está apenas agindo como uma máscara.(x='aba')~=x'
. Isso é incrível @Luis!JavaScript (ES6),
9994 bytesAceita 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.
fonte
JavaScript (ES6),
9593 bytesfonte
Python com SciPy, 127 bytes
Isso calcula o resultado usando o método de Luis Mendo .
Experimente online
fonte
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.
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.
fonte
Geléia,
232018 bytesExperimente 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.
fonte
Pitão, 36 bytes
Experimente online!
Tradução direta da minha resposta em geléia .
fonte