Latar Belakang
Atom aritmatika Jelly melakukan vektorisasi secara otomatis. Faktanya, x + y didefinisikan dengan baik setiap kali x dan y adalah angka atau array angka yang kasar. Kode sumber Jelly mengimplementasikan perilaku ini menggunakan vektorizer generik, tetapi untuk tantangan ini, kami hanya akan mempertimbangkan penambahan integer dan array integer bersarang.
Definisi
Tentukan kedalaman x sebagai 0 jika x adalah bilangan bulat, sebagai 1 jika itu adalah array datar (mungkin kosong) dari bilangan bulat, dan sebagai n + 1 jika berisi setidaknya satu elemen kedalaman n dan tidak ada elemen kedalaman k> n .
Dengan cara ini, 1 memiliki kedalaman 0 , [] dan [1] dan [1, 1] memiliki kedalaman 1 , [[], []] dan [[1], [1]] dan [[1]] dan [1] , []] memiliki kedalaman 2 , [1, [1, [1]]] memiliki kedalaman 3 , dll.
Operasi x + y didefinisikan sebagai berikut.
Jika x dan y memiliki kedalaman 0 , kembalikan jumlahnya.
Jika x dan y memiliki kedalaman yang sama tetapi positif, terapkan secara + untuk semua item x dan item yang sesuai dari y .
Jika x dan y memiliki panjang yang berbeda, tambahkan ekor array yang lebih panjang ke array jumlah.
Kembalikan hasilnya.
Jika kedalaman x benar-benar lebih kecil dari kedalaman y , terapkan secara rekursif + ke x dan semua item y , dan kembalikan hasilnya.
Lakukan sebaliknya jika kedalaman y benar-benar lebih kecil dari x .
Misalnya, pertimbangkan operasi [1, [2, 3], [4]] + [[[10, 20], [30], 40, 50], 60] .
Kedalaman argumen kiri adalah 2 , sedangkan kedalaman argumen kanan adalah 3 , jadi kami menghitung [1, [2, 3], [4]] + [[10, 20], [30], 40, 50 ] dan [1, [2, 3], [4]] + 60 .
[1, [2, 3], [4]] dan [[10, 20], [30], 40, 50] keduanya memiliki kedalaman 2 , jadi kami menghitung 1 + [10, 20] , [2, 3] + [30] dan [4] + 40 .
1 + [10, 20] = [1 + 10, 1 + 20] = [11, 21]
[2, 3] + [30] = [2 + 30, 3] = [32, 3]
Perhatikan bahwa 3 tetap tidak tersentuh, karena tidak memiliki elemen yang cocok.
[4] + 40 = [4 + 40] = [44]
50 tidak memiliki unsur yang cocok, sehingga hasilnya adalah [[[11, 21], [32, 3], [44], 50]] .[1, [2, 3], [4]] + 60 = [1 + 60, [2, 3] + 60, [4] + 60] = [61, [2 + 60, 3 + 60], [ 4 + 60]] , menghasilkan [61, [62, 63], [64]] .
Hasil akhirnya adalah [[[11, 21], [32, 3], [44], 50], [61, [62, 63], [64]]] .
Tugas
Tulis program atau fungsi yang mengambil dua bilangan bulat, dua array bertumpuk dari bilangan bulat atau kombinasi keduanya sebagai input dan mengembalikan jumlah mereka, sebagaimana didefinisikan di atas.
Jika bahasa Anda memiliki beberapa jenis seperti array (daftar, tupel, vektor, dll.) Anda dapat memilih salah satu dari mereka untuk jawaban Anda. Jenis kembali harus cocok dengan jenis argumen.
Untuk mencegah solusi yang membosankan dan tidak ada duanya, jika suatu bahasa memiliki ketepatan ini operasi yang sebagai bawaan, Anda mungkin tidak menggunakan bahasa itu.
Semua bawaan dari semua bahasa lain diizinkan. Jika bahasa pilihan Anda mengizinkan ini, Anda mungkin kelebihan beban dan / atau mendefinisikan ulang penambahan bawaan.
Ini adalah kode-golf , jadi kode terpendek dalam byte menang.
Uji kasus
0 + 0 = 0
[-1, 0, -1] + [1] = [0, 0, -1]
[] + [0] = [0]
[] + 0 = []
[] + [] = []
[[], 0] + [] = [[], []]
[1, 2, 3] + 10 = [11, 12, 13]
[1, 2, 3] + [10] = [11, 2, 3]
[1, 2, 3] + [10, [20]] = [[11, 12, 13], [21, 2, 3]]
[1, 2, 3, []] + [10, [20]] = [11, [22], 3, []]
[1, [2, [3, [4]]]] + [10, [20]] = [[11, [21]], [[12, [22]], [13, [24]]]]
Untuk menghasilkan lebih banyak kasus uji, Anda dapat menggunakan program Jelly ini .