썰매 포장 문제


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'여야하고, 그렇지 않으면 'NO'여야합니다.

위 예제의 결과 :

YES

YES

NO

NO

테스트 스크립트

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

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

보상

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


선물을 회전시킬 수 있습니까? 옆으로 넘겨? 90 도의 배수가 아닌 각도로 회전합니까?
Ilmari Karonen

@IlmariKaronen 예, 선물을 원하는 방향으로 원하는 방향으로 회전 할 수 있습니다. 90의 배수가 아닌 각도로 상자를 맞추는 것과 관련된 수학은 너무 복잡하지 않을 것이라고 생각합니까? 테스트에서는 90도 회전 만 가정했습니다.
Gareth

@IlmariKaronen 추가로 생각하면, 질문을 지나치게 복잡하게하지 않고 테스트가 정답을 얻도록 90 도의 다른 배수를 제거해야한다고 생각합니다. 추가 제약을 추가하겠습니다.
Gareth

예 1이 예일 때 예 3이 아니오 인 이유는 무엇입니까? 6x12x5가 6x12x4보다 크므로 상단을 찌를 수 있습니까? 어떤 경우에 3이 아니오 인 이유는 무엇입니까?
Skizz

1
@ 스키즈 : 혼란스럽게 표현되었지만 네 번째 제약 조건을 참조하십시오. 선물이 1 피트 위로 튀어 나올 수 있습니다. 따라서 썰매 의 유효 깊이는 4 피트가 아닌 5 피트입니다.
Ilmari Karonen

답변:


3

하스켈, 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"

아니요, 나는 성능에 관심이 없었지만 프로그램은 내 공의를 얻기 위해 모든 테스트를 통과해야합니다. 현재 테스트 9에서 작동하고 있습니다. 완료되는지 확인하기 위해 잠시 놔두겠습니다.
Gareth

@Gareth 아직 조금 최적화해야합니다.
반 시계 회전을 중지

확인. 여전히 테스트 9에서 작동하고 있습니다.
Gareth

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

@Gareth ;"1\n6 12 5"주어진 스크립트에 세미콜론 다음에 입력 (예 :)을 추가 할 수 있습니다 .
Howard

와우, 당신은 어떤 경우에는 그것이 느려지는 것에 대해 농담하지 않았습니다. 마지막 두 가지 테스트 사례에서 각각 밤새도록 내버려 두어야 할 수도 있습니다 (72 및 73 개씩 각각 ;-)
Gareth

테스트 스크립트에서 테스트 5를 통과하지는 않습니다. 모든 테스트를 통과 할 때까지 공감할 수 없습니다.
Gareth

@Gareth 글쎄, 이것은 당신의 측면에서 공감대를 얻지 못할 것입니다 ;-) 그것은 짧은 지수를 위해 완전한 지수 접근법을 구현합니다. 더 빠른 알고리즘을 개발 중이지만 아직 제출할 준비가되지 않았습니다. 이미 상당히 많은 공간이 필요하며 구현을 위해 남겨둔 사례가 여전히 남아 있습니다.
Howard
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.