वैध लूपि सॉल्यूशंस


9

यह Loopy पहेली चुनौती उत्पन्न करने के लिए एक अतिरिक्त चुनौती है । पिछली कड़ी में कठिन चुनौती का प्रयास करने से पहले आप इस चुनौती को हल करना चाह सकते हैं।

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

+-+-+ +-+ +-+ +
|   | | |2|3|  
+-+ + + + + +-+
 2| | | |2|  3|
+ + +-+ + + +-+
 2|  2 1|3| |  
+-+ +-+ +-+ +-+
|2  | |    1 2|
+ +-+ +-+ +-+ +
| |2 1 2|3|3| |
+ + +-+ +-+ +-+
| | |3|2   1   
+ +-+ +-+-+-+-+
|        2 2  |
+-+-+-+-+-+-+-+

जिस मार्ग से समाधान निकलता है, वह पात्रों के बीच |और -अक्षरों से चिह्नित होता है +

इनपुट विनिर्देशन

इनपुट के रूप में उपर्युक्त उदाहरण की तरह एक समाधान के साथ आपका कार्यक्रम एक लूप पहेली प्राप्त करेगा। आपका प्रोग्राम इनपुट से पहेली के आकार का अनुमान लगाएगा। आप इनपुट के बारे में निम्नलिखित अनुमान लगा सकते हैं:

  • पहेली में 2 से कम नहीं और किसी भी दिशा में 99 से अधिक सेल नहीं हैं
  • इस प्रकार, प्रत्येक पंक्ति में अधिकतम वर्णों की लंबाई होती है, जिनमें नई वर्ण रेखा नहीं होती है
  • इस प्रकार, इनपुट में अधिकतम 99 लाइनें हैं
  • प्रत्येक पंक्ति अंतिम मुद्रण योग्य वर्ण के बाद समाप्त हो सकती है या व्हॉट्सएप वर्णों के साथ गद्देदार हो सकती है, इसलिए इसमें अधिकतम 2 · y + 1 वर्ण हैं जहां y क्षैतिज दिशा में कोशिकाओं की संख्या है
  • दोनों x और y निर्देशांक वाली प्रत्येक स्थिति में एक +वर्ण भी होता है
  • +वर्णों वाले पदों के क्षैतिज या लंबवत आसन वाले स्थान या तो एक व्हाट्सएप वर्ण वाले होते हैं, पंक्ति के अंत के पीछे होते हैं या -यदि समीपवर्ती या क्षैतिज रूप से समीपवर्ती हो |तो एक वर्ण होता है।
  • अन्य सभी पदों पंक्ति के अंत के पीछे या तो कर रहे हैं या शामिल पात्रों में से एक , 0, 1, 2, या3
  • सभी पंक्तियों को आपके प्लेटफ़ॉर्म डिफ़ॉल्ट न्यूलाइन वर्ण (एस) के साथ समाप्त किया जाता है
  • बिल्कुल एक अनुगामी न्यूलाइन है

इनपुट निम्नलिखित तरीकों से प्राप्त किया जाएगा:

  • मानक इनपुट से
  • pHTTP POST अनुरोध में नामित पैरामीटर के मान के रूप में
  • HTML फॉर्म की सामग्री के रूप में
  • pकार्यान्वयन-परिभाषित निर्देशिका में नामित फ़ाइल की सामग्री के रूप में
  • पूर्व चार उपलब्ध नहीं हैं, तो रनटाइम पर एक कार्यान्वयन परिभाषित तरीके से
  • यदि आपकी भाषा इनपुट प्राप्त करने का कोई साधन उपलब्ध नहीं कराती है तो हार्ड कोडित

आउटपुट विनिर्देश

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

  • शून्य से बाहर निकलने की स्थिति के रूप में (समाधान वैध है) या गैर-शून्य (समाधान अमान्य है)
  • जैसा कि चरित्र y(समाधान मान्य है) या n(समाधान अमान्य है) इसके बाद कार्यान्वयन परिभाषित तरीके से शून्य या अधिक मनमाने पात्रों का उत्पादन होता है

इनपुट विनिर्देशन के अनुसार इनपुट का सामना नहीं करते समय आपके प्रोग्राम का व्यवहार अनिर्दिष्ट होता है।

स्कोरिंग

आपके कार्यक्रम का स्कोर इसके स्रोत में वर्णों की संख्या को छोड़कर, व्हाट्सएप योग्य वर्णों और अप्रचलित टिप्पणियों को छोड़कर है। आपको अपनी अधीनता को प्रोत्साहित करने के लिए प्रोत्साहित किया जाता है ताकि दूसरों के लिए पढ़ना आसान हो और अपने समाधान पर टिप्पणी करना आसान हो।

प्रस्तुतियाँ जो इनपुट या आउटपुट विनिर्देश का पालन करने में विफल रहती हैं या गलत परिणाम उत्पन्न करती हैं, वे अमान्य हैं।


इनपुट कैसे संभाला जाता है? एक फ़ाइल से पढ़ें? STDIN? क्या मैं एक फ़ंक्शन लिख सकता हूं?
मार्टिन एंडर

@ मार्टिनबटनर "आपका कार्यक्रम प्राप्त करेगा ..."। यकीन नहीं होता कि आप फ़ाइल से क्यों पढ़ना चाहते हैं।
जॉन ड्वोरक

@ मार्टिनबटनर आपको एक पूरा कार्यक्रम लिखना होगा। मुझे लगता है कि भाषा "आपका कार्यक्रम", "समाप्त हो जाएगा", "निकास स्थिति" बहुत स्पष्ट है।
FUZxxl

1
यह भी ध्यान दें कि अधिकांश पहेलियों 0में एक सेल के लिए एक वैध संख्या भी होती है।
हावर्ड

@ हॉवर्ड क्षमा करें, वह चूक गया।
फ़ूजएक्सएक्स

जवाबों:


2

GolfScript, 133 वर्ण

'|':^4,{48+.(}%+^*1>.^/'-'*+2/:F;4{{~@@/*}2F//n%zip-1%n*}:X*.'+-'?.3+@/(-2<' 9'+\+'9-+  99|+  9'3/:F;.,4*{X}*.9`?@=\' +09
'-!&'ny'1/=

एसटीडीआईएन से इनपुट की उम्मीद है और yएक वैध समाधान के लिए और nएक अमान्य के लिए प्रिंट करता है। ग्रिड पर या ग्रिड के घुमाए गए संस्करणों के साथ ज्यादातर स्ट्रिंग-प्रतिस्थापन का उपयोग करके कार्य करता है।

एनोटेट कोड:

# construct the string "|0|/|1|0|2|1|3|2-0-/-1-0-2-1-3-2"
# split into pieces of two and save to variable F
'|':^4,{48+.(}%+^*1>.^/'-'*+
2/:F;

# run the code block X 4 times
# with X: string-replace 1st item in F with 2nd, 3rd with 4th, ...
# i.e. '|0' with '|/', '|1' with '|0'
# and then rotate grid by 90 degrees
4{{~@@/*}2F//n%zip-1%n*}:X*

# for a valid grid all digits are now reduced to exactly '0'
# (i.e. no '1' or '2' or '3' or '/')

# now follow the loop along and remove it
# start: find the first occurence of '+-+' and replace with '+ 9'
# note: '9' is the marker for the current position
.'+-'?
.3+@/(-2<' 9'+\+

# string-replace '9-+' or '9|+' by '  9' (i.e. go one step along the loop)
# using block X enough times
'9-+  99|+  9'3/:F;
.,4*{X}*

# look for the marker '9' in the result and check if it is at the original
# position again
.9`?
@=

# the remaining grid must not contain any digits besides 0 and 9
# esp. no '|' or '-' may remain
\' +09
'-!

# check if both conditions are fulfilled and output corresponding character
&'ny'1/=

2

C # 803 579bytes

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

गोल्फ कोड:

using C=System.Console;class P{static void Main(){var D=C.In.ReadToEnd().Replace("\r","").Split('\n');int w=D[0].Length+2,h=D.Length+1,i=0,j,c,T=0,O=1,o,z,R=0;var B=new int[w,h];var S=new int[w*h*9];for(;i++<w-2;)for(j=0;j<h-2;B[i,j]=c)if((c=(D[j++][i-1]-8)%10)>5){c=5;T++;S[0]=i+j*w;}for(i=0;++i<w-1;)for(j=0;++j<h-1;)R=(i%2+j%2>1&(o=B[i,j-1]%2+B[i-1,j]%2+B[i+1,j]%2+B[i,j+1]%2)>0&o!=2)|((c=B[i,j])<4&c!=o)?7:R;for(o=h=0;o<O;B[i,j]=0)if(B[i=(c=S[o++])%w,j=c/w]>4){h++;S[O++]=(S[O++]=c-w-1)+2;S[O++]=(S[O++]=c+w-1)+2;z=j%2<1?w*2:2;S[O++]=c-z;S[O++]=c+z;}C.Write(h-R<T?"n":"y");}}

कोड 3 चेक करता है, पहले प्रत्येक संख्या के चारों ओर लाइनों की संख्या की जांच करता है और प्रत्येक जंक्शन पर 0 या 2 लाइनें होती हैं, जिससे सभी लाइनें एक साथ जुड़ जाती हैं।

प्रारूपित कोड:

using C=System.Console;

class P
{
    static void Main()
    {
        var D=C.In.ReadToEnd().Replace("\r","").Split('\n');
        int w=D[0].Length+2,h=D.Length+1,i=0,j,c,T=0,O=1,o,z,R=0;
        var B=new int[w,h]; // this is the grid
        var S=new int[w*h*9]; // this is a list of joined up lines (stored as x+y*w)

        for(;i++<w-2;)
            for(j=0;j<h-2;B[i,j]=c)
                if((c=(D[j++][i-1]-8)%10)>5)
                { // we are a line
                    c=5;
                    T++; // increment line counter
                    S[0]=i+j*w; // set start of loop
                }

        for(i=0;++i<w-1;) // this loop checks the numbers and that every + has 0 or 2 lines leading from it
            for(j=0;++j<h-1;)
                R=(i%2+j%2>1&(o=B[i,j-1]%2+B[i-1,j]%2+B[i+1,j]%2+B[i,j+1]%2)>0&o!=2)|((c=B[i,j])<4&c!=o)?7:R; // set R to 7 (no significance) if check fails

        for(o=h=0;o<O;B[i,j]=0) // this loops through the list of joined lines adding more until the whole loop has been seen
            if(B[i=(c=S[o++])%w,j=c/w]>4)
            {
                h++; // increment "seen" counter
                S[O++]=(S[O++]=c-w-1)+2;
                S[O++]=(S[O++]=c+w-1)+2;
                z=j%2<1?w*2:2; // special for | and -
                S[O++]=c-z;
                S[O++]=c+z;
            }

        C.Write(h-R<T?"n":"y"); // check if R is greater than 0 or h is less than T and output appropriately
    }
}

धन्यवाद @ edc65, कोई विचार नहीं कि मैं कैसे चूक गया!
विजुअलमेल

1

कोबरा - 514

class P
    def main
        t,m,g=[[1]][:0],nil,File.readAllLines('p')
        u,i=g[0].length,1
        for l in g.length,for c in u,if g[l][c]in'0123'
            n=0
            for j in-1:2:2,for r in[g[l+j][c],g[l][c+j]],if r in'-|',n+=1
            if'[n]'<>g[l][c],m?='n'
        else if g[l][c]in'-|',x,y,t,d=c,l,t+[[c,l]],g[l][c]
        while i
            i=z=6
            for f,b in[[-1,1],[1,1],[0,2],[-1,-1],[+1,-1],[0,-2]]
                if'-'==d,f,b=b,f
                for w in t.count,if z and t[w]==[x+f,y+b],t,x,y,d,z=t[:w]+t[w+1:],x+=f,y+=b,g[y][x],0
                i-=z//6
        print if(t.count,'n',m?'y')

जाँच करता है कि क्या प्रत्येक संख्या में उसके बगल में लाइनों की सही संख्या है, और फिर लाइनों के चारों ओर एक रास्ता चलता है और जांचता है कि क्या यह किसी भी तरह से चूक गया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.