Thử thách này có liên quan đến một số tính năng của ngôn ngữ MATL, như là một phần của sự kiện Ngôn ngữ của tháng 5 năm 2018 .
Giới thiệu
Trong MATL, nhiều hàm hai đầu vào hoạt động theo yếu tố thông minh với phát sóng . Điều này có nghĩa như sau:
Element-khôn ngoan (hoặc vectorized ): hàm lấy làm đầu vào hai mảng với kích thước khớp nhau. Hoạt động được xác định bởi chức năng được áp dụng cho từng cặp mục tương ứng. Ví dụ: sử dụng ký hiệu sửa lỗi:
[2 4 6] [10 20 30] +
đưa ra thông số
[12 24 36]
Điều này cũng hoạt động với các mảng đa chiều. Ký hiệu
[1 2 3; 4 5 6]
đại diện cho mảng2
×3
(ma trận)1 2 3 4 5 6
có kích thước
2
dọc theo chiều thứ nhất (dọc) và3
dọc theo chiều thứ hai (ngang). Ví dụ[2 4 6; 3 5 7] [10 20 30; 40 60 80] *
[20 80 180; 120 300 560]
Phát sóng hoặc ( mở rộng singleton ): hai mảng đầu vào không có kích thước khớp nhau, nhưng trong mỗi kích thước không khớp, một trong các mảng có kích thước
1
. Mảng này được sao chép ngầm dọc theo các kích thước khác để làm cho kích thước khớp với nhau; và sau đó các hoạt động được áp dụng yếu tố khôn ngoan như trên. Ví dụ: hãy xem xét hai mảng đầu vào có kích thước1
×2
và3
×1
:[10 20] [1; 2; 5] /
Nhờ phát sóng, điều này tương đương với
[10 20; 10 20; 10 20] [1 1; 2 2; 5 5] /
và vì vậy nó mang lại
[10 20; 5 10; 2 4]
Tương tự, với kích thước
3
×2
và3
×1
(giờ chỉ phát theo chiều thứ hai),[9 8; 7 6; 5 4] [10; 20; 30] +
[19 18; 27 26; 35 34]
Số lượng kích thước thậm chí có thể khác nhau. Ví dụ: các đầu vào có kích thước 3 × 2 và 3 × 1 × 5 tương thích và cho kết quả 3 × 2 × 5. Trong thực tế, kích thước 3 × 2 giống như 3 × 2 × 1 (có nhiều kích thước đơn lẻ ẩn ý tùy ý).
Mặt khác, một cặp
2
×2
và3
×1
mảng sẽ cung cấp cho một lỗi, vì kích thước dọc theo chiều đầu tiên là2
và3
: họ không bình đẳng và không ai trong số họ là1
.
Định nghĩa phát sóng mô-đun
Phát sóng mô-đun là một khái quát của phát sóng hoạt động ngay cả khi không có kích thước không phù hợp 1
. Ví dụ, xem xét các mảng × và 2
× sau đây làm đầu vào của hàm :2
3
1
+
[2 4; 6 8] [10; 20; 30] +
Quy tắc như sau: đối với mỗi kích thước, mảng nhỏ hơn dọc theo chiều đó được sao chép theo mô-đun (theo chu kỳ) để phù hợp với kích thước của mảng khác. Điều này sẽ làm cho ở trên tương đương với
[2 4; 6 8; 2 4] [10 10; 20 20; 30 30] +
Với kết quả
[12 14; 26 28; 32 34]
Như một ví dụ thứ hai,
[5 10; 15 20] [0 0 0 0; 1 2 3 4; 0 0 0 0; 5 6 7 8; 0 0 0 0] +
sẽ sản xuất
[5 10 5 10; 16 22 18 24; 5 10 5 10; 20 26 22 28; 5 10 5 10]
Nói chung, các đầu vào có kích thước a
× b
và c
× d
cho kết quả là kích thước max(a,b)
× max(c,d)
.
Các thách thức
Triển khai bổ sung cho mảng hai chiều với phát sóng theo mô-đun như được định nghĩa ở trên.
Các mảng sẽ có hình chữ nhật (không bị rách), sẽ chỉ chứa các số nguyên không âm và sẽ có kích thước ít nhất1
trong mỗi chiều.
Quy tắc bổ trợ:
Đầu vào và đầu ra có thể được thực hiện bằng bất kỳ phương tiện hợp lý . Định dạng của họ là linh hoạt như bình thường.
Các chương trình hoặc chức năng được cho phép, trong bất kỳ ngôn ngữ lập trình . Sơ hở tiêu chuẩn bị cấm .
Mã ngắn nhất trong byte thắng.
Các trường hợp thử nghiệm
Sau đây sử dụng ;
như dấu phân cách hàng (như trong các ví dụ ở trên). Mỗi trường hợp thử nghiệm cho thấy hai đầu vào và sau đó đầu ra.
[2 4; 6 8]
[10; 20; 30]
[12 14; 26 28; 32 34]
[5 10; 15 20]
[0 0 0 0; 1 2 3 4; 0 0 0 0; 5 6 7 8; 0 0 0 0]
[5 10 5 10; 16 22 18 24; 5 10 5 10; 20 26 22 28; 5 10 5 10]
[1]
[2]
[3]
[1; 2]
[10]
[11; 12]
[1 2 3 4 5]
[10 20 30]
[11 22 33 14 25]
[9 12 5; 5 4 2]
[4 2; 7 3; 15 6; 4 0; 3 3]
[13 14 9;12 7 9;24 18 20;9 4 6;12 15 8]
[9 12 5; 5 4 2]
[4 2 6 7; 7 3 7 3; 15 6 0 1; 4 0 1 16; 3 3 3 8]
[13 14 11 16; 12 7 9 8; 24 18 5 10; 9 4 3 21; 12 15 8 17]
[6 7 9]
[4 2 5]
[10 9 14]
1
× n
(chẳng hạn như [1 2 3]
) hoặc n
× 1
(chẳng hạn [1; 2; 3]
)