Lý lịch
Các nguyên tử số học của Jelly tự động hóa vector. Trong thực tế, x + y được xác định rõ bất cứ khi nào x và y là các số hoặc các mảng số bị rách. Mã nguồn của Jelly thực hiện hành vi này bằng cách sử dụng một vectơ chung, nhưng đối với thử thách này, chúng tôi sẽ chỉ xem xét bổ sung các số nguyên và mảng số nguyên lồng nhau.
Các định nghĩa
Xác định độ sâu của x là 0 nếu x là số nguyên, vì 1 nếu đó là một mảng số nguyên phẳng (có thể trống) và là n + 1 nếu nó chứa ít nhất một phần tử có độ sâu n và không có phần tử nào có độ sâu k> n .
Theo cách này, 1 có độ sâu 0 , [] và [1] và [1, 1] có độ sâu 1 , [[], []] và [[1], [1]] và [[1]] và [1 , []] có độ sâu 2 , [1, [1, [1]]] có độ sâu 3 , v.v.
Thao tác x + y được định nghĩa như sau.
Nếu x và y có độ sâu 0 , trả về tổng của chúng.
Nếu x và y có độ sâu bằng nhau nhưng dương, áp dụng đệ quy + cho tất cả các mục của x và các mục tương ứng của y .
Nếu x và y có độ dài khác nhau, nối phần đuôi của mảng dài hơn vào mảng tổng.
Trả lại kết quả.
Nếu độ sâu của x nhỏ hơn độ sâu của y , hãy áp dụng đệ quy + cho x và tất cả các mục của y và trả về kết quả.
Làm ngược lại nếu độ sâu của y nhỏ hơn hoàn toàn so với x .
Ví dụ: xem xét thao tác [1, [2, 3], [4]] + [[[10, 20], [30], 40, 50], 60] .
Độ sâu của đối số bên trái là 2 , trong khi độ sâu của đối số bên phải là 3 , vì vậy chúng tôi tính toán [1, [2, 3], [4]] + [[10, 20], [30], 40, 50 ] và [1, [2, 3], [4]] + 60 .
[1, [2, 3], [4]] và [[10, 20], [30], 40, 50] đều có độ sâu 2 , vì vậy chúng tôi tính 1 + [10, 20] , [2, 3] + [30] và [4] + 40 .
1 + [10, 20] = [1 + 10, 1 + 20] = [11, 21]
[2, 3] + [30] = [2 + 30, 3] = [32, 3]
Lưu ý rằng 3 vẫn chưa được xử lý, vì nó không có yếu tố phù hợp.
[4] + 40 = [4 + 40] = [44]
50 không có một yếu tố phù hợp, vì vậy kết quả là [[[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]] , dẫn đến [61, [62, 63], [64]] .
Kết quả cuối cùng là [[[11, 21], [32, 3], [44], 50], [61, [62, 63], [64]]] .
Bài tập
Viết chương trình hoặc hàm lấy hai số nguyên, hai mảng số nguyên lồng nhau hoặc kết hợp chúng làm đầu vào và trả về tổng của chúng, như được định nghĩa ở trên.
Nếu ngôn ngữ của bạn có nhiều loại giống như mảng (danh sách, bộ dữ liệu, vectơ, v.v.), bạn có thể chọn bất kỳ loại nào cho câu trả lời của mình. Kiểu trả về phải khớp với kiểu đối số.
Để ngăn chặn các giải pháp nhàm chán và không thể đánh bại, nếu một ngôn ngữ có hoạt động chính xác này dưới dạng tích hợp, bạn không được sử dụng ngôn ngữ đó.
Tất cả các ngôn ngữ tích hợp của tất cả các ngôn ngữ khác đều được cho phép. Nếu ngôn ngữ bạn chọn cho phép điều này, bạn có thể quá tải và / hoặc xác định lại bổ sung tích hợp.
Đây là mã golf , vì vậy mã ngắn nhất tính bằng byte sẽ thắng.
Các trường hợp thử nghiệm
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]]]]
Để tạo thêm các trường hợp thử nghiệm, bạn có thể sử dụng chương trình Jelly này .