Transformasikan sebuah matriks

16

Tulis sebuah program atau fungsi di mana matriks A (nilai maksimum dimensi matriks adalah 100) ditransformasikan ke matriks baru B. Setiap elemen dari matriks B baru adalah jumlah tetangga positif dari elemen yang sesuai dari matriks A .

Hanya tetangga di empat arah orthogonal yang dipertimbangkan, dan ujung-ujungnya tidak membungkus.

Contoh input:

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

Keluaran:

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

Aturan:

  • Sebagai input gunakan bilangan bulat.
  • Ini adalah , jadi kode terpendek dalam byte menang.
MT
sumber
3
Selamat Datang di Programming Puzzles & Code Golf! Semua tantangan di sini membutuhkan kriteria kemenangan yang objektif, untuk menentukan solusi mana yang harus dimenangkan. Biasanya, ini adalah kode-golf , yang berarti kode terpendek dalam byte menang. Selanjutnya, akan sangat membantu untuk menentukan format input / output yang valid (array 2d? Single string? Dll.). Akhirnya, ada beberapa kasus tepi yang belum Anda liput; misalnya, apakah suatu angka akan dikelilingi hanya oleh angka negatif?
Gagang Pintu
Terima kasih. Saya kira hingga [100] [100], dan ya suatu angka akan dikelilingi oleh angka negatif.
MT
Dengan cara apa kita bisa mendapat masukan?
Maltysen
1
@Doorknob Jumlah himpunan angka kosong adalah 0.
orlp
@Maltysen STDIN, kurasa.
MT

Jawaban:

10

MATL , 9 byte

t0>*1Y6Z+

Cobalah online!

Penjelasan

Matriks input di-multplied oleh mask yang sesuai untuk membuat nilai negatif sama dengan 0. Kemudian konvolusi 2D diterapkan untuk menghitung jumlah tetangga dari setiap entri.

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
sumber
4
Apakah ponsel diizinkan sebagai I / O?
orlp
Kalau begitu, saya ragu apakah ini bisa dikalahkan: p
Adnan
@ Adnan Dengan Python bukan
R. Kap
4
Orang ini melakukan ini ketika sedang berbicara di telepon, dan di sinilah saya, harus mendedikasikan sebagian waktu saya untuk mencoba menyelesaikan beberapa masalah ini ...
R. Kap
@ R.Kap saya maksudkan "mengetik dari telepon" (bukan "mengetik saat berbicara di telepon"). Maaf tentang bahasa Inggris saya :-)
Luis Mendo
7

Oktaf, 46 44 40 byte

Disimpan 2 byte berkat @flawr
@ LuisMendo kernel 4 byte lebih pendek dari @ flawr.

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

Sama seperti jawaban @ LuisMendo ! Hanya kurang ... golf.

Anda bisa melihatnya di sini ideone .

gelas kimia
sumber
COMON, saya baru saja memposting jawaban yang tepat ini.
flawr
1
Anda dapat menggunakan save 6 bytes menggunakan (x='aba')~=x'bukan[0 1 0;1 0 1;0 1 0]
Luis Mendo
2
@LuisMendo Apa sihir ini?
Gelas kimia
1
@cat .*adalah perkalian matriks elemen-bijaksana. Matriks boolean adalah, MATLAB menjadi sebagian besar tanpa jenis, diperlakukan sebagai numerik. Jadi M>0hanya bertindak sebagai topeng.
Gelas kimia
1
(x='aba')~=x'. @Luis sangat luar biasa!
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)))

Menerima dan mengembalikan array dua dimensi.

Sunting: Sepenuhnya ditulis ulang ketika saya menemukan bahwa argumen default berfungsi ketika Anda memberikan nilai yang tidak ditentukan secara eksplisit, seperti ketika Anda mengindeks akhir array.

Neil
sumber
Versi @Socialz Neils lebih tua.
flawr
@ flawr Beberapa orang mungkin melihat rantai pesan ini dalam urutan suara, bukan urutan tanggal posting, oleh karena itu saya berkomentar terkait jawaban itu. Yang ini 4 byte lebih panjang dari yang pengguna.
ascx
Jadi pada dasarnya Anda ingin mengiklankan pos lainnya ??
flawr
@Socialz Lebih lama 4 byte, ya ;-)
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`)

pengguna81655
sumber
1

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

Ini menghitung hasilnya menggunakan metode Luis Mendo .

Cobalah online

Mego
sumber
0

Mathcad, byte

Menggunakan konvolusi 2D standar dari array yang difilter dengan kernel 3x3. Varian dengan jumlah elemen negatif dan kernel diagonal juga ditambahkan sebagai bagian kompensasi untuk program yang tidak sedang berjalan untuk sedikitnya byte.

masukkan deskripsi gambar di sini


Tidak ada jumlah byte yang dimasukkan karena skor Mathcad belum ditentukan. Namun, menggunakan kesetaraan keyboard, itu adalah wilayah 28 byte dengan asumsi bahwa input matriks tidak dihitung terhadap total.

Perhatikan bahwa apa yang Anda lihat pada gambar di atas adalah bagaimana solusi dimasukkan dan ditampilkan dalam Mathcad.

Stuart Bruff
sumber
0

Jelly, 23 20 18 byte

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

Cobalah online!

Algoritma

Katakanlah hanya ada satu baris: [1,2,3,4].

Katakanlah A adalah hasil dari penjumlahan nol, yaitu [0,1,2,3,4].

B adalah hasil dari penghapusan item pertama, yaitu [2,3,4].

Maka hasil akhirnya hanyalah A + B yang di-vektor-kan, kemudian menghapus item terakhir.

Sekarang, algoritmanya adalah untuk menerapkan ini pada setiap baris dan juga setiap kolom, kemudian menemukan jumlah vektornya.

Ke setiap kolom ?! Saya pikir Jelly tidak mendukung ini ...

Kamu benar. Karena itu, saya memindahkannya, diterapkan pada setiap baris, lalu memindahkannya lagi.

Algoritma untuk menghilangkan angka negatif

Di sini, Anda tinggal menambahkan ke setiap angka absolut mereka. Secara efektif menghilangkan angka negatif sambil menggandakan setiap angka positif. Kemudian, potong setengah seluruh matriks.

bocor Nun
sumber
0

Pyth, 36 byte

Lm+Vt+d0+0dbJmm/+.akk2dQ.b+VNYyJCyCJ

Cobalah online!

Terjemahan langsung dari jawaban saya di Jelly .

bocor Nun
sumber