না। এমন কি. নাচা


50

এখানে চিত্র বর্ণনা লিখুন

আপনার জীবন এই উপর নির্ভর করতে পারে। পলক দেবেন না। পলকও না। চোখের পলক এবং আপনি মারা গেছেন। তারা দ্রুত। আপনি বিশ্বাস করতে পারেন চেয়ে দ্রুত। আপনার পেছন ফিরে না, পিছনে তাকান না, এবং ঝলকান না! শুভকামনা।

কান্নাকাটি এঞ্জেলস একটি পরকীয়া জাতি যা অন্য সত্তা (এমনকি অন্য এক দেবদূত) দ্বারা পর্যবেক্ষণের সময় চলতে পারে না। তারা তাদের ভুক্তভোগীদের সময়মতো পাঠিয়ে খাওয়ায় আপনি ( দ্য ডক্টর ) কিছু লোকের সাথে একটি ঘরে আটকা পড়েছেন এবং আপনার টার্ডিসে উঠতে হবে।


কার্য

একটি প্রোগ্রাম লিখুন যা একটি আয়তক্ষেত্রাকার কক্ষের ASCII উপস্থাপনা দেওয়া হলে এমন একটি পথ আউটপুট দেয় যা আপনাকে সুরক্ষায় নিয়ে যাবে। যদি কোনও অ্যাঞ্জেল আক্রমণ করতে পারে - আপনার অগ্রগতির সময় যে কোনও সময় - তবে সেই পথটি নিরাপদ নয়। কোনও দেবদূত আক্রমণ করতে পারে যদি তা আপনাকে বা অন্য কোনও দেবদূত দেখা না গিয়ে দেখায়।

ইনপুট

ইনপুট দুটি অংশ। প্রথমত, আপনি যে দিকে মুখোমুখি হচ্ছেন (এনএসইডাব্লু)। তারপরে উত্তরসূরিগুলি, ঘরের উপস্থাপনা, প্রারম্ভিক / শেষের অবস্থানগুলি এবং সমস্ত অ্যাঞ্জেলসের অবস্থান / মুখোমুখি।

নীচের নমুনাটি দেখায় যে পশ্চিমের দিকে মুখ করে একটি দেবদূত রয়েছে এবং আপনি দক্ষিণের দিকে মুখ শুরু করছেন।

S
..........
....D.....
..........
..........
..........
..........
..........
..........
.........W
..........
...T......
  • . - শুন্যস্থান
  • D - ডাক্তার (শুরুর অবস্থান)
  • T - টার্ডিস (শেষ অবস্থান)
  • N,S,E,W - একটি দেবদূত, নির্দিষ্ট দিকের দিকে মুখ করে (উত্তর, দক্ষিণ, পূর্ব, পশ্চিম)

দর্শন রেখা

আপনি যে দিকটির মুখোমুখি হচ্ছেন তার 45 ডিগ্রি সহ কোনও স্থান দেখতে পাবেন। প্রত্যক্ষ অনুভূমিক, উল্লম্ব বা 45-ডিগ্রি তির্যক বরাবর অন্য সত্তা থাকলে দৃষ্টির রেখা বাধা দেয়। অন্য কোনও তির্যক দৃষ্টিতে বাধা দেয় না । এঞ্জেলসের দৃষ্টির রেখা একইভাবে কাজ করে। উদাহরণস্বরূপ, নিম্নলিখিতটিতে, -আপনি দক্ষিণের দিকে মুখ করে ধরে নিলেন এমনটি আপনার ক্ষেত্রের প্রতিনিধিত্ব করে।

........
...D....
..---...
.-----..
-------.
---N----
---.--N-
---.----

আউটপুট

আউটপুটটি এমন একটি স্ট্রিং যা আপনি প্রস্থান করতে যে পথে নেবেন তা উপস্থাপন করে। যদি একাধিক নিরাপদ পথ থাকে তবে যে কোনও একটি বেছে নিন। যদি কোনও পথ নিরাপদ না হয় তবে আউটপুট 0। মানচিত্রটি যদি ত্রুটিযুক্ত হয় তবে ক্র্যাশ হয়ে যাওয়া সহ আপনার যা খুশি তাই করুন। কক্ষটি আয়তক্ষেত্রাকার না হলে, কোনও প্রস্থান নেই, ইত্যাদি বিবেচনা করুন If যদি কোনও অ্যাঞ্জেল না থাকে তবে এটি ত্রুটিযুক্ত নয়, সহজ।

প্রতিটি পদক্ষেপের জন্য, আপনি দুটি কাজের মধ্যে একটি করতে পারেন: এনএসইডাব্লু নির্দেশে চলে যান, বা এনএসইডাব্লু দিকটি (অবস্থান পরিবর্তন না করে) দিকে ঘুরুন। সরানোর জন্য, কেবলমাত্র সেই দিকের জন্য চিঠিটি আউটপুট করুন। কোনও দিকের মুখোমুখি Fহওয়ার জন্য, উপযুক্ত বর্ণের পরে আউটপুট । উদাহরণস্বরূপ, নিম্নলিখিত আউটপুট:

SSFESSSSSSSW

ইনপুট বিভাগে দেওয়া নমুনার জন্য একটি নিরাপদ পথ। আপনি দু'বার দক্ষিণে চলে যান, দেবদূতকে দেখার জন্য পূর্বে মুখোমুখি হন, তারপরে তার্ডিসে প্রবেশের জন্য আরও সাতবার দক্ষিণে এবং পশ্চিমে একবার যান।

পরীক্ষার মামলা

1) টারডিসে উঠতে আপনি পূর্বমুখী এঞ্জেলকে ঘুরে দেখতে পারেন। আপনি তাদের মধ্যে সরাসরি পদক্ষেপ না নিলে তারা একে অপরকে জায়গায় তালাবন্ধ করে রাখে, তাই আপনি যে কোনও মুহুর্তে কোন পথে মুখোমুখি হন তা বিবেচ্য নয়।

W
...D....
........
........
........
.E.....W
........
........
...T....

2) আপনি হারান। এগুলি পেরিয়ে যাওয়ার কোনও উপায় নেই। আপনি তাদের মধ্যে পদক্ষেপ না দেওয়া পর্যন্ত তারা একে অপরকে দেখতে পাবে। এই মুহুর্তে, আপনি তাদের উভয়ের মুখোমুখি হতে পারবেন না এবং আপনার কাজ শেষ হয়েছে। পাশাপাশি আপনার চোখ বন্ধ করুন এবং এটির সাথে মিলিত হবেন।

S
...D....
........
........
........
E......W
........
........
...T....

জয়লাভ

স্ট্যান্ডার্ড গল্ফ নিয়ম এবং লুফোলগুলি প্রয়োগ হয়, কমপক্ষে বাইটস জিত। আমি শীঘ্রই আরও কিছু পরীক্ষার কেসগুলি পাওয়ার চেষ্টা করব, তবে এর মধ্যে আপনার নিজের পরামর্শ দিতে নির্দ্বিধায়।

ডক্টর হু এর চিত্র এবং উদ্ধৃতি।


গ্রাফের মাধ্যমে পথ খোঁজার জন্য কি আমরা একটি গ্রন্থাগার ব্যবহার করতে পারি?
স্পার

@ স্পার হ্যাঁ, তবে লাইব্রেরিটি লোড / অন্তর্ভুক্ত করার জন্য প্রয়োজনীয় কিছু বাইট গণনায় যুক্ত করা উচিত।
জিওবিটস

2
অবশ্যই একটি ঘূর্ণি ম্যানিপুলেটর ব্যবহার করুন!
TheDoctor

4
@ ডক্টর জ্যাক তার সাথে নিয়ে গিয়েছিল এবং আপনি দেখতে পাচ্ছেন যে সে কোনও মানচিত্রে নেই ( J)।
জিওবিটস

1
@ টিমি স্ট্যান্ডার্ড সংজ্ঞাগুলির যে কোনওটি ব্যবহার করা যেতে পারে।
জিওবিটস

উত্তর:


6

পাইথন - 559 565 644 633

M=input()
I=1j
Q={"S":I,"N":-I,"E":1,"W":-1}
A=[]
e=enumerate
for y,l in e(M[2:].split()):
 for x,c in e(l):
    P=x+y*1j
    if c=="D":D=(P,Q[M[0]])
    elif c=="T":T=P
    elif c!=".":A+=[(P,Q[c])]
def s(D,h,r=[]):
 def L(X,p,d):
    S=[p+d*(i+j*I)for i in range(x+y)for j in range(-i+1,i)if j]
    for f in[1,1+I,1-I]:
     i=0
     while i<x+y>1>(S[-1]in[a[0]for a in[D]+A]+[T])*i:i+=1;S+=[p+i*f*d]
    return X[0]in S
 if y>=D[0].imag>=(D[0]in[a[0]for a in A])<all(any(L(a,*b)for b in[D]+A)for a in A if L(D,*a))>(D in r)<=D[0].real<=x:
    r+=[D]
    if D[0]==T:print h;exit()
    for n in"SWEN":s((D[0]+Q[n],D[1]),h+n,r);s((D[0],Q[n]),h+"F"+n,r)
s(D,"")
print"0"

ইনপুটটি এইভাবে সরবরাহ করতে হবে:

"W\n...D....\n........\n........\n........\nE......W\n........\n........\n...T....\n"

মূলত এটি সমস্ত পদ্ধতির (অবস্থান এবং দিকনির্দেশ) অনুসন্ধানে ডক্টর নিরাপদে পৌঁছে দিতে, সেখানে কীভাবে পৌঁছেছেন তা সংরক্ষণ করে এবং সাফল্যের ক্ষেত্রে উপায়টি মুদ্রণের জন্য এই পদ্ধতির প্রয়োগ করে। জটিল সংখ্যা সহ অবস্থান এবং দিকনির্দেশগুলি উপলব্ধি করা যায়।

আমি সম্ভবত সেজের জটিল সংখ্যা গাণিতিকগুলি ব্যবহার করে কিছু অক্ষর নিরাপদ করতে পারলাম, তবে এটি অত্যন্ত দীর্ঘস্থায়ী হবে would

আমি প্রথমে ভেবেছিলাম যে তার্দিসে পৌঁছার পরে ডাক্তারকে একটি নির্দিষ্ট দিকের দিকে নিয়ে যাওয়ার মাধ্যমে আমি ছয়টি চরিত্রকে বাঁচাতে পারি, তবে আমি বুঝতে পেরেছিলাম যে এর ফলে ভুল সমাধান হতে পারে। এছাড়াও আমি প্রথমে নিয়মগুলি ভুলভাবে পড়েছি।

এখানে বেশিরভাগ অলংগ সংস্করণ রয়েছে:

Map = input()

I = 1j
string_to_dir = {"S":I,"N":-I,"E":1,"W":-1}

Angels = []
Pos = 0
direction = string_to_dir[Map[0]]
for y,line in enumerate(Map[2:].split()):
    for x,char in enumerate(line):
        Pos = x+y*1j
        if char == "D":
            Doctor = (Pos, direction)
        elif char == "T":
            Tardis = (Pos, direction)
        elif char != ".":
            Angels += [(Pos,string_to_dir[char])]

reachables = []

def display(LoS, Doctor):
    string = ""
    for y,line in enumerate(Map[2:].split()):
        for x,char in enumerate(line):
            if x+y*1j == Doctor[0]:
                string += "D"
            elif x+y*1j in LoS:
                if char in ".D":
                    string += "*"
                else:
                    string += "X"
            elif char != "D":
                string += char
            else:
                string += "."

        string += "\n"
    print string

def LoS(angel,Doctor):
    p,d = angel
    Sight = []
    for i in range(x+y):
        for j in set(range(-i+1,i))-{0}:
            Sight += [p+d*i+d*j*I]
    for line in [d, (1+I)*d, (1-I)*d]:
        for i in range(1,x+y):
            Pos = p + i*line
            Sight += [Pos]
            if Pos in [angel[0] for angel in Angels+[Doctor, Tardis]]:
                break
    return Sight

def search(Doctor, history):
    global reachables

    Sight = sum([LoS(angel, Doctor) for angel in [Doctor]+Angels],[])

    if (
                all(angel[0] in Sight for angel in Angels if Doctor[0] in LoS(angel, Doctor))
            and not (Doctor in reachables)
            and (0<=Doctor[0].imag<=y)
            and (0<=Doctor[0].real<=x)
            and (Doctor[0] not in [angel[0] for angel in Angels])
        ):

        reachables += [Doctor]

        if Doctor[0] == Tardis[0]:
            print history
            exit()
        for new_direction in "SWEN":
            search((Doctor[0]+string_to_dir[new_direction], Doctor[1]), history + new_direction)
            search((Doctor[0], string_to_dir[new_direction]), history + "F" + new_direction)

search(Doctor, "")
print "0"

পরীক্ষার মামলা

পরীক্ষার কেস 1:

SSSFSWWWSSSSFWEFSEFWE

পরীক্ষার কেস 2:

0

ভিজ্যুমেলনের পরীক্ষার কেস:

SSFWSSSSSFSWWSSWWWFWEEEEFSEFWEFSE

1
আমি আপনার কোড পরীক্ষা করিনি, তবে মনে হচ্ছে আপনি পরীক্ষার কেস 1 এর জন্য আউটপুটটি দু'বার পেস্ট করেছেন! এছাড়াও আপনি যদি আমার প্রস্তাবিত পরীক্ষার কেসটি খাওয়ান তবে আপনার প্রোগ্রামটি কী উত্পাদন করে তা আমি আগ্রহী।
ভিজ্যুয়ালমেলন

@ ভিজুয়ালমেলন: দাগ দেওয়ার জন্য আপনাকে ধন্যবাদ এবং আমি পরীক্ষার কেসটি সংহত করেছি।
Wrzlprmft

10

সি # 1771 2034 1962 1887 1347 বাইটস

ব্লক করা লোস চেকিংটিকে 1 টি লুপে পুনরায় লিখেছেন, এটি আরও পরিশ্রমী করে তোলে এবং প্রায় 450 বাইট সংক্ষিপ্ত করে তোলে

using C=System.Console;using T=System.Math;struct P{int x,y,d;static void Main(){int v=C.ReadLine()[0],w,h,i,o=0,x=0,y=0,O,E,F,e=46;var R=C.In.ReadToEnd().Replace("\r","");var M=new int[w=R.IndexOf("\n"),h=(R.Length+1)/(w+1)];for(;o<h;o++)for(i=0;i<w;i++)if((M[i,o]=R[o+o*w+i])==68)M[x=i,y=o]=e;System.Func<int,int,int,bool>S=null;S=(X,Y,D)=>{var Z="SSSE_WNNNE_W___E_W";int I=0,H=0,L=0,J=Y,K=M[X,Y],B;M[X,Y]=D>0?D:K;for(H=0;H<9;H++)for(I=X,J=Y;H!=4&(I+=H%3-1)<w&I>=0&(J+=H/3-1)<h&&J>=0;){if(((B=M[I,J])==Z[H]|B==Z[H+9])&(D<1||!S(I,J,0)))goto W;if(B!=e)break;}for(B=I=-1;++I<w;B=1)for(J=0;J<h;J++)if(I!=X&J!=Y&(((B=M[I,J])==87&I>X&(H=T.Abs(J-Y))<I-X)|(B==69&I<X&H<X-I)|(B==78&J>Y&(L=T.Abs(I-X))<J-Y)|(B==83&J<Y&L<Y-J))&(D<1||!S(I,J,0)))goto W;W:M[X,Y]=K;return B>1;};P a,p=new P{x=x,y=y,d=v};var A=new System.Collections.Generic.List<P>();System.Action q=()=>{if(((E=M[p.x,p.y])==e|E==84)&!A.Contains(p)&!S(p.x,p.y,p.d))A.Add(p);};q();for(o=0;(O=A.Count)!=o;o=O)for(i=O;i-->o;){p=A[i];if((E=M[p.x,p.y])==84)for(R="";;p=a){i=0;n:a=A[i++];O=T.Abs(p.y-a.y)+T.Abs(a.x-p.x);if(O==1&p.d==a.d)R=(a.y-p.y==1?"N":p.y-a.y==1?"S":a.x-p.x==1?"W":"E")+R;else if(O<1)R="F"+(char)p.d+R;else goto n;if(i<2)goto Z;}if(E==e){if(p.x-->0)q();p.x+=2;if(p.x<w)q();p.x--;if(p.y-->0)q();p.y+=2;if(p.y<h)q();p.y--;for(F=0;F<4;q())p.d="NESW"[F++];}}R="0";Z:C.WriteLine(R);}}

এটি একটি সম্পূর্ণ প্রোগ্রাম যা প্রত্যাশা করে যে কোনও ইওফ দিয়ে ইনপুটটি শেষ হবে এবং এসটিডিএন-এ দেওয়া হবে। এটি (আশাবাদী) টারডিসের সবচেয়ে সংক্ষিপ্ত পথটি প্রিন্ট করে, বা কোনও পথ না থাকলে "0"। সমস্ত সম্ভাব্য রুটগুলি অনুসরণ করতে এটি একটি নাস্ত্র প্রশস্ত ফার্স্ট অনুসন্ধান ব্যবহার করে, তারপরে এটি আউটপুট একত্রিত করার জন্য টারডিস থেকে ডক্টরকে ব্যাকট্রাক করে।

ফর্ম্যাট কোড:

using C=System.Console;
using T=System.Math;

struct P
{
    int x,y,d;

    static void Main()
    {
        int v=C.ReadLine()[0],w,h,i,o=0,x=0,y=0,O,E,F,e=46;
        var R=C.In.ReadToEnd().Replace("\r","");
        var M=new int[w=R.IndexOf("\n"),h=(R.Length+1)/(w+1)];

        for(;o<h;o++)
            for(i=0;i<w;i++)
                if((M[i,o]=R[o+o*w+i])==68)
                    M[x=i,y=o]=e;

        System.Func<int,int,int,bool>S=null;
        S=(X,Y,D)=>
        {
            var Z="SSSE_WNNNE_W___E_W";

            int I=0,H=0,L=0,J=Y,K=M[X,Y],B;
            M[X,Y]=D>0?D:K;

            for(H=0;H<9;H++)
                for(I=X,J=Y;H!=4&(I+=H%3-1)<w&I>=0&(J+=H/3-1)<h&&J>=0;)
                {
                    if(((B=M[I,J])==Z[H]|B==Z[H+9])&(D<1||!S(I,J,0)))
                        goto W;
                    if(B!=e)
                        break;
                }

            for(B=I=-1;++I<w;B=1)
                for(J=0;J<h;J++)
                    if(I!=X&J!=Y&(((B=M[I,J])==87&I>X&(H=T.Abs(J-Y))<I-X)|(B==69&I<X&H<X-I)|(B==78&J>Y&(L=T.Abs(I-X))<J-Y)|(B==83&J<Y&L<Y-J))&(D<1||!S(I,J,0)))
                        goto W;
        W:
            M[X,Y]=K;
            return B>1;
        };

        P a,p=new P{x=x,y=y,d=v};
        var A=new System.Collections.Generic.List<P>();
        System.Action q=()=>{if(((E=M[p.x,p.y])==e|E==84)&!A.Contains(p)&!S(p.x,p.y,p.d))A.Add(p);};
        q();

        for(o=0;(O=A.Count)!=o;o=O)
            for(i=O;i-->o;)
            {
                p=A[i];
                if((E=M[p.x,p.y])==84)
                    for(R="";;p=a)
                    {
                        i=0;
                    n:
                        a=A[i++];

                        O=T.Abs(p.y-a.y)+T.Abs(a.x-p.x);
                        if(O==1&p.d==a.d)
                            R=(a.y-p.y==1?"N":p.y-a.y==1?"S":a.x-p.x==1?"W":"E")+R;
                        else if(O<1)
                            R="F"+(char)p.d+R;
                        else goto n;

                        if(i<2)
                            goto Z;
                    }
                if(E==e)
                {
                    if(p.x-->0)q();
                    p.x+=2;if(p.x<w)q();p.x--;
                    if(p.y-->0)q();
                    p.y+=2;if(p.y<h)q();p.y--;

                    for(F=0;F<4;q())
                        p.d="NESW"[F++];
                }
            }
        R="0";
    Z:
        C.WriteLine(R);
    }
}

উদাহরণস্বরূপ ইনপুট জন্য আউটপুট

SFESWSSSSSSS

পরীক্ষার ক্ষেত্রে আউটপুট 1)

WSWSWSSSESESE

পরীক্ষার ক্ষেত্রে আউটপুট 2)

0

অনুরোধ হিসাবে আমি একটি নতুন পরীক্ষার কেস উপস্থাপন করছি:

S
..E..DS....
...........
...........
...........
...........
...........
...........
...........
....SSSSS.W
.......T...

আমার প্রোগ্রাম আউটপুট

SESESESESFNSSSSWW

WozzeC এর পরীক্ষার কেস 1:

EEEEFWSSSFNWWN

WozzeC এর পরীক্ষা কেস 2:

FSEEEESFWSSSSWFNWWWNFENNEES

আমি এক্স = সিস্টেম. কনসোল ব্যবহারের সম্ভাবনাটি পুরোপুরি মিস করেছি। তার জন্য আপনাকে ধন্যবাদ :)
WozzeC

@WozzeC আপনি চেক আউট করতে চাইতে পারেন সি # কোড-golfing জন্য টিপস
VisualMelon

আমি বিশ্বাস করি আপনার পরীক্ষার
কেসটি

@ ওজেজেসি দক্ষিণ-পূর্বের পশ্চিম দেবদূত উত্তর-পশ্চিমের পূর্ব দেবদূতকে দেখতে পাবে, তাই ডাক্তার পালাতে পারেন, তবে এই মুহুর্তে, মনে হচ্ছে আমার সমাধানটি লক্ষ্য করা যায় না যে প্রারম্ভকালে ডাক্তার আক্রমণ করা হয়েছে কিনা। এই কোডটি কেন পরীক্ষা করা এত কঠিন!
ভিজুয়ালমেলন

1
দুঃখিত, কিছু মনে করবেন না। আমি সেই ছোট্ট বিবরণটি মিস করেছি যে অন্য কোনও দেবদূত যদি দেখছে তবে তারা স্থানান্তর করতে পারে না।
ওজেজেসি

2

সি # 1454, 1396, 1373, 1303 1279

class P{static int x,d,y=x=d=55,o=170,X=0,Y=0,u,k=3;static string[,]t=new string[o,o];static int[,]m=new int[o,o];static string e=" NS ETD W      .",q="0";static void Main(string[]s){m[0,1]=m[1,8]=-1;m[0,2]=m[1,4]=1;u=e.IndexOf(s[0][0]);for(;k<s[0].Length;k++){var c=s[0][k];if(c=='D'){X=x;Y=y;}if(c=='\\'){y++;x=d;k++;}else m[y,x++]=e.IndexOf(c);}k=A(X,Y,1);if((k&u)!=0){W(X,Y,k,"");}System.Console.Write(q);}static void W(int x,int y,int h,string s){t[y,x]=s;for(int i=1;i<9;i*=2){int l=y+m[0,i],g=x+m[1,i];if(m[l,g]==5)q=t[l,g]=s+e[i];else if(m[l,g]==15){m[l,g]=6;m[y,x]=15;int n=A(g,l,1),U;for(int j=1;j<9;j*=2){var z=t[l,g]??s;if((n&h&j)!=0&z.Length>=s.Length){U=u;u=j;W(g,l,n,s+((u!=j)?"F"+e[j]:"")+e[i]);u=U;}}m[y,x]=6;m[l,g]=0;}}}static int A(int x,int y,int L){int r=15,a,b,c,f=0,g,h,R,B;for(a=1;a<d-5;a++){g=1;for(b=y-a;b<=y+a;b++)for(c=x-a;c<=x+a;c++){B=m[b,c];R=0;bool W=(c+a-x)%a==0,V=(b+a-y)%a==0,z=W&V;if(B>0&B<9&B!=6&B!=5&g!=16&!((W|V)&(f&g)!=0)){h=R;if(b==y-a){R=1;if(c==x-a){h=4;R=9;}else if(c==x+a){h=8;R=5;}B&=h&2;}else if(b==y+a){R=2;if(c==x-a){h=4;R=10;}else if(c==x+a){h=8;R=6;}B&=h&1;}else if(c==x-a){B&=4;R=8;}else if(c==x+a){B&=8;R=4;}else B=0;if(B!=0){if(L==1&&A(c,b,0)==15)r&=R;if(L==0)return R;}}if(z){if(B<9&B>0&!(c==x&y==b))f|=g;g*=2;}}}return r;}}

ঠিক। তাই আমি এটিকে একবার যাব, এবং ছেলেটি কিছুটা সময় নিয়েছিল। এটি বেশিরভাগ লজিকাল অপারেটর ব্যবহার করে নির্মিত built

  • উত্তর = 1 = এন
  • দক্ষিণ = 2 = এস
  • পূর্ব = 4 = ই
  • পশ্চিম = 8 = ডাব্লু
  • ডাক্তার = 6 = ডি
  • টারডিস = 5 = টি
  • 15 =। <-সমস্ত মুক্ত স্থান

নুল ইত্যাদির জন্য পরীক্ষা করা এড়াতে আমি সিদ্ধান্ত নিয়েছি [MAX_SIZE * 3] * [MAX_SIZE] * 3 এর একটি ক্ষেত্র এবং গেম বোর্ডটিকে কেন্দ্রের কাছাকাছি রেখে দেব।

লুপ চেকগুলি 50 (MAX_SIZE) এর ভিতরে এবং বাইরে সমস্তভাবে সম্পন্ন করা হয়। সুতরাং এর মতো কিছু:

22222
21112
21D12
21112
22222

যখন কোনও EWS বা N পাওয়া যায় আমি তাদের পক্ষ থেকে একই চেক করি। এঞ্জেলস (ডাক্তার নয়) এর দিকে যদি কিছু পাওয়া যায় তবে তারা ফ্রি প্যাসেজ হিসাবে 15 ফেরত দেয়। যদি তাদের দিকে নজর না দেওয়া থাকে তবে তারা কীভাবে ডাক্তারকে নিরাপদে থাকার মুখোমুখি হতে হবে সেগুলি ফিরে আসে। অর্থ্যাৎ দক্ষিণ দক্ষিণের জন্য 2 ফিরে আসবে। যদি এটি NW বা NE না হয় তবে এটি যথাক্রমে 6 (2 + 4) এবং 10 (2 + 8) ফেরত আসবে।

যদি দু'জন স্বর্গদূত ডক্টরকে পর্যবেক্ষণ করে থাকেন তবে এগুলি থেকে ফেরতের মানগুলি "অ্যান্ডড" হবে তাই পরীক্ষার উদাহরণে 2 ক্রাঙ্কপজিশনগুলি 4 এবং 8 টি 0 এ পরিণত হবে Meaning মানে অবস্থানটি খারাপ এবং এড়ানো উচিত।

প্রসারিত কোড:

class P
{
    static int x,d,y=x=d=55,o=170,X=0,Y=0,u,k=3;
    static string[,] t = new string[o, o];
    static int[,] m = new int[o, o];
    static string e = " NS ETD W      .", q="0";
    static void Main(string[]s)
    {   
        m[0, 1]=m[1, 8]=-1;
        m[0, 2]=m[1, 4]=1;
        u=e.IndexOf(s[0][0]);
        for (;k<s[0].Length;k++)
        {
            var c = s[0][k];
            if (c == 'D') { X = x; Y = y; }
            if (c == '\\') { y++; x = d; k++; }
            else m[y, x++] = e.IndexOf(c);
        }
        k=A(X,Y,1);
        if ((k&u)!=0)
        {
            W(X, Y, k,"");
        }
        System.Console.Write(q);
    }
    static void W(int x,int y,int h,string s){
        t[y, x] = s;
        for (int i = 1; i < 9; i*=2)
        {
            int l = y+m[0, i], g = x+m[1, i];
            if (m[l, g] == 5)
                q = t[l, g] = s + e[i];
            else if (m[l, g] == 15)
            {
                m[l, g] = 6;
                m[y, x] = 15;
                int n = A(g, l,1),U;
                for (int j = 1; j < 9; j *= 2)
                {
                    var z = t[l, g]??s;
                    if ((n & h & j) != 0 & z.Length>=s.Length)
                    {
                        U = u;
                        u = j;
                        W(g, l, n,s+((u != j) ? "F" + e[j] : "") + e[i]);
                        u = U;
                    }
                }
                m[y, x] = 6;
                m[l, g] = 0;
            }
        }
    }
    static int A(int x, int y,int L)
    {
        int r = 15,a,b,c,f=0,g,h,R,B;
        for (a = 1; a < d - 5; a++)
        {
            g = 1;
            for (b = y - a; b <= y + a; b++)
                for (c = x - a; c <= x + a; c++)
                {
                    B=m[b, c];
                    R=0;
                    bool W=(c+a-x)%a==0,V=(b+a-y)%a==0,z=W&V; 
                    if (B>0&B<9&B!=6&B!=5&g!=16&!((W|V)&(f&g)!=0))
                    {
                        h=R;
                        if (b==y-a)
                        {
                            R=1;
                            if(c==x-a){h=4;R=9;}
                            else if(c==x+a){h=8;R=5;}
                            B&=h&2;
                        }
                        else if (b==y+a)
                        {
                            R=2;
                            if(c==x-a){h=4;R=10;}
                            else if (c==x+a){h=8;R=6;}
                            B&=h&1;
                        }
                        else if(c==x-a){B&=4;R=8;}
                        else if(c==x+a){B&=8;R=4;}
                        else B=0;
                        if (B!=0)
                        {
                            if(L==1&&A(c,b,0)==15)r&=R;
                            if (L==0)return R;
                        }
                    }
                    if (z)
                    {
                        if (B < 9 & B > 0 & !(c==x&y==b))
                           f |= g;
                        g *= 2;
                    }
                }
        }
        return r;
    }
}

পরীক্ষার ফলাফল

1 উদাহরণ: FNSSSWNNNWSSSWSSSSNNESES

2 উদাহরণ: উপায় নেই

ভিজ্যুমেলনের উদাহরণ: এফএনএসএসএসএসএসএসডাব্লুএনএনএনএনএনএনএনএনএনএসএনএসএসএসএসএসইইইই

আমার পরীক্ষার কেস 1: FSSENEEEFWSSFNSWWN

আমার পরীক্ষার কেস 2: FSEEEESFWSSSSFNWWWNFENNFSEES

দেখা যায় যে আমার ডাক্তার চারপাশে ঘুরে বেড়াতে কত মজা লাগে তা অ্যাঞ্জেলসকে দেখানোর জন্য ডুচের মতো চারপাশে ঘুরে বেড়ানো পছন্দ করে। আমি সফ্টওয়্যারটিকে সবচেয়ে দীর্ঘতম পথটি তৈরি করতে পারি তবে এটি বেশি সময় নেয় এবং আরও কোড প্রয়োজন needs

আপনি ছেলেদের জন্য পরীক্ষার কেস

S
D....
..NE.
.WTS.
.S...

আরেকটা:

E
D....
WNNN.
...E.
.WTE.
.SSE.
.....

1
গল্ফড কোডটি এক জায়গায় একটি জায়গা হারিয়েছে যা এটি সংকলন থামিয়েছে, তবে এই ফিক্সটির সাহায্যে আমি আপনাকে বাইট গণনাটি কেবলমাত্র 1395 করে দিই! এটি এত কম পেয়ে খুব সুন্দর কাজ হচ্ছে, এটি আপনার ব্যবহারের জন্য পুরোপুরি ন্যায্য গেম using S=System.Console;, অথবা আপনি কেবল নিজের কোডে এস পুরোপুরি মুছে ফেলতে এবং 6 বাইট দ্বারা সাশ্রয় করতে পারেন using System। এখন আমাকে আমার নিখুঁত পদ্ধতির আরও কিছুটা ট্রিম করতে হবে ...;)
ভিজ্যুয়েলমেলন

1
ওহ একটি মিস স্পেস, আমি এটি যত্ন নেওয়া উচিত। এবং অবশ্যই এস = ... যখন আমি এটি শিখলাম তখন কিছুটা দূরে সরে গেল। :)
ওয়াজেজেসি

বাইট গুনতে চমৎকার কাজ;)
ভিজ্যুয়েলমেলন

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