Coding Challenges

Giải Task Excel Thực Tế Với Python Programming | 07 Challenges Allocation & Logistics | #01

#01:  Allocating Funds Over Time Based On A Starting Date & Predefined Multipliers | PythonDA Course
  • Amount = 250 (A5) – Start = 1/31/2023 (B5).
    • At Month (C2) được hiểu ngay tại start –> Thời điểm: 1/31/2023 (B5). Giá trị: 250×0.1=25 (Output C5).
    • 2 Months After (D2) –> Thời điểm: 1/31/2023 + 2 tháng = 3/31/2023. Giá trị: 250×0.2=50 (Output E5).
    • 4 Months After (E2) –> Thời điểm: 1/31/2023 + 4 tháng = 5/31/2023. Giá trị: 250×0.3=75 (Output G5).
    • 8 Months After (F2) –> Thời điểm: 1/31/2023 + 8 tháng = 9/30/2023. Giá trị: 250×0.4=100 (Output K5).
  • Chỉ tính đến tháng 09/2023. Nếu kết quả vượt quá tháng 09/2023, giá trị sẽ không được điền.
  • File thực hành + Code Python: Click Here
#02:  FIFO Inventory Method & COGS Calculation | PythonDA Course
  • 3/1/2021 (I2) – Bán 120 đơn vị Product X (K2):
    • Áp dụng FIFO:
      • Lấy 100 đơn vị từ lô mua ngày 1/1/2021 (A2) (COGS = 10).
      • Lấy 20 đơn vị từ lô mua ngày 2/1/2021 (A4) (COGS = 12).
    • Tổng chi phí (Cost) cho 120 đơn vị: (100×10)+(20×12)=1000+240=1240
    • COGS bình quân cho mỗi đơn vị: Tổng chi phí / Số lượng bán = 1240 /120 = 10.33 (Output L2). Output M2 = K2 * L2.
    • Output F2: cập nhật lại số lượng còn lại sau khi đã bán.
    • Output G2: cập nhật Log (số lượng xuất – ngày bán || …)
  • 3/12/2021 (I3) – Bán 30 đơn vị Product X (K3):
    • Áp dụng FIFO và cách tình tương tự như trên.
  • File thực hành + Code Python: Click Here
#03:  A 40/60 Rule for Monthly Allocation | PythonDA Course
  • 40% phân phối trong 30 ngày đầu tiên – 60% phân phối trong 30 ngày tiếp theo
    • 40% của giá trị tháng hiện tại sẽ được phân phối đều trong 30 ngày đầu tiên. Nếu tháng hiện tại có ít hơn 30 ngày còn lại, phần giá trị chưa phân phối hết sẽ được chuyển sang tháng tiếp theo.
    • Sau khi phân phối 40%, 60% còn lại sẽ được phân phối đều trong 30 ngày tiếp theo. Nếu có ngày dư từ phân phối 40% (do tháng hiện tại không đủ 30 ngày), những ngày này sẽ được cộng vào 30 ngày của phân phối 60%.
  • Tháng 2 (A2) – Tổng giá trị (Sum_of_Val): 1556
    • Tính 40% và 60% của giá trị tháng 2: 40% * 1556 = 622.4, 60% * 1556 = 933.6
    • Phân phối 40% trong 30 ngày đầu tiên
      • Phân phối trong tháng 2. Hôm nay là 24/02/2025, tháng 2 chỉ còn 5 ngày
        • Giá trị phân phối mỗi ngày trong 30 ngày đầu: 622.4 / 30 = 20.75
        • Giá trị phân phối trong 5 ngày của tháng 2 = 20.75 × 5 = 103.73 (Output F2)
      • Phân phối phần còn lại của 40% sang tháng 3 (25 ngày):
        • Giá trị còn lại của 40% = 20.75 × 25 = 518.67.
    • Tháng 3 có 31 ngày, nhưng 25 ngày đầu đã được sử dụng để phân phối 40%. Số ngày còn lại trong tháng 3 là 6 ngày. 6 ngày này sẽ sử dụng 60% vì 40% đã phân phối hết.
      • Giá trị phân phối mỗi ngày trong 30 ngày tiếp theo = 933.6 / 30 = 31.12.
      • Giá trị phân phối trong 6 ngày của tháng 3 (Hết tháng 3) = 31.12 × 6 = 186.72.
      • Tổng giá trị phân phối trong tháng 3 = 518.67 + 186.72 = 705.39 (Output G2)
    • Phân phối phần còn lại của 60% sang tháng 4 (24 ngày): 31.12 * 24 = 746.88 (Output H2)
  • File thực hành + Code Python: Click Here
#04:  Implementing FEFO for Efficient Order Picking | PythonDA Course
  • Coca (Mã hàng 1) – Đơn hàng: 30 (H2)
    • Lô 1: Hạn sử dụng 4/30/2024, tồn kho: 10 (C2) – Lấy hết 10 (Output L2)
    • Còn thiếu: 30 – 10 = 20.
    • Lô 2: Hạn sử dụng 6/30/2024, tồn kho: 50 (C3) – Lấy 20 từ lô này (Output L3)
    • Tồn kho còn lại: 50 – 20 = 30.
  • File thực hành + Code Python: Click Here
#05:  Allocating Sales Against Receipts | PythonDA Course
  • Sale_Bill_Number = 1, Bill_Amt = 5000 (C2):
    • Receipt_Number = 1, Receipt = 3000 (G2)
      • Phân bổ từ Receipt_Number = 1 vào Sale_Bill_Number = 1 với amt = 3000 (Output I2:K2)
      • Bill_Amt còn lại: 5000 – 3000 = 2000 – Receipt còn lại: 3000 – 3000 = 0
    • Receipt_Number = 2, Receipt = 2500 (G3)
      • Phân bổ từ Receipt_Number = 2 vào Sale_Bill_Number = 1 với amt = 2000 (Output I3:K3)
      • Bill_Amt còn lại: 2000 – 2000 = 0 – Receipt còn lại: 2500 – 2000 = 500
    • Sale_Bill_Number = 1 được thanh toán hết
  • Sale_Bill_Number = 2, Bill_Amt = 500 (C3)
    • Receipt_Number = 2, Receipt = 500 (Phần còn lại của receipt 2 sau khi đã thanh toán hết sale_bill 1 ở trên)
      • Phân bổ từ Receipt_Number = 2 vào Sale_Bill_Number = 2 với amt = 500 (Output I4:K4)
      • Bill_Amt còn lại: 500 – 500 = 0 – Receipt còn lại: 500 – 500 = 0
    • Sale_Bill_Number = 2 được thanh toán hết
  • Sale_Bill_Number = 3, Bill_Amt = 800
    • Receipt_Number = 3, Receipt = 300
      • Phân bổ từ Receipt_Number = 3 vào Sale_Bill_Number = 3 với amt = 300 (Output I5:K5)
      • Bill_Amt còn lại: 800 – 300 = 500 – Receipt còn lại: 300 – 300 = 0
    • Receipt_Number = 4, Receipt = 800
      • Phân bổ từ Receipt_Number = 4 vào Sale_Bill_Number = 3 với amt = 500 (Output I6:K6)
      • Bill_Amt còn lại: 500 – 500 = 0 – Receipt còn lại: 800 – 500 = 300
    • Sale_Bill_Number = 3 được thanh toán hết
  • Tương tự cho Sale_Bill_Number = 4, Bill_Amt = 1200
  • File thực hành + Code Python: Click Here
#06: Distributing Application Numbers Among Employees Based on Specific Conditions | PythonDA Course
  • Có danh sách số đơn đăng ký (application numbers) ở cột A và danh sách nhân viên ở các cột từ C đến AA, hàng 03. Mục tiêu là tự động phân chia random đều số đơn này cho các nhân viên theo số được cho tại D1 , nhưng với một số điều kiện đặc biệt:
    • Nếu ô ở hàng 2 (Phía trên tên của nhân viên) có giá trị là “No Assignments”, thì bỏ qua cột đó (không gán đơn cho người đó).
    • Nếu ô ở hàng 4 (Phía dưới tên của nhân viên) có giá trị lớn hơn 40, thì bỏ qua cột đó (không gán đơn cho người đó).
  • File thực hành + Code Python: Click Here
#07: Optimizing Promotion Strategy for Maximum Discounts on Product Purchases | PythonDA Course
  • Danh sách sản phẩm mua cột A: 5 sản phẩm A, B, C, D, E với số lượng cụ thể.
  • Chương trình khuyến mãi cột F: Có 4 chương trình Promotion 4, 5, 6, 7.
  • Sản phẩm áp dụng: Mỗi chương trình chỉ áp dụng cho một số sản phẩm nhất định. Ví dụ: Promotion 4 áp dụng cho A, B, C, E (tức là D không được tính vào chương trình này).
  • Điều kiện khuyến mãi: Mỗi chương trình có điều kiện nhận ưu đãi, ví dụ nếu tổng tiền của các sản phẩm đủ điều kiện vượt mức tiền nào (Dòng 1, cột H-K) thì được giảm ở mức tương ứng.
  • Mỗi chương trình chỉ có thể được áp dụng tối đa 5 lần.
  • Ví dụ: chương trình 4, 5 đều áp dụng được cho sản phẩm C.
    • Sản phẩm C có tổng là 935000 (D4) > 500000 (I1)
    • Như vậy sản phẩm C có thể sẽ nhận được mức khuyến mãi là 18000 và 16000. Ưu tiên lấy mức cao nhất là 18000 (Output O4)
  • File thực hành + Code Python: Click Here