Écrivez un programme ou une fonction où une matrice A (la valeur maximale des dimensions de la matrice est 100) est transformée en une nouvelle matrice B. Chaque élément de la nouvelle matrice B est la somme des voisins positifs de l'élément correspondant de la matrice A .
Seuls les voisins dans les quatre directions orthogonales sont pris en compte et les bords ne s'enroulent pas.
Exemple d'entrée:
1 2 3
4 -1 -2
-3 -4 10
1 2 10
Production:
6 4 2
1 6 13
5 12 10
2 11 12
Règles:
- En entrée, utilisez des entiers.
- Il s'agit d'un code-golf , donc le code le plus court en octets l'emporte.
Réponses:
MATL , 9 octets
Essayez-le en ligne!
Explication
La matrice d'entrée est multipliée par un masque approprié pour rendre les valeurs négatives égales à 0. Ensuite, une convolution 2D est appliquée pour calculer la somme des voisins de chaque entrée.
la source
Octave,
464440 octetsEnregistré 2 octets grâce au noyau @flawr@ LuisMendo était 4 octets plus court que @ flawr.
Tout comme la réponse de @ LuisMendo ! Seulement moins ... golfy.
Vous pouvez le voir ici sur ideone .
la source
(x='aba')~=x'
au lieu de[0 1 0;1 0 1;0 1 0]
.*
est une multiplication matricielle par élément. La matrice booléenne est, MATLAB étant largement sans type, traité comme numérique. AgitM>0
simplement comme un masque.(x='aba')~=x'
. C'est tout simplement génial @Luis!JavaScript (ES6),
9994 octetsAccepte et renvoie un tableau à deux dimensions.
Edit: complètement réécrit lorsque j'ai découvert que les arguments par défaut fonctionnent lorsque vous passez une valeur explicitement indéfinie, comme lorsque vous indexez la fin d'un tableau.
la source
JavaScript (ES6),
9593 octetsla source
Python avec SciPy, 127 octets
Ceci calcule le résultat en utilisant la méthode de Luis Mendo .
Essayez-le en ligne
la source
Mathcad, octets
Utilise la convolution 2D standard du tableau filtré avec un noyau 3x3. Des variantes avec des sommes d'éléments négatives et un noyau diagonal ont également été ajoutées en tant que compensation partielle pour le programme n'étant pas en cours d'exécution sur au moins octets.
Aucun décompte d'octets saisi car le score Mathcad n'a pas encore été déterminé. Cependant, en utilisant l'équivalence du clavier, c'est la région de 28 octets en supposant que l'entrée matricielle ne compte pas dans le total.
Notez que ce que vous voyez dans l'image ci-dessus est exactement comment la solution est entrée et affichée dans Mathcad.
la source
Gelée,
232018 octetsEssayez-le en ligne!
Algorithme
Disons qu'il n'y a qu'une seule ligne: [1,2,3,4].
Disons que A est le résultat du préfixe d'un zéro, c'est-à-dire [0,1,2,3,4].
B est le résultat de la suppression du premier élément, soit [2,3,4].
Ensuite, le résultat final est simplement A + B vectorisé, puis en supprimant le dernier élément.
Maintenant, l'algorithme consiste à appliquer cela à chaque ligne ainsi qu'à chaque colonne, puis de trouver leur somme vectorisée.
Pour chaque colonne?! Je pensais que Jelly ne supporte pas cela ...
Tu as raison. Par conséquent, je l'ai transposé, appliqué à chaque ligne, puis je l'ai à nouveau transposé.
Algorithme de suppression des nombres négatifs
Ici, vous ajoutez simplement à chaque nombre leur absolu. Il élimine efficacement les nombres négatifs tout en doublant chaque nombre positif. Ensuite, divisez simplement la matrice par deux.
la source
Pyth, 36 octets
Essayez-le en ligne!
Traduction directe de ma réponse en Jelly .
la source