썰매 포장 문제


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

테스트 스크립트

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

용법: ./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.