Укладання важкої коробки


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]]

Правила та припущення

  • Застосовуються стандартні правила вводу / виводу та заборонені лазівки
  • Використовуйте будь-який зручний формат для вводу / виводу
    • Стеки можуть бути описані зверху вниз або знизу вгору, якщо ви послідовні.
    • Порядок стеків (а не ящики в межах цих стеків) значення не має.
    • Ви також можете приймати поля введення у вигляді списку. Порядок не особливо важливий для вхідних даних, доки загальну проблему не вирішує сам сортування.
  • Якщо є кілька оптимальних конфігурацій стеків, ви можете вивести будь-який з них
  • Ви можете припустити, що є хоча б одна коробка і що всі ящики важать не менше 1 кг
  • Ви повинні підтримувати ваги до 9 999 кг, як мінімум.
  • Ви повинні підтримувати до 9 999 коробок, як мінімум.
  • Ящики з однаковою вагою не відрізняються, тому не потрібно зазначати, який ящик використовувався де.

Щасливого гольфу! Удачі!


2
Чи можемо ми прийняти ваги у відсортованому порядку? (або висхідний, або низхідний)
Арнольд

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]]
Хіацу

2
@Arnauld, оскільки в іншому випадку це додасть нецікавий код сортування до відповіді, я скажу " так" , ви можете взяти входи в упорядкованому порядку.
Beefster

Відповіді:


5

Желе , 19 байт

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

Спробуйте в Інтернеті!

Очевидно -3 завдяки Ніку Кеннеді ...

Зверху вниз.

Пояснення:

Œ!ŒṖ€ẎṖÄ>ḊƲ€¬ȦƊƇ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]])

Будь-який шанс на менш компактну версію з поясненням? Я дізнаюсь тонну з них.
Джон Кітс

1
@JohnKeates Додав один.
Ерік Аутгольфер

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]для цілей гольфу.
Джоель

Ви б могли подумати, що я б це знав до цього часу, тим більше, що я так багато інший індексую. Спасибі.
Хіацу

Як бічне зауваження, якби не гольф, краще написати sorted(a, reverse=True)замість цього.
Джоель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.