การซ้อนกล่องอย่างหนัก


27

คุณมีกล่องจำนวนมากและคุณต้องการกองซ้อนในจำนวนที่น้อยที่สุดที่เป็นไปได้ ปัญหาคือคุณไม่สามารถซ้อนกล่องมากกว่าหนึ่งกล่องบนกล่องรองรับได้ดังนั้นกล่องที่หนักกว่าต้องอยู่ด้านล่างของสแต็ก

ความท้าทาย

อินพุต : รายการน้ำหนักของกล่องทั้งหมดเป็นกิโลกรัม

ผลลัพธ์ : รายการของรายการที่อธิบายถึงสแต็กของกล่อง ต้องใช้จำนวนสแต็กน้อยที่สุดที่เป็นไปได้สำหรับอินพุต ในการเป็นสแต็กที่ถูกต้องน้ำหนักของแต่ละกล่องในสแต็กจะต้องมากกว่าหรือเท่ากับผลรวมของน้ำหนักของกล่องทั้งหมดข้างบน

ตัวอย่างของสแต็คที่ถูกต้อง

(เรียงลำดับจากล่างขึ้นบน)

  • [3]
  • [1, 1]
  • [3, 2, 1]
  • [4, 2, 1, 1]
  • [27, 17, 6, 3, 1]
  • [33, 32, 1]
  • [999, 888, 99, 11, 1]

ตัวอย่างของกองที่ไม่ถูกต้อง

(ตามลำดับจากล่างขึ้นบน)

  • [1, 2]
  • [3, 3, 3]
  • [5, 5, 1]
  • [999, 888, 777]
  • [4, 3, 2]
  • [4321, 3000, 1234, 321]

ตัวอย่างกรณีทดสอบ

1

IN: [1, 2, 3, 4, 5, 6, 9, 12]
OUT: [[12, 6, 3, 2, 1], [9, 5, 4]]

2

IN: [87, 432, 9999, 1234, 3030]
OUT: [[9999, 3030, 1234, 432, 87]]

3

IN: [1, 5, 3, 1, 4, 2, 1, 6, 1, 7, 2, 3]
OUT: [[6, 3, 2, 1], [7, 4, 2, 1], [5, 3, 1, 1]]

4

IN: [8, 5, 8, 8, 1, 2]
OUT: [[8, 8], [8, 5, 2, 1]]

กฎและข้อสมมติฐาน

  • ใช้กฎ I / O มาตรฐานและช่องว่างที่ถูกแบน
  • ใช้รูปแบบที่สะดวกสำหรับ I / O
    • สแต็กอาจอธิบายจากบนลงล่างหรือล่างขึ้นบนตราบใดที่คุณมีความสอดคล้อง
    • ลำดับของสแต็ก (แทนที่จะเป็นกล่องภายในสแต็คเหล่านั้น) ไม่สำคัญ
    • คุณอาจใช้กล่องอินพุตเป็นรายการที่จัดเรียงไว้ล่วงหน้า คำสั่งซื้อไม่มีความสำคัญอย่างยิ่งต่อการป้อนข้อมูลตราบใดที่ปัญหาทั่วไปไม่ได้รับการแก้ไขด้วยการเรียงลำดับเอง
  • หากมีการตั้งค่าสแต็คที่เหมาะสมมากกว่าหนึ่งคุณอาจส่งออกหนึ่งในนั้น
  • คุณอาจสมมติว่ามีอย่างน้อยหนึ่งกล่องและกล่องทั้งหมดมีน้ำหนักอย่างน้อย 1 กิโลกรัม
  • คุณต้องรองรับน้ำหนักสูงสุด 9,999 กิโลกรัมเป็นอย่างต่ำ
  • คุณต้องสนับสนุนกล่องรวมสูงสุด 9,999 กล่องเป็นอย่างต่ำ
  • กล่องที่มีน้ำหนักเท่ากันนั้นแยกไม่ออกดังนั้นจึงไม่จำเป็นต้องใส่คำอธิบายประกอบที่ใช้

มีความสุขในการเล่นกอล์ฟ! โชคดี!


2
เราจะรับน้ำหนักเรียงตามลำดับได้ไหม? (ขึ้นหรือลง)
Arnauld

4
"คุณต้องสนับสนุนกล่องรวมสูงสุด 9,999 กล่องเป็นอย่างน้อย" ตีความ "สนับสนุน" ที่นี่เป็นอย่างไร มันหมายความว่าโปรแกรมควรจะสามารถใช้ขนาดของการป้อนข้อมูลหรือหมายความว่าโปรแกรมควรให้คำตอบจริงในเวลาที่เหมาะสมหรือไม่? หากเป็นกรณีหลังควรมีกรณีทดสอบขนาดใหญ่กว่านี้มาก
โจเอล

1
กรณีทดสอบที่แนะนำ: [8, 8, 8, 5, 1]->[[8, 8], [8, 5, 1]]
Hiatsu

3
หรือดียิ่งขึ้น: [8, 5, 8, 8, 1, 2]->[[8, 8], [8, 5, 2, 1]]
Hiatsu

2
@Arnauld เนื่องจากไม่เช่นนั้นจะเพิ่มโค้ดการเรียงลำดับที่ไม่น่าสนใจให้กับคำตอบฉันจะบอกว่าใช่คุณสามารถใช้อินพุตในการเรียงลำดับ
Beefster

คำตอบ:


5

เยลลี่ขนาด 19 ไบต์

Œ!ŒṖ€ẎṖÄ>ḊƲ€¬ȦƊƇLÞḢ

ลองออนไลน์!

ชัดเจน -3 ขอบคุณNick Kennedy ...

บนลงล่าง

คำอธิบาย:

Œ!ŒṖ€ẎṖÄ>ḊƲ€¬ȦƊƇLÞḢ  Arguments: S (e.g. [1, 2, 3, 4, 5])
Œ!                   Permutations (e.g. [..., [4, 1, 5, 2, 3], ...])
    €                Map link over left argument (e.g. [..., [..., [[4, 1], [5], [2, 3]], ...], ...])
  ŒṖ                  Partitions (e.g. [..., [[4, 1], [5], [2, 3]], ...])
     Ẏ               Concatenate elements (e.g. [..., ..., [[4, 1], [5], [2, 3]], ..., ...])
               Ƈ     Filter by link (e.g. [..., [[1, 3], [2], [4], [5]], ...])
              Ɗ       Create >=3-link monadic chain (e.g. [[1], [], [0]])
           €           Map link over left argument (e.g. [[1], [], [0]])
          Ʋ             Create >=4-link monadic chain (e.g. [1])
      Ṗ                  Remove last element (e.g. [4])
       Ä                 Cumulative sum (e.g. [4])
         Ḋ               [Get original argument] Remove first element (e.g. [1])
        >                Greater than (vectorizes) (e.g. [1])
            ¬          Logical NOT (vectorizes) (e.g. [[0], [], [1]])
             Ȧ         Check if non-empty and not containing zeroes after flattening (e.g. 0)
                 Þ   Sort by link (e.g. [[[1, 2, 3], [4, 5]], ..., [[5], [4], [3], [2], [1]]])
                L     Length (e.g. 4)
                  Ḣ  Pop first element (e.g. [[1, 2, 3], [4, 5]])

มีโอกาสที่รุ่นที่มีขนาดกะทัดรัดน้อยกว่าพร้อมคำอธิบายไหม? ฉันเรียนรู้จากสิ่งเหล่านั้น
John Keates

1
@JohnKeates เพิ่มแล้ว
Erik the Outgolfer

5

JavaScript (Node.js)  139 122  116 ไบต์

คาดว่าอินพุตจะเรียงตามลำดับจากน้อยไปหามาก

f=(A,s=[],[n,...a]=A,r)=>n?s.some((b,i,[...c])=>n<eval(b.join`+`)?0:f(A,c,a,c[i]=[n,...b]))?S:r?0:f(A,[...s,[]]):S=s

ลองออนไลน์!

ความคิดเห็น

f = (                        // f is a recursive function taking:
  A,                         //   A[] = input array
  s = [],                    //   s[] = list of stacks, initially empty
  [n,                        //   n   = next weight to process
      ...a] = A,             //   a[] = array of remaining weights
  r                          //   r   = recursion flag
) =>                         //
  n ?                        // if n is defined:
    s.some((b, i,            //   for each stack b[] at position i in s[],
                  [...c]) => //   using c[] as a copy of s[]:
      n < eval(b.join`+`) ?  //     if n is not heavy enough to support all values in b[]:
        0                    //       abort
      :                      //     else:
        f(                   //       do a recursive call:
          A, c, a,           //         using A[], c[] and a[]
          c[i] = [n, ...b]   //         with n prepended to c[i]
        )                    //       end of recursive call
    ) ?                      //   end of some(); if successful:
      S                      //     return S[]
    :                        //   else:
      r ?                    //     if this is a recursive call:
        0                    //       do nothing
      :                      //     else:
        f(A, [...s, []])     //       try again with an additional stack
  :                          // else:
    S = s                    //   success: save the solution in S[]

2

Python 3.8 (เผยแพร่ล่วงหน้า) , 178 ไบต์

f=lambda b,s=[[]]:(a for i in range(len(s))if b[0]>=sum(s[i])for a in f(b[1:],s[:i]+[[b[0]]+s[i]]+s[i+1:]+[[]]))if b else[s]
g=lambda a:(c:=sorted(f(a),key=len)[0])[:c.index([])]

ลองออนไลน์!

ตอนนี้ใช้งานได้กับอินพุตที่เป็นไปได้ทั้งหมด (มันหมดเวลากับ TIO ที่มีมากกว่าสิบหรือมากกว่านั้น แต่มันคำนวณคำตอบที่ถูกต้อง)


2
list(reversed(sorted(a)))สามารถเขียนได้sorted(a)[::-1]เพื่อวัตถุประสงค์ในการเล่นกอล์ฟ
โจเอล

คุณจะคิดว่าฉันจะรู้ว่าตอนนี้โดยเฉพาะอย่างยิ่งตั้งแต่ฉันทำดัชนีอื่น ๆ อีกมากมาย ขอบคุณ
Hiatsu

เช่นเดียวกับคำพูดข้างเคียงหากไม่ได้สำหรับการเล่นกอล์ฟมันจะดีกว่าการเขียนsorted(a, reverse=True)แทน
โจเอล
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.