Tantangan ini terkait dengan beberapa fitur bahasa MATL, sebagai bagian dari acara Bahasa Bulan Mei 2018 .
pengantar
Dalam MATL, banyak fungsi dua-input berfungsi elemen dengan siaran . Ini berarti yang berikut:
Elemen-bijaksana (atau vektor ): fungsi mengambil input dua array dengan ukuran yang cocok. Operasi yang ditentukan oleh fungsi diterapkan pada setiap pasangan entri yang sesuai. Misalnya, menggunakan notasi pasca-perbaikan:
[2 4 6] [10 20 30] +memberikan ouput
[12 24 36]Ini juga berfungsi dengan array multi-dimensi. Notasi
[1 2 3; 4 5 6]mewakili2×3array (matriks)1 2 3 4 5 6yang memiliki ukuran
2sepanjang dimensi pertama (vertikal) dan3sepanjang dimensi kedua (horizontal). Jadi misalnya[2 4 6; 3 5 7] [10 20 30; 40 60 80] *[20 80 180; 120 300 560]Broadcasting or ( ekspansi tunggal ): dua array input tidak memiliki ukuran yang cocok, tetapi di setiap dimensi yang tidak cocok salah satu array memiliki ukuran
1. Array ini secara implisit direplikasi sepanjang dimensi lain untuk membuat ukuran cocok; dan kemudian operasi diterapkan berdasarkan elemen seperti di atas. Misalnya, pertimbangkan dua larik masukan dengan ukuran1×2dan3×1:[10 20] [1; 2; 5] /Berkat penyiaran, ini setara dengan
[10 20; 10 20; 10 20] [1 1; 2 2; 5 5] /dan itu memberi
[10 20; 5 10; 2 4]Demikian pula, dengan ukuran
3×2dan3×1(penyiaran sekarang hanya berfungsi sepanjang dimensi kedua),[9 8; 7 6; 5 4] [10; 20; 30] +[19 18; 27 26; 35 34]Jumlah dimensi bahkan mungkin berbeda. Misalnya, input dengan ukuran 3 × 2 dan 3 × 1 × 5 kompatibel, dan memberikan hasil 3 × 2 × 5. Bahkan, ukuran 3 × 2 adalah sama dengan 3 × 2 × 1 (ada banyak dimensi trailing tunggal implisit yang sewenang-wenang).
Di sisi lain, sepasang
2×2dan3×1array akan memberikan kesalahan, karena ukuran sepanjang dimensi pertama adalah2dan3: mereka tidak sama dan tidak satupun dari mereka adalah1.
Definisi penyiaran modular
Penyiaran modular adalah generalisasi penyiaran yang berfungsi meskipun tidak ada ukuran yang tidak cocok 1. Pertimbangkan misalnya 2× 2dan 3× 1array berikut sebagai input dari fungsi +:
[2 4; 6 8] [10; 20; 30] +
Aturannya adalah sebagai berikut: untuk setiap dimensi, larik yang lebih kecil di sepanjang dimensi itu direplikasi secara modular (secara siklik) agar sesuai dengan ukuran larik lainnya. Ini akan membuat setara dengan di atas
[2 4; 6 8; 2 4] [10 10; 20 20; 30 30] +
dengan hasilnya
[12 14; 26 28; 32 34]
Sebagai contoh kedua,
[5 10; 15 20] [0 0 0 0; 1 2 3 4; 0 0 0 0; 5 6 7 8; 0 0 0 0] +
akan menghasilkan
[5 10 5 10; 16 22 18 24; 5 10 5 10; 20 26 22 28; 5 10 5 10]
Secara umum, input dengan ukuran a× bdan c× dmemberikan hasil ukuran max(a,b)× max(c,d).
Tantangan
Terapkan penambahan untuk array dua dimensi dengan penyiaran modular seperti yang didefinisikan di atas.
Array akan berbentuk persegi panjang (tidak kasar), hanya akan berisi bilangan bulat non-negatif , dan akan memiliki ukuran setidaknya1 di setiap dimensi.
Aturan tambahan:
Input dan output dapat diambil dengan cara apa pun yang wajar . Formatnya fleksibel seperti biasa.
Program atau fungsi diizinkan, dalam bahasa pemrograman apa pun . Celah standar dilarang .
Kode terpendek dalam byte menang.
Uji kasus
Berikut ini digunakan ;sebagai pemisah baris (seperti pada contoh di atas). Setiap test case menunjukkan dua input dan kemudian output.
[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(seperti [1 2 3]) atau n× 1(seperti [1; 2; 3])