स्लीव पैकिंग समस्या


11

सांता के कल्पित बौने को यह निर्धारित करने में मदद की जरूरत है कि क्या उनका वर्तमान बैच सांता की नींद में फिट होगा। उनकी मदद करने के लिए अपनी पसंद की भाषा में सबसे छोटा कार्यक्रम संभव लिखें।

प्रतिबन्ध

  • सांता की बेपहियों की गाड़ी 6 फीट चौड़ी 12 फीट लंबी और 4 फीट गहरी है।
  • प्रस्तुतियां नाजुक हो सकती हैं, इसलिए वे एक दूसरे के शीर्ष पर खड़ी नहीं हो सकती हैं।
  • आप अपनी इच्छानुसार उपहार प्रस्तुत कर सकते हैं और घुमा सकते हैं, लेकिन सांता काफी जुनूनी-बाध्यकारी चप है, इसलिए घुमावों को 90 डिग्री से गुणा करने के लिए रखें।
  • उत्तरी ध्रुव स्वास्थ्य और सुरक्षा नियम निर्धारित करते हैं कि प्रस्तुत करने से एक बेपहियों की गाड़ी के ऊपर 1ft से अधिक नहीं चिपक सकता है (इसलिए वे 5ft से अधिक नहीं हो सकते हैं)।

इनपुट

इनपुट पर होगा 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

टेस्ट स्क्रिप्ट

पहले की तरह, मैंने इस कार्य के लिए कुछ परीक्षण बनाने के लिए जॉय और वेंटरो द्वारा लिखित कुछ परीक्षण लिपियों को विनियोजित किया है: -

उपयोग: ./test [your program and its arguments]

पुरस्कार

प्रत्येक प्रविष्टि जिसे मैं सत्यापित कर सकता हूं कि यह कल्पना से मिलता है, परीक्षण पास करता है और जाहिर है कि गोल्फ में कुछ प्रयास मुझे प्राप्त होगा (इसलिए कृपया अपने उत्तर के साथ उपयोग निर्देश प्रदान करें)। 2011 के अंत तक सबसे छोटा समाधान विजेता के रूप में स्वीकार किया जाएगा।


क्या हमें प्रस्तुतियाँ घुमाने की अनुमति है? उनकी तरफ पलटें? उन्हें एक कोण से घुमाएं जो कि 90 ° से अधिक नहीं है?
इल्मरी करोनें

@IlmariKaronen हाँ, जब तक आप फिट होते हैं, तब तक आप किसी भी अभिविन्यास के लिए उपहार को घुमा सकते हैं। मुझे लगता है कि 90 के एक से अधिक नहीं है कि एक कोण पर फिटिंग बक्से में शामिल गणित यह अधिक जटिल नहीं होगा? मैंने परीक्षणों के लिए केवल 90 डिग्री के घूर्णन का अनुमान लगाया है।
गारेथ

@IlmariKaronen आगे के विचार पर, मुझे लगता है कि मुझे सवाल को उलझाए रखने से बचने के लिए 90 डिग्री के अन्य गुणकों के घूर्णन को समाप्त करने की आवश्यकता है, और यह सुनिश्चित करने के लिए कि परीक्षण सही उत्तर दें। मैं एक अतिरिक्त बाधा जोड़ूंगा।
गारेथ

उदाहरण 3 क्यों नहीं है जब उदाहरण 1 एक हाँ है? 6x12x5 6x12x4 से बड़ा है तो क्या शीर्ष पर प्रहार करने की अनुमति है? किस मामले में 3 एक नहीं है क्योंकि वह भी शीर्ष से बाहर रह सकता है?
स्किज़

1
@Skizz: यह भ्रमित करने वाला है, लेकिन चौथे बाधा को देखें: प्रस्तुत शीर्ष से 1 फीट बाहर हो सकता है। तो आस्तीन की प्रभावी गहराई 5ft है, 4ft नहीं।
इल्मरी करोनें

जवाबों:


3

हास्केल, 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 पर काम कर रहा है। मैं इसे खत्म होने पर देखने के लिए थोड़ी देर छोड़ दूँगा।
गारेथ

@ गैरेथ मुझे इसे अभी तक थोड़ा अनुकूलित करना होगा।
को बंद कर दिया

ठीक है। यह अभी भी यहां परीक्षण 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

इसे गोल्फस्क्रिप्ट में चलाने में काफी समय लगा। गोल्फ के किसी भी प्रयास ने परीक्षण के कुछ मामलों को तोड़ दिया।

कृपया सचेत रहें कि यदि आप इसे बहुत अधिक प्रस्तुत करते हैं तो यह संस्करण अविश्वसनीय रूप से धीमा हो सकता है।


मुझे हमेशा गोल्फ खिलाड़ी से परेशानी होती है। मैं कोशिश कर रहा हूँ, ./test ruby golfscript.rb howard.gsलेकिन यह मुझे त्रुटियाँ दे रहा है। मुझे इसे कैसे लागू करना चाहिए?
गारेथ

@ गैरेथ आप ;"1\n6 12 5"दिए गए स्क्रिप्ट में इनपुट (उदाहरण ) के बाद अर्धविराम लगा सकते हैं ।
हावर्ड

वाह, आप कुछ मामलों में धीमी गति से होने के बारे में मजाक नहीं कर रहे थे। मुझे इसे दो अंतिम परीक्षण मामलों (क्रमशः 72 और 73 प्रस्तुतियाँ ;-)
गैरेथ

क्षमा करें, यह परीक्षण स्क्रिप्ट में पिछले परीक्षण 5 पर नहीं जाएगा। मैं तब तक उत्थान नहीं कर सकता जब तक कि यह सभी परीक्षाओं को पास नहीं कर लेता।
गारेथ

@ गैरेथ ठीक है, तो यह आपकी तरफ से एक उत्थान नहीं होगा; ;-) यह छोटा होने के लिए पूर्ण घातीय दृष्टिकोण को लागू करता है। मैं एक तेज एल्गोरिथ्म पर काम कर रहा हूं लेकिन यह अभी तक प्रस्तुत करने के लिए तैयार नहीं है। इसके लिए पहले से ही अधिक स्थान की आवश्यकता है और मेरे पास अभी भी कुछ मामले कार्यान्वयन के लिए शेष हैं।
हावर्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.