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
×3
array (matriks)1 2 3 4 5 6
yang memiliki ukuran
2
sepanjang dimensi pertama (vertikal) dan3
sepanjang 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
×2
dan3
×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
×2
dan3
×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
×2
dan3
×1
array akan memberikan kesalahan, karena ukuran sepanjang dimensi pertama adalah2
dan3
: 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
× 2
dan 3
× 1
array 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
× b
dan c
× d
memberikan 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]
)