Transformer une matrice

16

É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 , donc le code le plus court en octets l'emporte.
MT
la source
3
Bienvenue sur Programmation Puzzles & Code Golf! Tous les défis ici nécessitent un critère de victoire objectif, afin de déterminer incontestablement quelle solution devrait gagner. En règle générale, il s'agit de code-golf , ce qui signifie que le code le plus court en octets l'emporte. De plus, il serait utile de spécifier les formats d'entrée / sortie valides (tableau 2d? Chaîne unique? Etc.). Enfin, il y a des cas marginaux que vous n'avez pas couverts; par exemple, un nombre ne sera-t-il jamais entouré que de nombres négatifs?
Poignée de porte
Je vous remercie. Je suppose que jusqu'à [100] [100], et oui, un nombre sera entouré de nombres négatifs.
MT
De quelles manières pouvons-nous recueillir des commentaires?
Maltysen
1
@Doorknob La somme d'un ensemble vide de nombres est 0.
orlp
@Maltysen STDIN, je suppose.
MT

Réponses:

10

MATL , 9 octets

t0>*1Y6Z+

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.

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
la source
4
Les téléphones sont-ils autorisés en tant qu'E / S?
orlp
Eh bien, je doute que ce soit battable: p
Adnan
@Adnan En Python, ce n'est pas le cas
R. Kap
4
Ce gars l'a fait au téléphone, et me voilà, devant consacrer une partie de mon temps à essayer de résoudre certains de ces problèmes ...
R. Kap
@ R.Kap, je voulais dire "tapé à partir du téléphone" (pas "tapé en parlant au téléphone"). Désolé pour mon anglais :-)
Luis Mendo
7

Octave, 46 44 40 octets

Enregistré 2 octets grâce au noyau @flawr
@ LuisMendo était 4 octets plus court que @ flawr.

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

Tout comme la réponse de @ LuisMendo ! Seulement moins ... golfy.

Vous pouvez le voir ici sur ideone .

gobelet
la source
COMON, j'étais sur le point de poster cette réponse exacte.
flawr le
1
Vous pouvez utiliser enregistrer 6 octets en utilisant (x='aba')~=x'au lieu de[0 1 0;1 0 1;0 1 0]
Luis Mendo
2
@LuisMendo Qu'est-ce que cette sorcellerie?
bécher
1
@cat .*est une multiplication matricielle par élément. La matrice booléenne est, MATLAB étant largement sans type, traité comme numérique. Agit M>0simplement comme un masque.
bécher
1
(x='aba')~=x'. C'est tout simplement génial @Luis!
Stewie Griffin
2

JavaScript (ES6), 99 94 octets

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)))

Accepte 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.

Neil
la source
La version de @Socialz Neils est plus ancienne.
flawr le
@flawr Certaines personnes peuvent regarder cette chaîne de messages dans l'ordre de vote, et non dans l'ordre de publication, c'est pourquoi j'ai commenté cette réponse. Celui-ci est plus long de 4 octets que celui de l'utilisateur.
ascx
Donc, vous voulez essentiellement annoncer l'autre poste ??
flawr
@Socialz était 4 octets de plus, oui ;-)
Neil
2

JavaScript (ES6), 95 93 octets

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
la source
0

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.

enter image description here


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.

Stuart Bruff
la source
0

Gelée, 23 20 18 octets

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

Essayez-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.

Leaky Nun
la source