Przekształć macierz

16

Napisz program lub funkcję, w której macierz A (maksymalna wartość wymiarów macierzy wynosi 100) jest przekształcana w nową macierz B. Każdy element nowej macierzy B jest sumą dodatnich sąsiadów odpowiedniego elementu macierzy A .

Uwzględniani są tylko sąsiedzi w czterech prostopadłych kierunkach, a krawędzie się nie zawijają.

Przykładowe dane wejściowe:

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

Wynik:

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

Zasady:

  • Jako dane wejściowe użyj liczb całkowitych.
  • To jest , więc wygrywa najkrótszy kod w bajtach.
MT
źródło
3
Witamy w Programowaniu Puzzle i Code Golf! Wszystkie wyzwania tutaj wymagają obiektywnego kryterium wygranej, aby bezdyskusyjnie określić, które rozwiązanie powinno wygrać. Zazwyczaj jest to kodowanie w golfa , co oznacza, że ​​wygrywa najkrótszy kod w bajtach. Ponadto pomocne byłoby określenie prawidłowych formatów wejścia / wyjścia (tablica 2d? Pojedynczy ciąg? Itd.). Wreszcie, istnieją pewne przypadki krawędzi, których jeszcze nie obejmowałeś; na przykład, czy liczba będzie kiedykolwiek otoczona tylko liczbami ujemnymi?
Klamka
Dziękuję Ci. Chyba do [100] [100], i tak, liczba będzie otoczona liczbami ujemnymi.
MT
W jaki sposób możemy brać wkład?
Maltysen
1
@Doorknob Suma pustego zestawu liczb wynosi 0.
lub
@Maltysen STDIN, tak myślę.
MT

Odpowiedzi:

10

MATL , 9 bajtów

t0>*1Y6Z+

Wypróbuj online!

Wyjaśnienie

Macierz wejściowa jest mnożona przez odpowiednią maskę, aby wartości ujemne były równe 0. Następnie stosuje się splot 2D w celu obliczenia sumy sąsiadów każdego wpisu.

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
źródło
4
Czy telefony są dozwolone jako I / O?
orlp
Wątpię więc, czy jest to możliwe do pokonania: p
Adnan
@Adnan W Pythonie to nie jest
R. Kap
4
Ten facet zrobił to, gdy rozmawiał przez telefon, i oto jestem, muszę poświęcić trochę czasu na próby rozwiązania niektórych z tych problemów ...
R. Kap
@ R.Kap Miałem na myśli „pisanie z telefonu” (nie „pisanie podczas rozmowy przez telefon”). Przepraszam za mój angielski :-)
Luis Mendo
7

Oktawa, 46 44 40 bajtów

Oszczędność 2 bajtów dzięki jądru @flawr
@ LuisMendo była o 4 bajty krótsza niż w @ flawr.

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

Podobnie jak @ LuisMendo ! Tylko mniej ... golfa.

Możesz to zobaczyć tutaj na ideone .

zlewka
źródło
COMON, właśnie miałem opublikować tę dokładną odpowiedź.
flawr
1
Możesz użyć save 6 bajtów (x='aba')~=x'zamiast[0 1 0;1 0 1;0 1 0]
Luis Mendo
2
@LuisMendo Co to za czary?
zlewka
1
@cat .*to elementowe mnożenie macierzy. Matryca boolowska polega na tym, że MATLAB jest w dużej mierze bez typu, traktowany jako numeryczny. Po M>0prostu działa jak maska.
zlewka
1
(x='aba')~=x'. To po prostu niesamowite @Luis!
Stewie Griffin
2

JavaScript (ES6), 99 94 bajtów

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

Akceptuje i zwraca tablicę dwuwymiarową.

Edycja: Całkowicie przepisane, gdy odkryłem, że domyślne argumenty działają, gdy przekazujesz jawnie niezdefiniowaną wartość, na przykład gdy indeksujesz koniec tablicy.

Neil
źródło
Wersja @Socialz Neils jest starsza.
flawr
@flawr Niektóre osoby mogą patrzeć na ten łańcuch wiadomości w kolejności głosowania, a nie według daty publikacji, dlatego skomentowałem tę powiązaną odpowiedź. Ten jest 4 bajty dłuższy niż użytkownika.
ascx
Więc w zasadzie chcesz zareklamować drugi post?
flawr
@Socialz Był 4 bajty dłużej, tak ;-)
Neil
2

JavaScript (ES6), 95 93 bajtów

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

użytkownik 81655
źródło
1

Python z SciPy, 127 bajtów

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

To oblicza wynik przy użyciu metody Luisa Mendo .

Wypróbuj online

Mego
źródło
0

Mathcad, bajty

Używa standardowego splotu 2D filtrowanej macierzy z jądrem 3x3. Warianty z ujemnymi sumami elementów i jądrem ukośnym również zostały dodane jako kompensacja części dla programu, który nie działa przez co najmniej bajty.

wprowadź opis zdjęcia tutaj


Nie wprowadzono liczby bajtów, ponieważ ocena Mathcada nie została jeszcze ustalona. Jednak przy użyciu równoważności klawiatury jest to obszar 28 bajtów, przy założeniu, że dane wejściowe macierzy nie liczą się do sumy.

Zauważ, że to, co widzisz na powyższym obrazku, jest dokładnie tym, jak rozwiązanie jest wprowadzane i wyświetlane w Mathcadzie.

Stuart Bruff
źródło
0

Galaretka, 23 20 18 bajtów

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

Wypróbuj online!

Algorytm

Powiedzmy, że jest tylko jeden wiersz: [1,2,3,4].

Powiedzmy, że A jest wynikiem przygotowania zera, tj. [0,1,2,3,4].

B jest wynikiem usunięcia pierwszego elementu, tj. [2,3,4].

Następnie końcowy wynik jest po prostu wektoryzowany A + B, a następnie usuwa ostatni element.

Teraz algorytm ma zastosować to do każdego wiersza, a także do każdej kolumny, a następnie znaleźć ich wektoryzowaną sumę.

Do każdej kolumny ?! Myślałem, że Jelly nie obsługuje tego ...

Masz rację. Dlatego transponowałem go, zastosowałem do każdego rzędu, a następnie transponowałem ponownie.

Algorytm usuwania liczb ujemnych

Tutaj po prostu dodajesz do każdej liczby ich absolut. Skutecznie eliminuje liczby ujemne, podwajając każdą liczbę dodatnią. Następnie połowę całej matrycy.

Leaky Nun
źródło