พื้นหลัง
อะตอมเลขคณิตของเยลลี่เวกเตอร์อัตโนมัติ ในความเป็นจริงแล้วx + yนั้นถูกนิยามไว้อย่างดีเมื่อใดก็ตามที่xและyเป็นตัวเลขหรืออาเรย์ของตัวเลข ซอร์สโค้ดของเยลลี่นำพฤติกรรมนี้ไปใช้โดยใช้ vectorizer ทั่วไป แต่สำหรับความท้าทายนี้เราจะพิจารณาเฉพาะการเพิ่มจำนวนเต็มและอาร์เรย์จำนวนเต็มแบบซ้อน
คำนิยาม
กำหนดความลึกของxเป็น0ถ้าxเป็นจำนวนเต็มเป็น1ถ้ามันเป็น (อาจจะเป็นที่ว่างเปล่า) อาร์เรย์แบนของจำนวนเต็มและเป็น1 + nถ้ามีอย่างน้อยหนึ่งองค์ประกอบของความลึกnและองค์ประกอบของความลึกไม่มีk> n .
วิธีนี้1มีความลึก0 , []และ[1]และ[1, 1]มีความลึก1 , [[], []]และ[[1], [1]]และ[1]และ[1] , []]มีความลึก2 , [1, [1, [1]]]มีความลึก3 , ฯลฯ
การดำเนินการx + yถูกกำหนดไว้ดังนี้
หากxและyมีความลึก0ให้ส่งคืนผลรวมของพวกเขา
ถ้าxและy ที่มีระดับความลึกเท่ากัน แต่บวกซ้ำใช้+รายการทั้งหมดของxและรายการที่สอดคล้องกันของปี
หากxและyมีความยาวต่างกันให้ผนวกท้ายของอาร์เรย์ที่ยาวกว่าเข้ากับอาร์เรย์ของผลรวม
ส่งคืนผลลัพธ์
หากความลึกของxน้อยกว่าความลึกของ yอย่างเคร่งครัดให้ใช้+กับxและรายการทั้งหมดของyซ้ำแล้วคืนค่าผลลัพธ์
ทำตรงข้ามถ้าY 's ลึกเป็นอย่างเคร่งครัดมีขนาดเล็กกว่าx ' s
ตัวอย่างเช่นพิจารณาดำเนินการ[1, [2, 3] [4]] + [[[10, 20], [30], 40, 50], 60]
ความลึกของอาร์กิวเมนต์ซ้ายคือ2ในขณะที่ความลึกของอาร์กิวเมนต์ที่ถูกต้องคือ3ดังนั้นเราจึงคำนวณ[1, [2, 3], [4]] + [[10, 20], [30], 40, 50 ]และ[1, [2, 3] [4]] + 60
[1, [2, 3], [4]]และ[[10, 20], [30], 40, 50]ทั้งคู่มีความลึก2ดังนั้นเราจึงคำนวณ1 + [10, 20] , [2, 3] + [30]และ[4] + 40
1 + [10, 20] = [1 + 10, 1 + 20] = [11, 21]
[2, 3] + [30] = [2 + 30, 3] = [32, 3]
โปรดทราบว่า3ยังคงไม่ถูกแตะต้องเนื่องจากไม่มีองค์ประกอบที่ตรงกัน
[4] + 40 = [4 + 40] = [44]
50ไม่ได้มีองค์ประกอบที่ตรงกันดังนั้นผลที่ได้คือ[[[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]]ผลใน[61, [62, 63], [64]]
ผลสุดท้ายคือ[[[11 21] [32 3], [44], 50], [61, [62, 63], [64]]]
งาน
เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้จำนวนเต็มสองจำนวนสองอาร์เรย์ซ้อนกันสองจำนวนเต็มหรือรวมกันเป็นอินพุตและส่งกลับผลรวมของพวกเขาตามที่กำหนดไว้ข้างต้น
หากภาษาของคุณมีประเภทอาเรย์หลายแบบ (รายการ, ทูเปิล, เวกเตอร์และอื่น ๆ ) คุณสามารถเลือกประเภทใดก็ได้สำหรับคำตอบของคุณ ประเภทส่งคืนต้องตรงกับประเภทอาร์กิวเมนต์
เพื่อป้องกันการแก้ปัญหาที่น่าเบื่อและไม่สามารถเอาชนะได้หากภาษามีการดำเนินการที่แน่นอนนี้ในตัวคุณไม่สามารถใช้ภาษานั้นได้
บิวด์อินทั้งหมดของภาษาอื่น ๆ ทั้งหมดได้รับอนุญาต หากภาษาที่คุณเลือกอนุญาตให้ทำเช่นนี้ได้คุณอาจโอเวอร์โหลดและ / หรือกำหนดใหม่เพิ่มเติมในตัว
นี่คือโค้ดกอล์ฟดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ
กรณีทดสอบ
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]]]]
เพื่อสร้างกรณีทดสอบเพิ่มเติมคุณสามารถใช้โปรแกรม Jellyนี้