Biến đổi một ma trận


16

Viết chương trình hoặc hàm trong đó ma trận A (giá trị kích thước tối đa của ma trận là 100) được chuyển thành ma trận mới B. Mỗi phần tử của ma trận B mới là tổng của các lân cận dương của phần tử tương ứng của ma trận A .

Chỉ có hàng xóm theo bốn hướng trực giao được xem xét và các cạnh không quấn quanh.

Ví dụ đầu vào:

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

Đầu ra:

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

Quy tắc:

  • Là đầu vào sử dụng số nguyên.
  • Đây là một , vì vậy mã ngắn nhất tính bằng byte sẽ thắng.

3
Chào mừng bạn đến với Câu đố lập trình & Code Golf! Tất cả các thách thức ở đây đòi hỏi một tiêu chí chiến thắng khách quan, để xác định một cách không thể chối cãi giải pháp nào sẽ giành chiến thắng. Thông thường, đây là mã golf , có nghĩa là mã ngắn nhất tính bằng byte sẽ thắng. Hơn nữa, sẽ rất hữu ích khi chỉ định các định dạng đầu vào / đầu ra hợp lệ (mảng 2d? Chuỗi đơn? V.v.). Cuối cùng, có một số trường hợp cạnh bạn chưa được bảo hiểm; ví dụ, liệu một số có bao giờ chỉ được bao quanh bởi các số âm không?
Doorknob

Cảm ơn bạn. Tôi đoán lên tới [100] [100], và vâng, một số sẽ được bao quanh bởi các số âm.
MT

Những cách chúng ta có thể lấy đầu vào?
Maltysen

1
@Doorknob Tổng của một bộ số trống là 0.
orlp

@Maltysen STDIN, tôi đoán vậy.
MT

Câu trả lời:


10

MATL , 9 byte

t0>*1Y6Z+

Hãy thử trực tuyến!

Giải trình

Ma trận đầu vào được đa diện bởi một mặt nạ thích hợp để làm cho các giá trị âm bằng 0. Sau đó, một tích chập 2D được áp dụng để tính tổng các lân cận của mỗi mục.

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ện thoại có được phép là I / O không?
orlp

Vậy thì, tôi nghi ngờ nếu điều này có thể đánh bại được: p
Adnan

@Adnan Trong Python thì không
R. Kap

4
Anh chàng này đã làm điều này trong khi nghe điện thoại, và tôi đang ở đây, phải dành một phần thời gian của mình để cố gắng giải quyết một số vấn đề này ...
R. Kap

@ R.Kap Tôi có nghĩa là "gõ từ điện thoại" (không phải "gõ trong khi nói chuyện điện thoại"). Xin lỗi về tiếng Anh của tôi :-)
Luis Mendo

7

Octave, 46 44 40 byte

Đã lưu 2 byte nhờ nhân @flawr
@ LuisMendo ngắn hơn 4 byte so với @ flawr's.

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

Giống như câu trả lời của @ LuisMendo ! Chỉ bớt ... chơi gôn.

Bạn có thể thấy nó ở đây trên ideone .


COMON, tôi chỉ định đăng câu trả lời chính xác này.
flawr

1
Bạn có thể sử dụng lưu 6 byte bằng cách sử dụng (x='aba')~=x'thay vì[0 1 0;1 0 1;0 1 0]
Luis Mendo

2
@LuisMendo Phù thủy này là gì?
cốc

1
@cat .*là phép nhân ma trận phần tử. Ma trận boolean là, MATLAB phần lớn không có chữ, được coi là số. Vì vậy, M>0chỉ là hoạt động như một mặt nạ.
cốc thủy tinh

1
(x='aba')~=x'. Điều đó thật tuyệt vời @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)))

Chấp nhận và trả về một mảng hai chiều.

Chỉnh sửa: Viết lại hoàn toàn khi tôi phát hiện ra rằng các đối số mặc định hoạt động khi bạn chuyển một giá trị không xác định rõ ràng, chẳng hạn như khi bạn lập chỉ mục kết thúc một mảng.



@Socialz Neils phiên bản cũ hơn.
flawr

@flawr Một số người có thể đang xem chuỗi tin nhắn này theo thứ tự bỏ phiếu, không phải thứ tự ngày đăng, do đó tôi nhận xét rằng câu trả lời liên quan. Cái này dài hơn 4 byte so với cái của người dùng.
ascx

Vì vậy, về cơ bản bạn muốn quảng cáo bài viết khác ??
flawr

@Socialz Dài hơn 4 byte, vâng ;-)
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`)



0

Mathcad, byte

Sử dụng tích chập 2D tiêu chuẩn của mảng được lọc với hạt nhân 3x3. Các biến có tổng phần tử âm và nhân chéo cũng được thêm vào như là phần bù cho chương trình không chạy trong ít byte nhất.

nhập mô tả hình ảnh ở đây


Không có số byte nào được nhập khi tính điểm Mathcad vẫn chưa được xác định. Tuy nhiên, bằng cách sử dụng tương đương bàn phím, đó là vùng 28 byte giả định rằng đầu vào ma trận không được tính vào tổng số.

Lưu ý rằng những gì bạn nhìn thấy trong hình trên chính xác là cách giải pháp được nhập và hiển thị trong Mathcad.


0

Thạch, 23 20 18 byte

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

Hãy thử trực tuyến!

Thuật toán

Giả sử chỉ có một hàng: [1,2,3,4].

Giả sử A là kết quả của việc trả trước số 0, tức là [0,1,2,3,4].

B là kết quả của việc loại bỏ mục đầu tiên, tức là [2,3,4].

Sau đó, kết quả cuối cùng chỉ đơn giản là A + B được vector hóa, sau đó loại bỏ mục cuối cùng.

Bây giờ, thuật toán là áp dụng điều này cho mọi hàng cũng như mọi cột, sau đó tìm tổng vector của chúng.

Đến từng cột?! Tôi nghĩ rằng Jelly không hỗ trợ điều này ...

Bạn đúng. Do đó, tôi chuyển đổi nó, áp dụng cho từng hàng, sau đó chuyển đổi nó một lần nữa.

Thuật toán để loại bỏ số âm

Ở đây, bạn chỉ cần thêm vào mỗi số tuyệt đối của họ. Nó có hiệu quả loại bỏ các số âm trong khi nhân đôi mỗi số dương. Sau đó, chỉ cần giảm một nửa toàn bộ ma trận.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.