লুপী সমাধানগুলি বৈধ করুন


9

এটি লুপী ধাঁধা তৈরির জন্য অতিরিক্ত চ্যালেঞ্জ। আপনি আগের লিঙ্কে আরও কঠিন চ্যালেঞ্জ চেষ্টা করার আগে এই চ্যালেঞ্জটি সমাধান করতে চাইতে পারেন।

এই চ্যালেঞ্জটির লক্ষ্য হ'ল লুপ ধাঁধাটির সমাধানটি বৈধতা দেওয়া। পূর্ববর্তী লিঙ্ক থেকে লুপ ধাঁধাটি কী তা সম্পর্কে সমস্ত ডকুমেন্টেশন নিন। একটি সমাধান করা লুপি ধাঁধাটি "লুপী ধাঁধা উত্পন্ন করুন" চ্যালেঞ্জটিতে বৈধ জমা দেওয়ার আউটপুটের সাথে খুব অনুরূপভাবে ফর্ম্যাট করা হয় এবং এটি দেখতে দেখতে এটি হতে পারে:

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

সমাধানটি তৈরি করে এমন পথটি অক্ষরের সাথে চিহ্নিত |এবং -অক্ষরগুলির মধ্যে রয়েছে +

ইনপুট স্পেসিফিকেশন

আপনার প্রোগ্রামটি ইনপুট হিসাবে উপরের উদাহরণের মতো সমাধানের মতো সমাধানের সাথে একটি লুপ ধাঁধা পাবে। আপনার প্রোগ্রামটি ইনপুট থেকে ধাঁধাটির আকার নির্ধারণ করবে। আপনি ইনপুট সম্পর্কে নিম্নলিখিত অনুমানগুলি করতে পারেন:

  • ধাঁধাটির 2 টিরও কম এবং কোনও দিকের 99 টিরও বেশি ঘর নেই
  • সুতরাং, প্রতিটি লাইনের সর্বাধিক দৈর্ঘ্যের 199 টি অক্ষর রয়েছে যা নিউলাইন অক্ষর (গুলি) সহ অন্তর্ভুক্ত নয়
  • সুতরাং, ইনপুটটিতে সর্বাধিক 99 লাইন রয়েছে
  • প্রতিটি লাইন শেষ মুদ্রণযোগ্য অক্ষরের পরে শেষ হতে পারে বা শ্বেতক্ষেত্রের অক্ষরগুলির সাথে প্যাড করা যেতে পারে তাই এটির দৈর্ঘ্য 2 · y + 1 অবধি রয়েছে যেখানে y অনুভূমিক দিকের কোষের সংখ্যা
  • উভয় x এবং y স্থানাঙ্ক সহ প্রতিটি অবস্থান এমনকি একটি +অক্ষর ধারণ করে
  • অনুভূমিকভাবে অক্ষরযুক্ত অবস্থানগুলির সাথে অনুভূমিকভাবে বা উল্লম্বভাবে সংলগ্ন অবস্থানগুলিতে +হয় একটি শ্বেতস্পেস অক্ষর রয়েছে, রেখার শেষের পিছনে থাকে বা -অনুভূমিকভাবে সংলগ্ন যদি একটি অক্ষর থাকে বা |উল্লম্বভাবে সংলগ্ন হয় তবে একটি অক্ষর থাকে
  • অন্যান্য সমস্ত অবস্থান হয় লাইন শেষের পিছনে বা একটি অক্ষর ধারণ করে , 0, 1, 2, অথবা3
  • সমস্ত প্ল্যাটফর্ম আপনার প্ল্যাটফর্মের ডিফল্ট নিউলাইন অক্ষর (গুলি) দিয়ে শেষ করা হয়
  • ঠিক একটি পিছনে নতুনলাইন আছে

ইনপুট নিম্নলিখিত যে কোনও একটিতে প্রাপ্ত হবে:

  • স্ট্যান্ডার্ড ইনপুট থেকে
  • নামের একটি প্যারামিটারের মান হিসাবে pHTTP পোষ্ট অনুরোধে
  • একটি HTML ফর্ম বিষয়বস্তু হিসাবে
  • নামে একটি ফাইলের বিষয়বস্তু হিসাবে pকোনও প্রয়োগের সংজ্ঞাযুক্ত ডিরেক্টরিতে
  • প্রাক্তন চারটি উপলভ্য না হলে রানটাইমে একটি বাস্তবায়নের সংজ্ঞায়িত উপায়ে
  • আপনার কোড যদি ইনপুট পাওয়ার কোনও অর্থ সরবরাহ করে না তবে হার্ড কোডিং

আউটপুট স্পেসিফিকেশন

আপনার প্রোগ্রামটি ইনপুট নির্দিষ্টকরণের সাথে মেলে সমস্ত ইনপুটগুলির জন্য সমাপ্ত হবে এবং ধাঁধার সমাধানটি সঠিক কিনা তা গণনা করবে। আপনার প্রোগ্রামটি নিম্নলিখিত পদ্ধতিগুলির মধ্যে একটিতে বুলিয়ান মান হিসাবে গণনার ফলাফল আউটপুট করবে:

  • শূন্য (সমাধানটি বৈধ) বা শূন্য-শূন্য (সমাধানটি অবৈধ) এর প্রস্থান স্থিতি হিসাবে
  • অক্ষর হিসাবে y(সমাধান বৈধ) অথবা n(সমাধানটি অবৈধ) এর পরে শূন্য বা আরও বেশি নির্বিচারে অক্ষরের আউটপুট একটি বাস্তবায়ন সংজ্ঞায়িত উপায়ে

ইনপুট স্পেসিফিকেশন অনুসারে ইনপুট ফর্ম্যাট না হওয়াতে আপনার প্রোগ্রামের আচরণটি অনির্দিষ্ট।

স্কোরিং

আপনার প্রোগ্রামের স্কোর হ'ল বাদ দেওয়া যায় এমন সাদা বর্ণের অক্ষর এবং বাদ দেওয়া যায় এমন মন্তব্য ব্যতীত এর উত্সের অক্ষরের সংখ্যা। আপনার জমা জমা দেওয়ার জন্য আপনাকে উত্সাহ দেওয়া হয়েছে যাতে অন্যের পক্ষে পড়া সহজ হয় এবং আপনার সমাধানটি মন্তব্য করা সহজ হয় যাতে এটি অনুসরণ করা সহজ।

ইনপুট বা আউটপুট স্পেসিফিকেশন অনুসরণ করতে বা ভুল ফলাফল উত্পন্ন করতে ব্যর্থ এমন জমাগুলি অবৈধ।


কীভাবে ইনপুট পরিচালনা করা যায়? একটি ফাইল থেকে পড়া? Stdin? আমি কি একটি ফাংশন লিখতে পারি?
মার্টিন এন্ডার

@ মার্টিনব্যাটনার "আপনার প্রোগ্রামটি গ্রহণ করবে ..."। আপনি কেন কোনও ফাইল থেকে পড়তে চান তা নিশ্চিত নয়।
জন ডিভোরাক

@ মার্টিনব্যাটনার আপনাকে একটি সম্পূর্ণ প্রোগ্রাম লিখতে হবে। আমি মনে করি "আপনার প্রোগ্রাম", "ভাষাটি" সমাপ্ত হবে "," প্রস্থান স্থিতি "বেশ পরিষ্কার।
FUZxxl

1
আরও লক্ষ করুন যে বেশিরভাগ ধাঁধাতে 0কোনও ঘরের জন্য একটি বৈধ সংখ্যাও।
হাওয়ার্ড

@ হওয়ার্ড দুঃখিত, মিস করেছি।
FUZxxl

উত্তর:


2

গল্ফস্ক্রিপ্ট, 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/=

STDIN থেকে ইনপুটটি প্রত্যাশা করে এবং 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

সি # 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
    }
}

ধন্যবাদ @ এডসি 65, আমি কীভাবে মিস করেছি তার কোনও ধারণা নেই!
ভিজ্যুয়েলমেলন

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')

প্রতিটি সংখ্যার পাশের লাইনের সঠিক সংখ্যা রয়েছে কিনা তা পরীক্ষা করে এবং তারপরে লাইনগুলির চারপাশে একটি পথ হাঁটায় এবং এটি কোনও অনুপস্থিত আছে কিনা তা পরীক্ষা করে দেখুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.