Eine Matrix transformieren


16

Schreiben Sie ein Programm oder eine Funktion, bei der eine Matrix A (maximaler Wert der Dimensionen der Matrix 100) in eine neue Matrix B transformiert wird. Jedes Element der neuen Matrix B ist die Summe der positiven Nachbarn des entsprechenden Elements der Matrix A .

Es werden nur Nachbarn in den vier orthogonalen Richtungen berücksichtigt, und die Kanten werden nicht umbrochen.

Beispiel Eingabe:

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

Ausgabe:

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

Regeln:

  • Verwenden Sie als Eingabe ganze Zahlen.
  • Dies ist ein , also gewinnt der kürzeste Code in Bytes.

3
Willkommen bei Programming Puzzles & Code Golf! Alle Herausforderungen erfordern hier ein objektives Gewinnkriterium, um unbestreitbar zu bestimmen, welche Lösung gewinnen soll. Typischerweise ist dies Codegolf , was bedeutet, dass der kürzeste Code in Bytes gewinnt. Weiterhin wäre es hilfreich, die gültigen Eingabe- / Ausgabeformate (2d-Array? Single-String? Etc.) anzugeben. Schließlich gibt es einige Randfälle, die Sie nicht behandelt haben; Wird eine Zahl zum Beispiel jemals nur von negativen Zahlen umgeben sein?
Türklinke

Vielen Dank. Ich schätze bis zu [100] [100], und ja, eine Zahl wird von negativen Zahlen umgeben sein.
MT

Wie können wir Input aufnehmen?
Maltysen

1
@Doorknob Die Summe einer leeren Zahlenmenge ist 0.
orlp

@Maltysen STDIN, denke ich.
MT

Antworten:


10

MATL , 9 Bytes

t0>*1Y6Z+

Probieren Sie es online!

Erläuterung

Die Eingabematrix wird mit einer geeigneten Maske multipliziert, um negative Werte gleich 0 zu machen. Dann wird eine 2D-Faltung angewendet, um die Summe der Nachbarn jedes Eintrags zu berechnen.

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
Sind Telefone als E / A zulässig?
Orlp

Nun, ich bezweifle, dass dies schlagbar ist: p
Adnan

@ Adnan In Python ist es nicht
R. Kap

4
Dieser Kerl tat dies , während auf dem Handy, und hier bin ich, zu haben , widmen zu einigen meiner Zeit versucht , einige dieser Probleme zu lösen ...
R. Kap

@ R.Kap Ich meinte "vom Telefon aus getippt" (nicht "beim Telefonieren getippt"). Entschuldigung für mein Englisch :-)
Luis Mendo

7

Oktave, 46 44 40 Bytes

2 Bytes gespart dank @flawr
@ LuisMendos Kernel waren 4 Bytes kürzer als bei @flawr.

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

Genau wie @ LuisMendos Antwort! Nur weniger ... golfen.

Sie können es hier auf ideone sehen .


COMON, ich wollte gerade genau diese Antwort posten.
Fehler

1
Sie können sparen 6 Bytes mit (x='aba')~=x'anstelle von[0 1 0;1 0 1;0 1 0]
Luis Mendo

2
@ LuisMendo Was ist das für eine Hexerei?
Becher

1
@cat .*ist elementweise Matrixmultiplikation. Die boolesche Matrix wird, da MATLAB weitgehend typenlos ist, als numerisch behandelt. M>0Wirken also nur als Maske.
Becher

1
(x='aba')~=x'. Das ist einfach großartig @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)))

Akzeptiert ein zweidimensionales Array und gibt es zurück.

Bearbeiten: Vollständig neu geschrieben, als ich feststellte, dass Standardargumente funktionieren, wenn Sie einen explizit undefinierten Wert übergeben, z. B. wenn Sie das Ende eines Arrays indizieren.



@ Socialz Neils Version ist älter.
Fehler

@flawr Einige Leute betrachten diese Nachrichtenkette möglicherweise in der Reihenfolge der Abstimmung und nicht in der Reihenfolge des Postdatums. Daher habe ich diese Antwort kommentiert. Dieser ist 4 Byte länger als der des Benutzers.
Ascx

Du willst also im Grunde den anderen Beitrag bewerben ???
Fehler

@ Socialz War 4 Bytes länger, ja ;-)
Neil

2

JavaScript (ES6), 95 bis 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`)



0

Mathcad, Bytes

Verwendet die standardmäßige 2D-Faltung des gefilterten Arrays mit einem 3x3-Kernel. Varianten mit negativen Elementsummen und diagonalem Kernel wurden ebenfalls als Teilkompensation hinzugefügt, um zu verhindern, dass das Programm mindestens byteweise ausgeführt wird.

enter image description here


Es wurde noch keine Byteanzahl als Mathcad-Bewertung eingegeben. Unter Verwendung der Tastaturäquivalenz ist dies jedoch der Bereich von 28 Bytes, vorausgesetzt, dass die Matrixeingabe nicht zur Gesamtsumme zählt.

Beachten Sie, dass Sie in der Abbildung oben genau sehen, wie die Lösung in Mathcad eingegeben und angezeigt wird.


0

Jelly, 23 20 18 Bytes

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

Probieren Sie es online!

Algorithmus

Nehmen wir an, es gibt nur eine Zeile: [1,2,3,4].

Angenommen, A ergibt sich aus dem Voranstellen einer Null, dh [0,1,2,3,4].

B ist das Ergebnis des Entfernens des ersten Elements, dh [2,3,4].

Dann wird das Endergebnis einfach mit A + B vektorisiert und dann das letzte Element entfernt.

Der Algorithmus wendet dies nun sowohl auf jede Zeile als auch auf jede Spalte an und ermittelt dann deren vektorisierte Summe.

Zu jeder Spalte ?! Ich dachte Jelly unterstützt das nicht ...

Du hast recht. Deshalb habe ich es transponiert, auf jede Zeile angewendet und dann erneut transponiert.

Algorithmus zum Entfernen negativer Zahlen

Hier addieren Sie einfach zu jeder Zahl ihre absoluten Zahlen. Negative Zahlen werden effektiv eliminiert, während jede positive Zahl verdoppelt wird. Dann halbieren Sie einfach die gesamte Matrix.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.