Trasforma una matrice


16

Scrivi un programma o una funzione in cui una matrice A (il valore massimo delle dimensioni della matrice è 100) viene trasformata in una nuova matrice B. Ogni elemento della nuova matrice B è la somma dei vicini positivi dell'elemento corrispondente della matrice A .

Vengono considerati solo i vicini nelle quattro direzioni ortogonali e i bordi non si avvolgono.

Esempio di input:

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

Produzione:

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

Regole:

  • Come input utilizzare numeri interi.
  • Questo è un , quindi vince il codice più breve in byte.

3
Benvenuto in Programmazione di puzzle e codice golf! Tutte le sfide qui richiedono un criterio obiettivo vincente, al fine di determinare indiscutibilmente quale soluzione dovrebbe vincere. In genere, si tratta di code-golf , il che significa che vince il codice più breve in byte. Inoltre, sarebbe utile specificare i formati di input / output validi (2d array? Stringa singola? Ecc.). Infine, ci sono alcuni casi limite che non hai coperto; per esempio, un numero sarà mai circondato solo da numeri negativi?
Maniglia della porta

Grazie. Immagino fino a [100] [100], e sì un numero sarà circondato da numeri negativi.
MT

In che modo possiamo ricevere input?
Maltysen,

1
@Doorknob La somma di un set di numeri vuoto è 0.
orlp

@Maltysen STDIN, immagino.
MT

Risposte:


10

MATL , 9 byte

t0>*1Y6Z+

Provalo online!

Spiegazione

La matrice di input viene moltiplicata da una maschera appropriata per rendere i valori negativi pari a 0. Quindi viene applicata una convoluzione 2D per calcolare la somma dei vicini di ciascuna voce.

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

4
I telefoni sono ammessi come I / O?
orlp,

Bene, ne dubito se questo è battibile: p
Adnan,

@Adnan In Python non lo è
R. Kap,

4
Questo ragazzo ha fatto questo mentre era al telefono, ed eccomi qui, dovendo dedicare un po 'del mio tempo a cercare di risolvere alcuni di questi problemi ...
R. Kap,

@ R.Kap intendevo "digitato dal telefono" (non "digitato mentre parla al telefono"). Scusami per il mio inglese :-)
Luis Mendo,

7

Ottava, 46 44 40 byte

Salvato 2 byte grazie al kernel di @flawr
@ LuisMendo era 4 byte più corto di quello di @ flawr.

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

Proprio come la risposta di @ LuisMendo ! Solo meno ... golfy.

Puoi vederlo qui su ideone .


COMON, stavo per pubblicare questa risposta esatta.
Flawr,

1
Puoi usare salva 6 byte usando (x='aba')~=x'invece di[0 1 0;1 0 1;0 1 0]
Luis Mendo il

2
@LuisMendo Cos'è questa stregoneria?
becher

1
@cat .*è la moltiplicazione della matrice in base agli elementi. La matrice booleana è, essendo MATLAB in gran parte senza tipo, trattata come numerica. Quindi M>0agisce solo come una maschera.
becher

1
(x='aba')~=x'. È semplicemente fantastico @Luis!
Stewie Griffin,

2

JavaScript (ES6), 99 94 byte

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

Accetta e restituisce un array bidimensionale.

Modifica: completamente riscritto quando ho scoperto che gli argomenti predefiniti funzionano quando si passa un valore esplicitamente indefinito, come quando si indicizza la fine di un array.



La versione di @Socialz Neils è precedente.
Flawr,

@flawr Alcune persone potrebbero guardare questa catena di messaggi in ordine di voto, non nell'ordine di data post, quindi ho commentato quella risposta correlata. Questo è di 4 byte più lungo di quello dell'utente.
ascx,

Quindi sostanzialmente vuoi pubblicizzare l'altro post ??
Flawr,

@Socialz Era più lungo di 4 byte, sì ;-)
Neil,

2

JavaScript (ES6), 95 93 byte

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


1

Python con SciPy, 127 byte

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

Questo calcola il risultato usando il metodo di Luis Mendo .

Provalo online


0

Mathcad, byte

Utilizza la convoluzione 2D standard dell'array filtrato con un kernel 3x3. Sono state anche aggiunte varianti con somme di elementi negativi e kernel diagonale come compensazione parziale per il programma che non è in esecuzione per almeno byte.

enter image description here


Nessun conteggio dei byte inserito come punteggio Mathcad non è ancora stato determinato. Tuttavia, usando l'equivalenza da tastiera, è la regione di 28 byte supponendo che l'input della matrice non conti per il totale.

Nota che quello che vedi nell'immagine sopra è esattamente come la soluzione viene inserita e visualizzata in Mathcad.


0

Gelatina, 23 20 18 byte

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

Provalo online!

Algoritmo

Diciamo che c'è solo una riga: [1,2,3,4].

Diciamo che A è il risultato di anteporre uno zero, cioè [0,1,2,3,4].

B è il risultato della rimozione del primo oggetto, ovvero [2,3,4].

Quindi il risultato finale è semplicemente A + B vettorializzato, quindi rimuove l'ultimo elemento.

Ora, l'algoritmo consiste nell'applicare questo su ogni riga e ogni colonna, quindi trovare la loro somma vettoriale.

Per ogni colonna ?! Pensavo che Jelly non supportasse questo ...

Hai ragione. Pertanto, l'ho trasposto, applicato ad ogni riga, quindi l'ho trasposto di nuovo.

Algoritmo per la rimozione di numeri negativi

Qui, aggiungi ad ogni numero il loro assoluto. Elimina efficacemente i numeri negativi mentre raddoppia ogni numero positivo. Quindi, dimezza l'intera matrice.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.