산타의 엘프들은 현재 선물 묶음이 산타의 썰매에 맞는지 결정하는 데 도움이 필요합니다. 원하는 언어로 가능한 가장 짧은 프로그램을 작성하십시오.
제약
- 산타의 썰매는 길이 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 년 말까지 가장 짧은 솔루션이 승자로 인정됩니다.
답변
하스켈, 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에서 실행하는 데 꽤 시간이 걸렸습니다. 골프를 타려고 시도하면 테스트 케이스가 더 깨졌습니다.
너무 많은 선물로이 버전을 실행하면이 버전이 엄청나게 느려질 수 있습니다.