एकदम सांता की तलाश


13

एक भीड़ भरे दृश्य में सांता और उसके हिरन का पता लगाएं।

इनपुट

इनपुट STDIN पर होगा और समान, लेकिन चर, लंबाई के वर्णों की एक चर संख्या होगी। यदि सांता (चरित्र द्वारा दर्शाया गया S) दृश्य में है, तो उसकी प्रस्तुतियाँ (चरित्र द्वारा दर्शाई गई) की बोरी उसके Pसमीप के पदों में से एक में होगी (क्षैतिज, लंबवत या तिरछे)। उनके हिरन (प्रत्येक चरित्र द्वारा दर्शाए गए R) सभी उनके आसपास के 5x5 वर्ग के भीतर होंगे। यदि Sउस दृश्य में एक दृश्य प्रस्तुत होता है जिसमें एक बोरी नहीं है, या कम से कम 4 हिरन के साथ नहीं है, तो यह सांता नहीं है।

उत्पादन

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

उदाहरण

इन उदाहरणों में मैं सिर्फ उपयोग कर रहा हूँ *यह देखना आसान बनाने के लिए चरित्र S, Pऔर Rवर्ण, लेकिन अपने कार्यक्रम से किसी भी ASCII वर्ण को संभालने के लिए सक्षम होना चाहिए !करने के लिए `(96 करने के लिए 33)। मैंने भ्रम से बचने के लिए निचले मामलों के पात्रों और ऊपर छोड़ दिया है।

इनपुट:

***********
***********
***********
*****R*****
******P****
*****S*****
*****R*****
****R**R***
***********
***********
***********
***********

आउटपुट: (डॉट्स पर ध्यान न दें, वे पृष्ठ को रिक्त लाइनें दिखाने के लिए बाध्य करने के लिए हैं)

.           
.          
.           
     R     
      P    
     S     
     R     
    R  R   
.           
.           
.           
.           

इनपुट: (पर्याप्त हिरन नहीं)

***********
***********
***********
***********
******P****
*****S*****
*****R*****
****R**R***
***********
***********
***********
***********

आउटपुट:

***********
***********
***********
***********
******P****
*****S*****
*****R*****
****R**R***
***********
***********
***********
***********

इनपुट: (कोई बोरी भेंट नहीं)

***********
***********
***********
*****R*****
***********
*****S*****
*****R*****
****R**R***
***********
***********
***********
***********

आउटपुट:

***********
***********
***********
*****R*****
***********
*****S*****
*****R*****
****R**R***
***********
***********
***********
***********

इनपुट: (पास पर्याप्त नहीं है)

***********
***********
***********
*****R*****
***********
*****S*P***
*****R*****
****R**R***
***********
***********
***********
***********

आउटपुट:

***********
***********
***********
*****R*****
***********
*****S*P***
*****R*****
****R**R***
***********
***********
***********
***********

इनपुट: (5x5 वर्ग में सांता के आसपास नहीं बारहसिंगा में से एक)

***********
***********
***********
*****R*****
******P****
*****S*****
*****R*****
****R******
*******R***
***********
***********
***********

आउटपुट:

***********
***********
***********
*****R*****
******P****
*****S*****
*****R*****
****R******
*******R***
***********
***********
***********

टेस्ट लिपियों

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

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

संदर्भ के लिए परीक्षणों का सादा पाठ संस्करण: सादा पाठ

पुरस्कार

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


मुझे पता है यह मेरे पिछले प्रश्न के समान है चेहरे की पहचान है, लेकिन यह तब से कुछ साल हो गया है। इसके अलावा, मैं प्रश्न सैंडबॉक्स को छोड़ देने के लिए माफी चाहता हूं लेकिन इसके साथ क्रिसमस संबंधित होने के कारण इसे जल्दी पोस्ट करने की आवश्यकता है या यह प्रासंगिक नहीं होगा।
गैरेथ

पहला उदाहरण आउटपुट ठीक से प्रदर्शित नहीं होता है (छोटे आकार का प्रतीत होता है)।
डेनिस जहरुद्दीन

@ डेनिसजेरुद्दीन ऐसा लग रहा है कि मार्कडाउन सभी खाली लाइनों को हटा रहा है। मैंने उन लाइनों की शुरुआत में डॉट्स जोड़े हैं जो यह दिखाने के लिए कि वे वहां हैं। भ्रम के बारे में क्षमा करें।
गारेथ

जवाबों:


2

MATLAB: 110 , 95 अक्षर

f=@(x,y) filter2(ones(x),y);a=M==83;b=M==82;c=M==80;d=f(5,a&f(5,b)>3&f(3,c))&(a|b|c);if ~d,M,else,M(~d)=32,end

इनपुट के संसाधित होने के तरीके के बारे में निश्चित नहीं है, लेकिन बाकी सब बहुत सीधा है।

सामान्य रूप से स्वरूपित संस्करण:

f=@(x,y) filter2(ones(x),y);
a=M==83;
b=M==82;
c=M==80;
d=f(5,a&f(5,b)>3&f(3,c))&(a|b|c);
if ~d
  M
else
  M(~d)=32
end

उदाहरण इनपुट:

M=['***********'
'***********'
'***********'
'*****R*****'
'******P****'
'*****SQL_2*'
'*****R*****'
'****R**R***'
'***********'
'***********'
'***********'
'***********'];

हम्म, इस पर परीक्षण स्क्रिप्ट चलाने अजीब हो रहा है। कोड पर एक त्वरित नज़र से पता चलता है कि आप केवल ऊपर दिए गए उदाहरणों का उपयोग कर रहे हैं, जो *पात्रों को भीड़ के रूप में उपयोग करते हैं और इसे देखना आसान बनाते हैं S, Pऔर R- जबकि परीक्षण स्क्रिप्ट में परीक्षण 33 ( !) तक सभी ascii वर्णों का उपयोग करते हैं , (सहित) 96 (`` `)। मैं इस प्रश्न में स्पष्ट कर दूंगा। मैंने उन परीक्षणों का एक सादा पाठ संस्करण किया है जिन्हें आपको पास करने की आवश्यकता है जिसे मैं प्रश्न में जोड़ूंगा।
गारेथ

@ गैरेथ अपडेट, अब परीक्षण पास करने लगता है। बहुत बुरा है कि Qसंता ने एक ज़ोर नहीं पहना है , मुझे कम से कम 2 वर्णों को बचाया होगा।
डेनिस जहरुद्दीन

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

ठीक है, मैंने इसे जाँच लिया है और यह कल्पना को पूरा करता है। एक जगह जिसका अनुचित लाभ है वह इनपुट आवश्यकताओं पर है। मैंने उत्थान किया है, लेकिन मैं इसे विजेता के रूप में स्वीकार नहीं कर पाऊंगा, जब तक कि यह इनपुट नहीं पढ़ता है (फाइल से क्योंकि ऐसा लगता है कि मतलाब स्टैटिन से नहीं पढ़ा है)।
गारेथ

आप SQL_2नमूना इनपुट में फिसल गए ... अच्छा :)
टाइमटेक

1

पायथन 2 ( 353 381)

import re,sys
a=sys.stdin.readlines()
h=len(a)
w=len(a[0])
a=''.join(a)+' '*99
print a
b=[''.join(q) for x in range(0,w) for y in range(0,h) for q in [[a[(y+z)*w+x:(y+z)*w+x+5] for z in range(0,5)]]]
for c in b:
 if c[12]=='S' and 'P' in ''.join([c[1+5*z:4+5*z] for z in range(1,4)]) and c.count('R')>3:
  a=re.sub('[^RPS]','.',c)
  w=h=5
for y in range(0,h):
 print a[y*w:(y+1)*w]

संभव के रूप में कॉम्पैक्ट लेखन कोड पर पहला प्रयास। पायथन वास्तव में उसके लिए भाषा नहीं है, क्योंकि इंडेंटेशन और नईलाइन्स को बस डिजाइन की आवश्यकता होती है। मैं मुख्य रूप से इस भाषा का उपयोग करना चुनता हूं, क्योंकि आप सूचियों के साथ खेल सकते हैं, और सूचियों के रूप में तार। आसान मैट्रिक्स हेरफेर के साथ एक भाषा इस कार्य के लिए आदर्श होगी, लेकिन दुख की बात है कि मैं उनमें से किसी को भी नहीं जानता।

चीज़ का परीक्षण करने के लिए, किसी चीज़ को सौंपा जाना चाहिए, जैसे

a=['1**********','*2*********','**3********','***4*******','****5*P****','*****S*****','*****,*****','****R**R***','***********','***********','****R******','**RPSRRR***']

इस कोड में मुख्य दिलचस्प बात शायद है:

b=[''.join(q) for x in range(0,w) for y in range(0,h) for q in [[a[(y+z)*w+x:(y+z)*w+x+5] for z in range(0,5)]]]

जो लिखने का एक फैंसी तरीका है: "बी मूल प्रतिनिधित्व में हर 5x5 वर्ग के प्रतिनिधित्व (25 वर्णों का स्ट्रिंग) की एक सूची बन जाता है"।


हालांकि मतलब को STDIN से पढ़ने में कठिनाई हो सकती है, लेकिन पायथन को मुझे डर नहीं है। एसटीडीआईएन से इनपुट पढ़ना आवश्यकताओं में से एक है (परीक्षण स्क्रिप्ट को चलाने के लिए जितना संभव हो उतना लोगों को अपने स्वयं के इनपुट प्रारूप के साथ आने से रोकने के लिए)।
गारेथ

उफ़, पूरी तरह से याद किया।
सुमुरै 8

कोड बदल दिया है, लेकिन अगर यह वास्तव में यहाँ काम करता है परीक्षण नहीं कर सकता। इसे उसी प्रारूप में पढ़ना चाहिए, जिसमें यह प्रयोग किया जाता था।
सुमुरै 8

ठीक है, मुझे अब इस पर परीक्षण चलाने का मौका मिला है और कुछ मुद्दे हैं। 1) उन मामलों में जहां सांता पाया जाता है, इनपुट आउटपुट है जैसा कि आपके समाधान से पहले है। 2) आपका समाधान इनपुट की तुलना में एक अलग आकार है। मैंने इस बिंदु पर प्रश्न को स्पष्ट करने की कोशिश की है - सभी गैर- (संता, प्रस्तुत, हिरन) वर्णों को रिक्त स्थान से बदला जाना चाहिए। यह पहले उदाहरण में ऐसा था, लेकिन यह प्रश्न में स्पष्ट रूप से नहीं बताया गया था। 3) जब सांता नहीं मिला, तो आउटपुट में डबल लाइन-स्पेसिंग है।
गारेथ

0

फ़ाइल में केवल एक सांता होना चाहिए (यदि 2 से अधिक "एस", मुझे कोड अपडेट करने की आवश्यकता है)।

जाग का उपयोग करना

cat santa.awk

BEGIN{FS=""}
{ for (i=1;i<=NF;i++)
         { a[NR FS i]=$i
           if ($i=="S") {l=NR;c=i}
         }
     }
END{ if (l=="") {print "No Santa";exit}
     for (i=l-1;i<=l+1;i++)
        for (j=c-1;j<=c+1;j++)
          if (a[i FS j]=="P") p++
     if (p<1) {print "Santa has no presents";exit}
     for (i=l-2;i<=l+2;i++)
        for (j=c-2;j<=c+2;j++)
          if (a[i FS j]=="R") r++
     if (r<4) {print "Santa has no enough reindeers";exit}
     else {  print "found Santa "
             for (i=1;i<=NR;i++)
               { for (j=1;j<=NF;j++)
                   if (a[i FS j]~/[R|S|P]/) {printf a[i FS j]} else {printf " "}
                 printf RS
                }
           }
    }

नीचे के रूप में awk कमांड चलाएँ

awk -f santa.awk file

परिणाम

found Santa



     R
    R R
    PS
    RR
    R  R

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