क्या मैं उस आकृति को ब्लॉक, स्लैब और सीढ़ियों से बना सकता हूं?


13

एक आयताकार द्वि-आयामी ग्रिड पर विचार करें जहां प्रत्येक कोशिका या तो खाली हो सकती है ( .) या पूर्ण ( 0)।

जैसे

..00....
0000....
.00000..
000...00
..000000
000.00..

ग्रिड को अनंत माना जाता है, चित्रित क्षेत्र के बाहर सभी कोशिकाएं खाली हैं।

लक्ष्य भरे हुए स्थानों को ढंकना है और खाली जगहों को 7 अलग-अलग आकार की ईंटों के सेट का उपयोग करके खुला छोड़ना है जो प्रत्येक ग्रिड के 4 कोशिकाओं (2 × 2) को लेते हैं।

ये 7 ईंटें हैं:

  • ब्लॉक - 1 संस्करण

    11
    11
    
  • स्लैब - 2 वेरिएंट

    ..
    22
    33
    ..
  • सीढ़ियाँ - 4 प्रकार

    .4
    44
    5.
    55
    66
    .6
    77
    7.

इन ईंटों को हमेशा एक ग्रिड से संरेखित करना चाहिए, जिनकी कोशिकाएँ इनपुट ग्रिड की कोशिकाओं की तुलना में दोगुनी चौड़ी और लंबी होती हैं। प्रत्येक ईंट केवल इस बड़े ग्रिड के एक सेल पर कब्जा कर सकती है लेकिन छोटे ग्रिड को कवर खोजने के लिए अधिक विकल्प देने के लिए बड़े ग्रिड के नीचे अनुवादित (ऊपर, नीचे, बाएं, दाएं) स्थानांतरित किया जा सकता है। न तो ग्रिड और न ही व्यक्तिगत ईंटों को घुमाया जा सकता है।

तो ऊपर दिए गए उदाहरण को कवर करने के लिए एक तरीका (उर्फ हल) इस प्रकार है:

..11....
2211....
.47733..
447...22
..771133
227.11..

(पहचान संबंधी पड़ोसी ईंटें अभी भी अस्पष्टता का कारण बन सकती हैं लेकिन बड़े ग्रिड को हल करने वाले ध्यान से पहचानती हैं।)

के लिए एक अवैध समाधान

000000
000000

है

566774
556744

क्योंकि ईंटें सभी बड़े ग्रिड से संरेखित नहीं होती हैं और न ही इसके एक सेल पर कब्जा होता है।

यहां एक मान्य समाधान पंक्ति में 3 ब्लॉक हैं:

111111
111111

और एक अन्य वैध समाधान में 6 स्लैब शामिल हैं:

......
222222
333333
......

तो ध्यान दें कि कुछ इनपुट ग्रिड में कई समाधान होते हैं

के लिए एक अवैध समाधान

00.00
00...

है

11.33
11...

क्योंकि ईंटें बड़े ग्रिड से संरेखित नहीं होती हैं। स्लैब को एक-एक करके बाएं या दाएं स्थानांतरित करना होगा, लेकिन तब निश्चित रूप से कवर अधूरा होगा। इस इनपुट ग्रिड का कोई हल नहीं है

चुनौती

एक प्रोग्राम है जो (stdin / कमांड लाइन के माध्यम से) में ले जाता है के पाठ की एक आयताकार ब्लॉक लिखें .की और 0की है कि एक ग्रिड को कवर किया जाना प्रतिनिधित्व करता है।

यदि कोई वैध कवरिंग समाधान है, तो ऊपर दिए गए तरीके से किसी भी एक समाधान को प्रिंट (stdout के माध्यम से) करें , सभी ईंटों के माध्यम से 0उपयुक्त की जगह ।17

यदि कोई समाधान नहीं है, तो आपके प्रोग्राम को कुछ भी आउटपुट नहीं करना चाहिए, बस चुपचाप सामान्य रूप से समाप्त हो जाना चाहिए।

टिप्पणियाँ

  • इनपुट और आउटपुट को समान आयताकार आयामों की आवश्यकता नहीं है। आपके आउटपुट में सभी प्रकार के असंगत पंक्तियाँ और / या स्तंभ हो सकते हैं .(जब तक कि वे समाधान को अमान्य नहीं करते)।

  • .यदि यह भरे हुए स्थान को प्रभावित नहीं करेगा, तो पंक्तियों और स्तंभों को ट्रिम करना भी ठीक है । जैसे

    222222
    333333
    

    के लिए एक वैध समाधान है

    000000
    000000
    

    इसके विपरीत, दो खाली स्तंभों को 00..00हटाया नहीं जा सकता है क्योंकि भरे हुए रिक्त स्थान को अव्यवस्थित करेंगे।

  • आप वैकल्पिक रूप से मान सकते हैं कि इनपुट में एक एकल अनुगामी न्यूलाइन है। आउटपुट में एक एकल अनुगामी न्यूलाइन ठीक नहीं है, यहां तक ​​कि समाधान के मामले में भी।

  • ग्रिड जो पूरी तरह से खाली हैं (सभी .के) और तुच्छ 0 × 0 ग्रिड ऐसे इनपुट मामले नहीं हैं जिनके बारे में आपको चिंता करने की आवश्यकता है। लेकिन 1 × 1 0ग्रिड है, जैसा कि अन्य सभी ग्रिड हैं जिनमें कम से कम एक है 0। (आप इनपुट ग्रिड की चौड़ाई या ऊँचाई समान नहीं मान सकते हैं!)

  • एक कार्यक्रम के बजाय आप एक फ़ंक्शन लिख सकते हैं जो इनपुट को एक स्ट्रिंग तर्क के रूप में लेता है और आउटपुट को सामान्य रूप से प्रिंट करता है या इसे स्ट्रिंग के रूप में लौटाता है। समाधान न होने पर किसी भी गलत मूल्य को लौटाया जा सकता है।

  • आप के स्थान पर किसी भी 9 अलग मुद्रण योग्य ASCII वर्ण का उपयोग कर सकते हैं . 0 1 2 3 4 5 6 7। बस यह कहना सुनिश्चित करें कि आपके विकल्प क्या थे! न्यूलाइन्स को वैसे ही रहना चाहिए।

स्कोरिंग

बाइट्स में सबसे छोटा कोड जीतता है। टाईब्रेकर सबसे अधिक मतदान वाला पद है।

यह चुनौती Minecraft में ब्लॉक , स्लैब और सीढ़ियों से प्रेरित थी , जो यहां वर्णित समान नियमों का पालन करते हैं। यदि आप PPCG और Minecraft का आनंद लेते हैं , तो आप PPCG Minecraft सर्वर की जांच कर सकते हैं ।


3
ऐसा लगता है कि Minecraft सर्वर गोल्फ स्क्रिप्ट में उबाऊ नहीं है - उबाऊ :-)
थॉमस वेलर

5
@ThomasWeller कुछ बाइट्स को बचाने के लिए CJam में इसे लागू किया गया था।
एलेक्स ए।

जवाबों:


6

पायथन - 525 491 478 430 बाइट्स

r=range
def t(s):
 m=s.find("\n")+1
 for q in r(4):
  try:
   for i in r(-q%2,m-1,2):
    for j in r(-q/2,len(s)/m,2):
     k,g=j*m+i,""
     b=[k,k+1,k+m,k+m+1]
     for z in b:g+=a(s,z)
     for z in b:
      if a(s,z)!="d":s=s[:z]+`dict(dddd=0,zzdd=3,ddzz=2,zzzd=7,zzdz=6,zdzz=5,dzzz=4,zzzz=1)[g]`+s[z+1:]
   return s
  except:d
def a(v,i):
 try:
  if v[i]!="\n":return v[i]
  return "d"
 except:return "d"

स्पष्टीकरण: यह मेरा पहला कोड गोल्फ है, इसलिए यह इष्टतम नहीं हो सकता है, लेकिन यहां बताया गया है कि यह कैसे काम करता है। फ़ंक्शन t (s) में पास किए गए स्ट्रिंग के लिए परिणाम देता है। पहले, यह कॉलम की संख्या पाता है, फिर 1 से चार संभावित अलग-अलग अनुवादों के माध्यम से जाता है (कोई नहीं, बाएं, ऊपर, बाएं) और इसे हल करने का प्रयास करता है। प्रत्येक के लिए। यह प्रत्येक 2x2 ब्लॉक को देखता है और इसे एक मान्य ब्लॉक नंबर पर मैप करता है, जो एक शब्दकोश द्वारा दिया गया है, और शून्य को संख्या में बदलता है।

यदि यह शब्दकोश में नहीं मिलता है, तो यह उस विशिष्ट ऑफसेट को छोड़ देता है और अगले एक के साथ शुरू होता है। यदि यह वैध समाधान पाए बिना सभी 4 ऑफसेट से गुजरता है, तो यह कुछ भी आउटपुट किए बिना समाप्त होता है। a (v, i) स्ट्रिंग के बाहर डिफ़ॉल्ट मान के लिए अनुमति देता है, और newline वर्णों को अनदेखा करता है। हालांकि यह रन की अवधि के माध्यम से आंशिक समाधान के साथ समाप्त हो सकता है, यह हमेशा अंतिम सही एक के साथ उन्हें ओवरराइड करेगा यदि यह मौजूद है।

संपादित करें: वर्णों की एक अलग मैपिंग का उपयोग किया जाता है:। -> d, 0 -> z, अन्य सभी संख्याएँ स्वयं जाती हैं। यह इनपुट और आउटपुट दोनों पर लागू होता है।


1
PPCG में आपका स्वागत है! हम पायथन में गोल्फ के लिए कुछ सुझाव हैं ; जिससे मुझे लगता है कि आप कुछ बाइट्स बचा सकते हैं।
20:09 पर lirtosiast
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.