मत करो। यहाँ तक की। झपकी


50

यहाँ छवि विवरण दर्ज करें

आपका जीवन इस पर निर्भर हो सकता है। झपकी नहीं। झपकी भी मत लो। पलक और तुम मर चुके हो। वे तीव्र हैं। जितना आप विश्वास कर सकते हैं उससे भी तेज। अपनी पीठ मोड़ो मत, दूर मत देखो, और झपकी मत करो! सौभाग्य।

वेपिंग एंजल्स एक विदेशी जाति है जो किसी अन्य व्यक्ति (यहां तक ​​कि एक अन्य एंजेल) द्वारा देखे जाने पर भी हिल नहीं सकती। वे अपने पीड़ितों को समय पर वापस भेजकर भोजन कराते हैं। आप ( डॉक्टर ) कुछ के साथ एक कमरे में फंस गए हैं, और आपको अपने TARDIS में जाने की आवश्यकता है।


कार्य

एक प्रोग्राम लिखिए जो एक आयताकार कमरे के ASCII प्रतिनिधित्व को देखते हुए, एक ऐसा रास्ता तैयार करेगा जो आपको सुरक्षा की ओर ले जाएगा। यदि आपकी प्रगति के दौरान कोई भी एंजेल किसी भी समय हमला कर सकता है - तो वह रास्ता सुरक्षित नहीं है। एक एंजेल हमला कर सकता है अगर वह आपको या किसी अन्य एंजेल द्वारा नहीं देखा जा सकता है।

इनपुट

इनपुट दो भाग है। सबसे पहले, आप जिस दिशा (NSEW) का सामना कर रहे हैं। फिर सफल तर्ज पर, कमरे का एक प्रतिनिधित्व, स्टार्ट / एंड लोकेशन दिखा रहा है, और सभी एन्जिल्स का स्थान / सामना करना पड़ रहा है।

नीचे दिए गए नमूने से पता चलता है कि पश्चिम की ओर एक परी है, और आप दक्षिण की ओर मुंह करना शुरू करते हैं।

S
..........
....D.....
..........
..........
..........
..........
..........
..........
.........W
..........
...T......
  • . - खाली जगह
  • D - चिकित्सक (प्रारंभिक स्थिति)
  • T - TARDIS (अंतिम स्थिति)
  • N,S,E,W - एक एन्जिल, निर्दिष्ट दिशा का सामना करना पड़ (उत्तर, दक्षिण, पूर्व, पश्चिम)

नजर

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

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

उत्पादन

आउटपुट एक स्ट्रिंग है जो पथ से बाहर निकलने के लिए ले जाएगा। यदि कई सुरक्षित रास्ते हैं, तो किसी एक को चुनें। यदि कोई रास्ता सुरक्षित नहीं है, तो आउटपुट 0। यदि मानचित्र विकृत है, तो जो भी आपको पसंद हो, उसे दुर्घटनाग्रस्त कर दें। इसे विकृत मानें यदि कमरा आयताकार नहीं है, तो कोई निकास नहीं है, आदि यदि कोई एन्जिल्स नहीं हैं, तो यह विकृत नहीं है, बस आसान है।

प्रत्येक चरण के लिए, आप दो चीजों में से एक कर सकते हैं: एक NSEW दिशा में आगे बढ़ें, या एक NSEW दिशा की ओर मुड़ें (बिना परिवर्तन के)। स्थानांतरित करने के लिए, बस उस दिशा के लिए पत्र को आउटपुट करें। एक दिशा का सामना करने के लिए, Fउपयुक्त पत्र के बाद आउटपुट । उदाहरण के लिए, निम्न आउटपुट:

SSFESSSSSSSW

इनपुट अनुभाग में दिए गए नमूने के लिए एक सुरक्षित मार्ग है। आप परी को दृष्टि में रखने के लिए दो बार दक्षिण की ओर बढ़ते हैं, फिर परी को प्रवेश करने के लिए एक बार दक्षिण और सात बार पश्चिम की ओर बढ़ते हैं।

परीक्षण के मामलों

1) TARDIS जाने के लिए आप पूर्व की ओर जाने वाली एंजेल के आसपास जा सकते हैं। जब तक आप उनके बीच सीधे कदम नहीं रखते हैं, वे एक-दूसरे को जगह में बंद कर देते हैं, इसलिए इससे कोई फर्क नहीं पड़ता कि आप किसी भी बिंदु पर किस तरह का सामना कर रहे हैं।

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

2) आप हार गए। उन्हें अतीत में लाने का कोई तरीका नहीं है। आप एक दूसरे को तब तक देख सकते हैं जब तक आप उनके बीच कदम नहीं रखते। उस बिंदु पर, आप उन दोनों का सामना नहीं कर सकते और आप कर रहे हैं। के रूप में अच्छी तरह से बस अपनी आँखें बंद करो और इसे खत्म हो सकता है।

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

जीतना

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

डॉक्टर कौन से चित्र और उद्धरण।


क्या हम एक ग्राफ़ के माध्यम से रास्ता खोजने के लिए पुस्तकालय का उपयोग कर सकते हैं?
शुक्राणु

@ शेपर हां, लेकिन लाइब्रेरी को लोड / शामिल करने के लिए आवश्यक कुछ भी बाइट की गिनती में जोड़ा जाना चाहिए।
जॉय

2
स्पष्ट रूप से एक भंवर मैनिपुलेटर का उपयोग करें!
TheDoctor

4
@ डॉक्टर जैक उसे अपने साथ ले गया, और आप देख सकते हैं कि वह किसी भी नक्शे पर नहीं है ( J)।
Geobits

1
@ टिम्मी किसी भी मानक परिभाषा का उपयोग किया जा सकता है।
जियोबिट्स 14

जवाबों:


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"

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

मैं शायद ऋषि की जटिल संख्या अंकगणित का उपयोग करके कुछ वर्णों को सुरक्षित कर सकता था, लेकिन यह बहुत लंबा चलेगा।

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

यहाँ एक ज्यादातर अन-गोल्ड संस्करण है:

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

VisualMelon का परीक्षण मामला:

SSFWSSSSSFSWWSSWWWFWEEEEFSEFWEFSE

1
मैंने आपके कोड का परीक्षण नहीं किया है, लेकिन ऐसा प्रतीत होता है कि आपने परीक्षण मामले 1 के लिए आउटपुट को दो बार चिपकाया है! इसके अलावा, मुझे यह देखने में दिलचस्पी होगी कि यदि आप इसे प्रस्तावित परीक्षण के मामले में खिलाते हैं तो आपका कार्यक्रम क्या होगा।
विजुअलमेल

@VisualMelon: स्पॉटिंग के लिए धन्यवाद और मैंने परीक्षण मामले को एकीकृत किया।
Wrzlprmft

10

C # 1771 2034 1962 1887 1347bytes

1 लूप में ब्लॉकिंग LOS चेकिंग को फिर से लिखा, जिससे यह ज्यादा साफ हो गया और लगभग 450bytes छोटा हो गया

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);}}

यह एक संपूर्ण कार्यक्रम है जो इनपुट को ईओएफ के साथ समाप्त करने और एसटीडीआईएन से पारित होने की उम्मीद करता है। यह (उम्मीद है कि) TARDIS के लिए सबसे छोटा रास्ता है, या "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

वोज़ज़ेक का टेस्ट केस 1:

EEEEFWSSSFNWWN

वोज़ज़ेक का टेस्ट केस 2:

FSEEEESFWSSSSWFNWWWNFENNEES

मैंने X = System.Console संभावना का उपयोग करते हुए पूरी तरह से याद किया है। उस के लिए धन्यवाद :)
वोज़ज़ेक


मेरा मानना ​​है कि डॉक्टर पर आपके परीक्षण मामले के साथ स्टार्टअप पर हमला किया गया है: एस
वोज़ज़ेक

@WozzeC दक्षिण-पूर्व में पश्चिम दूत उत्तर-पश्चिम में पूर्व स्वर्गदूत को देख सकता है, इसलिए डॉक्टर बच सकते हैं, लेकिन उस बिंदु पर, यह प्रतीत होता है कि मेरे समाधान पर ध्यान नहीं दिया जाता है यदि डॉक्टर को स्टार्टअप पर हमला किया जाता है। इस कोड का परीक्षण करना इतना कठिन क्यों है!
विजुअलमेल

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;}}

सही। इसलिए मैंने इसे एक रास्ता देने का फैसला किया, और लड़के को थोड़ी देर लगी। यह ज्यादातर तार्किक ऑपरेटरों का उपयोग करके बनाया गया है।

  • उत्तर = 1 = एन
  • दक्षिण = 2 = एस
  • पूर्व = ४ = ई
  • पश्चिम = 8 = डब्ल्यू
  • डॉक्टर = 6 = डी
  • तारदिस = ५ = टी
  • 15 =। <-सभी खाली स्थान

नल आदि की जांच करने से बचने के लिए मैंने [MAX_SIZE * 3] * [MAX_SIZE] * 3 के एक क्षेत्र का उपयोग करने का निर्णय लिया और गेम बोर्ड को केंद्र के करीब रख दिया।

लूप की जांच 50 (MAX_SIZE) के अंदर और बाहर की जाती है। तो कुछ इस तरह:

22222
21112
21D12
21112
22222

जब एक ईडब्ल्यूएस या एन पाया जाता है तो मैं उनकी ओर से एक ही जांच करता हूं। अगर कुछ भी एन्जिल्स (डॉक्टर नहीं) को देख पाया जाता है, तो वे 15 को मुफ्त पास के रूप में वापस कर देते हैं। अगर उन पर ध्यान नहीं दिया जाता है तो वे डॉक्टर के सुरक्षित होने के लिए किस रास्ते से लौटते हैं। यानी एन दक्षिण में 2 वापसी करेगा। जब तक यह NW या NE नहीं होता है तो यह किस स्थिति में क्रमशः 6 (2 + 4) और 10 (2 + 8) होगा।

यदि दो देवदूत डॉक्टर को देख रहे हैं तो इनमें से रिटर्न मान "एंडेड" होगा, इसलिए परीक्षण उदाहरण में 2 क्रंचपॉशन 4 और 8 में बदल जाएंगे। 0 मतलब है कि स्थिति खराब है और इससे बचा जाना चाहिए।

विस्तारित कोड:

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 उदाहरण: FNSSSWNNNWSSSWSSSSENNESES

2 उदाहरण: कोई रास्ता नहीं

विजुअलमेल उदाहरण: FNSSSSSSSWNNNNNNNWWSSSSSSSEEEE

मेरा टेस्ट केस 1: FSSENEEEFWSSFNSWWN

मेरा टेस्ट Case2: FSEEEESFWSSSSFNWWWWNFENNFSEES

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

आप लोगों के लिए टेस्ट केस

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

और एक:

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

1
गोल्फ कोड एक जगह पर एक जगह याद कर रहा है जो इसे संकलित करने से रोकता है, लेकिन उस फिक्स के साथ मैं आपको केवल 1395 तक बाइट गिनता हूं! अच्छा काम यह इतना कम हो रहा है, और यह आप का उपयोग करने के लिए पूरी तरह से उचित खेल है using S=System.Console;, या आप बस अपने कोड में पूरी तरह से एस हटा सकते हैं और 6 बाइट्स बचा सकते हैं using System। अब मुझे कोशिश करनी होगी और अपने भोले दृष्टिकोण को कुछ और नीचे ट्रिम करना होगा ...)
विजुअलमेल

1
ओह, एक गलत जगह है, मुझे इसका ध्यान रखना चाहिए। और निश्चित रूप से एस = ... थोड़ा दूर चला गया जब मैंने सीखा कि। :)
वोज़्केज़ १५'१४

बाईट काउंट डाउन हो रहा है अच्छा काम;)
विज़ुअलमेल

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