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


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 року буде прийнято як переможець.


Чи дозволяється нам обертати подарунки? Перевернути їх на бік? Поверніть їх на кут, який не кратний 90 °?
Ільмарі Каронен

@IlmariKaronen Так, ви можете повертати подарунки в будь-яку бажану вам орієнтацію, доки вони підходять. Я думаю, що математика, яка бере участь у встановленні коробки під кутом, який не є кратним 90, буде надто складним, чи не так? Я припускав лише обертання на 90 градусів для тестів.
Гарет

@IlmariKaronen Після подальшої думки, я думаю, що мені потрібно усунути обертання інших кратних на 90 градусів, щоб уникнути зайвого ускладнення питання та забезпечити правильні відповіді тестів. Я додаду додаткового обмеження.
Гарет

Чому приклад 3 a ні, коли приклад 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. Я залишу його на деякий час, щоб побачити, чи закінчується він.
Гарет

@Gareth Мені доведеться ще трохи її оптимізувати.
перестали повертати проти годинника,

Гаразд. Тут все ще працює тест 9.
Гарет

2

Пітон, 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 подарунки відповідно ;-)
Гарет

На жаль, він не пройде тест 5 у тестовому сценарії. Я не можу подати заяву, поки не пройдуть усі тести.
Гарет

@Gareth Ну, тоді ця людина не отримає нагороди з вашого боку ;-) Вона реалізує повний експоненційний підхід, щоб бути коротким. Я працюю над більш швидким алгоритмом, але він ще не готовий до подання. Для цього вже потрібно значно більше місця, і у мене все ще залишається кілька справ для реалізації.
Говард
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.