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]
sumber
1
×n
(seperti[1 2 3]
) ataun
×1
(seperti[1; 2; 3]
)Jawaban:
Jelly , 10 byte
Mengambil pasangan matriks (dua array baris) sebagai input dan mengembalikan matriks.
Cobalah online!
Bagaimana itu bekerja
sumber
Arang ,
2523 byteCobalah online! Tautan adalah untuk mengucapkan versi kode. Mengambil input sebagai array 3 dimensi. Penjelasan:
Masukkan semuanya.sumber
MATL ,
2524 byteCobalah online!
Akhirnya! Hanya butuh satu minggu untuk tantangan yang terinspirasi oleh Bahasa Bulan ini untuk dijawab oleh Bahasa Bulan ini!
Dugaan saya adalah bahwa ini tidak sesingkat mungkin, tapi saya cukup senang karena versi awal saya lebih dari 40 byte. sunting: Saya benar, Luis menemukan byte lain untuk dimatikan!
sumber
:
dengan input vektorPython 3 ,
127126125 bytegolf byte dengan mengubah
sum(m)
kem+n
Satu byte lagi berkat @Jonathan Frech
Mengambil input sebagai daftar dua array 2 dimensi.
Z
lambda mengambil dua array sebagai masukan dan mengembalikan sebuah iterator menghasilkan indeks dan digabung nilai-nilai dari kedua array, sampai indeks mencapai panjang array terbesar ini. Variabel indeks tidak berguna bagi saya dan saya biaya byte, tapi saya tidak tahu bagaimana melakukannya tanpa itu ... ( terkait )Z
luar dan dalam. Nilai-nilai terdalam ditambahkan bersama.Cobalah online!
Menggunakan
itertools.cycle
terasa agak seperti curang tapi saya pikir saya sudah cukup dihukum dengan panjangnya pernyataan impor :)Saya yakin ini bisa golf lagi, terutama metode iterasi yang membuat variabel
i
dan tidak berguna inij
. Saya akan berterima kasih atas tips bagaimana golf itu, saya mungkin kehilangan sesuatu yang jelas.sumber
zip
argumen, membalikkanf
penugasan pemahaman, dan dengan demikian menghapus satu spasi (for i,*l
->for*l,i
)? ( 125 byte )?JavaScript (ES6), 131 byte
Bukan alat yang tepat untuk pekerjaan itu, dan mungkin juga bukan pendekatan yang tepat. Oh well ... ¯ \ _ (ツ) _ / ¯
Cobalah online!
Bagaimana?
Fungsi helper g () membuat array yang sebesar array input terbesar ( a atau b ) dan memanggil fungsi callback c di atasnya:
Fungsi helper h () membaca 2D-array a at (x, y) dengan penyiaran modular:
Kode utama sekarang cukup dibaca sebagai:
Versi rekursif, 134 byte
Cobalah online!
sumber
05AB1E , 15 byte
Cobalah online!
Versi lama, 25 byte
Cobalah online!
Penjelasan
15-byter:
25-byter:
sumber
R ,
136 104 103 9593 byteGolf turun
3335 byte mengikuti saran Giuseppe. Berhasil mendapatkan di bawah 100 byte dengan menggunakan operator sebagai nama fungsi. Lihat riwayat untuk kode yang lebih mudah dibaca.Cobalah online!
sumber
apply
danrep.len
apa yang saya pertimbangkan, meskipun saya belum sempat untuk mengodekannya sendiri.dim
, lebih bersih dan membuka pintu untuk generalisasi multi-dimensi dengan panggilan rekursif ker
outer(x,y,"+")
yang berisi semua jumlah yang tepat, dan dalam pola yang jelas. Tidak dapat menemukan cara mengekstraknya secara efisien.K (ngn / k) , 23 byte
Cobalah online!
sumber
05AB1E , 18 byte
Cobalah online!
Penjelasan
sumber
Pyth, 24 byte
Coba di sini
Penjelasan
sumber
Java 8, 172 byte
Cobalah online.
Penjelasan:
sumber
APL (Dyalog Classic) ,
2321 byteCobalah online!
ini bisa menjadi satu-satunya waktu saya mendapatkan kesempatan untuk menggunakan
|[0]
sumber
Python 2 ,
124116 byteCobalah online!
Penjelasan:
Mengambil daftar dua daftar 2-d sebagai input.
sumber
Python 2 ,
10197105 byteSunting: Terima kasih (lagi!) Ke Dead Possum karena menyimpan 4 byte
Sunting 2: kehilangan 8 byte, beberapa kasus uji tidak lulus
Gabungan antara solusi Dead Possum sebelumnya (terima kasih padanya!), Dan solusi Python 3 saya sendiri .
Cobalah online!
Masukan yang sama dengan solusi Python 3 saya (sepasang daftar 2 dimensi).
Kode yang dikomentari:
sumber
Julia 0,6 ,
8583 byteCobalah online!
(Ganti
⧻
dengan\
terima kasih kepada Jo King )Bekerja dengan mengulangi setiap matriks secara horizontal dan vertikal sehingga mereka berdua memiliki ukuran yang sama (produk ukuran baris x produk ukuran kolom), menambahkan mereka ke atas dan mengekstraksi keluar daerah yang benar dari itu. (Input vektor baris atau input vektor kolom perlu
reshape
panggilan untuk dilemparkan sebagai array 2 dimensi, yang saya asumsikan baik-baik saja karena pertanyaannya menentukan "Menerapkan penambahan untuk array dua dimensi" dan "Input dan output dapat diambil oleh cara yang masuk akal. Format mereka fleksibel seperti biasa. ")sumber