Укладка тяжелых коробок


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 кг.
  • Вы должны поддерживать вес до 9999 кг, как минимум.
  • Вы должны поддерживать как минимум 9999 ящиков.
  • Ящики с одинаковым весом неразличимы, поэтому нет необходимости указывать, какой ящик и где использовался.

Удачного игры в гольф! Удачи!


2
Можем ли мы взять вес в отсортированном порядке? (восходящий или нисходящий)
Арно

4
«Вы должны поддерживать как минимум 9999 ящиков». Как здесь понимается «поддержка»? Означает ли это просто, что программа должна быть в состоянии принять такой размер ввода, или это означает, что программа должна действительно предоставить ответ за разумное количество времени? Если это последнее, то должны быть предоставлены гораздо большие тестовые примеры.
Джоэл

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, так как в противном случае это добавило бы неинтересный код сортировки к ответу, я скажу да , вы можете принимать входные данные в отсортированном порядке.
Говядина

Ответы:


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 добавил один.
Эрик 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 превышает 10 или около того, но вычисляется правильный ответ)


2
list(reversed(sorted(a)))может быть написано как sorted(a)[::-1]для игры в гольф.
Джоэл

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

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