Проблема сани упаковки

11

Эльфы Санты нуждаются в помощи, чтобы определить, поместится ли их текущая партия подарков в сани Санты. Напишите самую короткую программу на выбранном вами языке, чтобы помочь им.

Ограничения

  • Санты Санты имеют размеры 6 футов в ширину и 12 футов в длину и 4 фута в глубину.
  • Подарки могут быть хрупкими, поэтому их нельзя складывать друг на друга.
  • Вы можете вращать и переворачивать подарки по своему желанию, но Санта довольно одержимо-компульсивный парень, поэтому держите повороты до кратных 90 градусов.
  • Нормы и правила безопасности на Северном полюсе предусматривают, что подарки не должны выступать более чем на 1 фут выше вершины саней (поэтому они могут быть не более 5 футов в высоту).

вход

Ввод будет включен STDINи будет одним целым числом, представляющим количество подарков в пакете, за которым следует список размеров подарков - 1 подарок на строку, 3 измерения (в футах), разделенные пробелами.

Примеры:

1
6 12 5

6
1 12 3
1 12 4
1 12 1
1 12 5
1 12 3
1 12 5

1
4 3 13

1
6 12 6

Выход

На выходе должно быть просто слово «ДА», если подарки можно упаковать в сани, или «НЕТ», если они не могут.

Вывод для приведенных выше примеров:

YES

YES

NO

NO

Тестовые сценарии

Как и прежде, я назначил несколько тестовых сценариев, написанных Джои и Вентеро, чтобы создать несколько тестов для этой задачи: -

Использование: ./test [your program and its arguments]

Награды

Каждая заявка, которую я могу проверить, которая соответствует спецификации, проходит тесты и, очевидно, была попытка сыграть в гольф, получит от меня отклик (поэтому, пожалуйста, предоставьте инструкции по использованию вместе с вашим ответом). Самое короткое решение к концу 2011 года будет принято победителем.

Gareth
источник
Разрешено ли нам вращать подарки? Перевернуть их на бок? Повернуть их на угол, не кратный 90 °?
Ильмари Каронен
@IlmariKaronen Да, вы можете поворачивать подарки в любую ориентацию, сколько пожелаете. Я думаю, математика, связанная с установкой коробок под углом, не кратным 90, была бы слишком сложной, не так ли? Я предполагал только повороты на 90 градусов для испытаний.
Гарет
@IlmariKaronen После дальнейших размышлений я думаю, что мне нужно исключить повороты, кратные 90 градусам, чтобы избежать чрезмерного усложнения вопроса и обеспечить правильные ответы на тесты. Я добавлю дополнительное ограничение.
Гарет
Почему пример 3 - нет, а пример 1 - да? 6x12x5 больше, чем 6x12x4, поэтому присутствуют ли они, чтобы выкинуть верх? В таком случае, почему 3 a no, так как это тоже может торчать верх?
Skizz
1
@Skizz: Это запутанно, но обратите внимание на четвертое ограничение: подарки могут выпасть на 1 фут. Таким образом, эффективная глубина саней составляет 5 футов, а не 4 фута.
Ильмари Каронен

Ответы:

3

Haskell, 312 318 символов

import Data.List
s(ξ:υ:_,λ:σ:η:_)(x:y:_,l:w:_)=(ξ+λ<=x||ξ>=x+l||υ+σ<=y||υ>=y+w)&&ξ+λ<7&&υ+σ<13&&η<6
y p l=[(v,r):l|v<-[[x,y,0]|x<-[0..5],y<-[0..11]],r<-permutations p,all(s(v,r))l]
main=do
 n<-readLn
 p<-mapM(fmap(map read.words).const getLine)[1..n]
 putStr.r$foldr((=<<).y)[[([9,0],[0..])]]p
r[]="NO"
r _="YES"

По какой-то причине, которую я до конца не понимаю, он не завершает ваши тесты № 9 и № 16 в разумные сроки. Но ты ничего не сказал о производительности, не так ли?


373 383 символа

Эта версия работает намного быстрее для примеров: сначала она проверяет, не является ли это невозможным просто потому, что область слишком мала, а затем начинает с самых больших участков, а не вставляет их в указанном порядке. Обратите внимание, что определение области не является идеальным: оно не учитывает повороты, поэтому может на некоторых входах давать неверные результаты. Но это работает с тестовым скриптом.

import Data.List
s(ξ:υ:_,λ:σ:η:_)(x:y:_,l:w:_)=(ξ+λ<=x||ξ>=x+l||υ+σ<=y||υ>=y+w)&&ξ+λ<7&&υ+σ<13&&η<6
y p l=[(v,r):l|v<-[[x,y,0]|x<-[0..5],y<-[0..11]],r<-permutations p,all(s(v,r))l]
π=product
main=do
 n<-readLn
 p<-mapM(fmap(map read.words).const getLine)[1..n]
 putStr$if sum(map(π.init)p)>72||null(foldr((=<<).y)[[([9,0],[0..])]].sortBy((.π).compare.π)$p)then"NO"else"YES"
перестал поворачиваться против часовой стрелки
источник
Нет, я не был обеспокоен производительностью, но программа должна пройти все тесты, чтобы получить мой голос. В настоящее время он работает над тестом 9. Я оставлю это на некоторое время, чтобы посмотреть, закончится ли он.
Гарет
@ Гарет, мне придется еще немного его оптимизировать.
перестал поворачиваться против часовой стрелки с
Хорошо. Это все еще работает над тестом 9 здесь.
Гарет
2

Python, 461 символ

import sys
def L(P,z):
 if not P:return 1
 for w,h in[P[0],P[0][::-1]]:
  m=sum((2**w-1)<<i*6for i in range(h))
  for x in range(7-w):
   for y in range(13-h):
    n=m<<y*6+x
    if z&n==0and L(P[1:],z|n):return 1
 return 0
for G in sys.stdin.read().split('\n\n'):
 S=[(x,y)if z<6 else(x,z)if y<6 else(y,z)if x<6 else(9,9)for x,y,z in[sorted(eval(g.replace(' ',',')))for g in G.split('\n')[1:]if g]]
 print'YES\n'if sum(x*y for x,y in S)<73and L(S,0)else'NO\n'

Lрекурсивно проверяет, Pможно ли поместить прямоугольники в сани, где zнаходится битовая маска уже занятых ячеек. SНазначение определяет , какой путь вверх для каждого из пакетов (наибольший размер <= 5 проходит вертикально).

Код потенциально экспоненциальный, но он быстрый на всех входах теста.

Кит Рэндалл
источник
1

GolfScript, 130 символов

"NO":g;~](;3/127{128*64+}12*\{.,0>.!{"YES":g;}*{([{[~@]..[~\]\}3*;]{)6<{~[2\?(]*128base 83,{2\?1$*.4$&0={3$|2$f}*}%;}*}%;}*;;}:f~g

Потребовалось некоторое время, чтобы запустить его в GolfScript. Любая попытка сыграть в гольф далее сломала некоторые тестовые случаи.

Пожалуйста, имейте в виду, что эта версия может стать невероятно медленной, если вы запустите ее с большим количеством подарков.

Говард
источник
У меня всегда проблемы с гольф-скриптами. Я пытаюсь, ./test ruby golfscript.rb howard.gsно это дает мне ошибки. Как я должен вызывать это?
Гарет
@Gareth Вы можете просто добавить точку с запятой с последующим вводом (например ;"1\n6 12 5") для данного сценария.
Говард
Вау, ты не шутишь, что в некоторых случаях это происходит медленно. Возможно, мне придется оставить его на всю ночь в двух последних тестовых случаях (72 и 73 подарка соответственно ;-)
Gareth
Извините, тест 5 не пройдет в тестовом скрипте. Я не могу отказать, пока он не пройдет все испытания.
Гарет
@ Гарет Хорошо, тогда этот не получит одобрения с вашей стороны ;-) Он реализует полный экспоненциальный подход, чтобы быть коротким. Я работаю над более быстрым алгоритмом, но он еще не готов к отправке. Ему уже нужно значительно больше места, и у меня еще есть несколько дел для реализации.
Говард