썰매 포장 문제 정수가되며 그 다음에

산타의 엘프들은 현재 선물 묶음이 산타의 썰매에 맞는지 결정하는 데 도움이 필요합니다. 원하는 언어로 가능한 가장 짧은 프로그램을 작성하십시오.

제약

  • 산타의 썰매는 길이 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’여야하고, 그렇지 않으면 ‘NO’여야합니다.

위 예제의 결과 :

YES

YES

NO

NO

테스트 스크립트

이전과 같이 JoeyVentero 가 작성한 테스트 스크립트 를 수정하여이 작업에 대한 테스트를 작성했습니다.

용법: ./test [your program and its arguments]

보상

사양을 충족하고 테스트를 통과했으며 골프를 시도한 것으로 보이는 모든 항목은 저에게 공감대를받습니다 (답변에 사용 지침을 제공하십시오). 2011 년 말까지 가장 짧은 솔루션이 승자로 인정됩니다.



답변

하스켈, 312318

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"

답변

파이썬, 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가 상하 이동)을 각 패키지에 가입되는 방식으로 결정한다.

코드는 기하 급수적이지만 모든 테스트 입력에서 빠릅니다.


답변

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에서 실행하는 데 꽤 시간이 걸렸습니다. 골프를 타려고 시도하면 테스트 케이스가 더 깨졌습니다.

너무 많은 선물로이 버전을 실행하면이 버전이 엄청나게 느려질 수 있습니다.