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 Code-Golf , also gewinnt der kürzeste Code in Bytes.
Antworten:
MATL , 9 Bytes
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.
quelle
Oktave,
464440 Bytes2 Bytes gespartdank@flawr@ LuisMendos Kernel waren 4 Bytes kürzer als bei @flawr.
Genau wie @ LuisMendos Antwort! Nur weniger ... golfen.
Sie können es hier auf ideone sehen .
quelle
(x='aba')~=x'
anstelle von[0 1 0;1 0 1;0 1 0]
.*
ist elementweise Matrixmultiplikation. Die boolesche Matrix wird, da MATLAB weitgehend typenlos ist, als numerisch behandelt.M>0
Wirken also nur als Maske.(x='aba')~=x'
. Das ist einfach großartig @Luis!JavaScript (ES6),
9994 ByteAkzeptiert 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.
quelle
JavaScript (ES6),
95 bis93 Bytequelle
Python mit SciPy, 127 Bytes
Dies berechnet das Ergebnis nach Luis Mendos Methode .
Probieren Sie es online aus
quelle
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.
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.
quelle
Jelly,
232018 BytesProbieren 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.
quelle
Pyth, 36 Bytes
Probieren Sie es online!
Direkte Übersetzung meiner Antwort in Jelly .
quelle