# # nested loop 1 # # ให้ x0 เป็นลิสต์ของจำนวนเต็ม n ตัวที่ประกอบด้วย [x00, x01, x02,..., x0k] โดยที่ k = n-1 หา x1 ได้โดยเอาตัวที่ติดกันของ x0 มาบวกกันไปเรื่อย จะได้ [x00+x01, x01+x02, ..., x0k-1 + x0k] ด้วยวิธิการนี้ ถ้าให้ j = i+1 เราสามารถหา xj ได้จาก xi xj = [xi0+xi1, xi1+xi2, ..., ผลรวมของสองค่าสุดท้ายใน xi] def f(x0): # คืนค่าเป็นลิสต์ [x0, x1, x2, ..., xk] โดยที่ x0, x1, ..., xk หาได้จากวิธีข้างบน และ xk จะเป็นลิสต์ที่มีขนาดเท่ากับ 1 return r #------------------------------ # solution def f(x): z = [x] for i in range(len(x),1,-1): r = [] for j in range(i-1): r.append(x[j]+x[j+1]) z.append(r) x = r return z #------------------------------ # # nested loop 2 # # กำหนดให้ x เป็น ลิสต์ซ้อนลิสต์ [x0, x1, x2, ..., xk] โดยที่ xi เป็นลิสต์ของจำนวนเต็มที่อาจจะมีจำนวนเป็นเลขคี่เสมอ [3, 3, 1] [2, 4, 1, 2, 4, 5, 6] [2] ฟังก์ชั่น expand(x) จะสร้างลิสต์ใหม่ที่ขยายลิสต์ x ให้ลิสต์ย่อยใน x ให้ทุกตัวมีขนาดเท่ากับตัวที่ใหญ่ที่สุด โดยจะเอาลิสต์มาเทียบกันให้ตัวกลางอยู่ตรงกัน แล้วตัวที่สั้นกว่าก็จะถูกขยายโดยเอาตัวซ้ายสุดเติมไปข้างซ้าย และเอาตัวขวาสุดเติมทางข้างขวาจนได้ขนาดที่เท่ากัน เช่น [3, 3, 1] [2, 4, 1, 2, 4, 5, 6] ได้เป็น [3, 3, 1] [2, 4, 1, 2, 4, 5, 6] เติม 3 ทางซ้าย และเติม 1 ทางขวา ได้เป็น [3, 3, 3, 3, 1, 1, 1] [2, 4, 1, 1, 2, 5, 6] [2] -> [2, 2, 2, 2, 2, 2, 2] #-------------------- # solution def expand(x): max_len = len(x[0]) for i in range(1, len(x)): if len(x[i]) > max_len: max_len = len(x[i]) z = [] for d in x: n = len(d) if n < max_len: diff = (max_len - n) // 2 for i in range(diff): d = [d[0]] + d + [d[-1]] z.append(d) return z x0 = [3, 3, 1] x1 = [2, 4, 1, 2, 4, 5, 6] x2 = [2] x = [x0, x1, x2] print(expand(x))