सही रास्ता खोजें


13

पथों की सूची को देखते हुए, सही पथ का उत्पादन करें।

पथ का उदाहरण:

    /\
----+/
    |
  • -और |क्षैतिज और ऊर्ध्वाधर मार्ग हैं।
  • /और \90 ° मोड़ हैं।
  • +वर्तमान दिशा के आधार पर -या के रूप में व्यवहार किया जाता है |

पथ किसी भी दिशा में जा सकते हैं और एक चरित्र का उपयोग कई पथों में किया जा सकता है।

इनपुट इस तरह होगा:

       /--\
A------+--+--#
B------/  \--:
C------------#
D------------#
  • A, B, Cऔर Dपथ शुरू होता हैं
  • # एक दीवार है (रास्ता खराब है)
  • : अंत है (रास्ता सही है)

तो यहाँ उत्पादन होगा B

आप मान सकते हैं:

  • :और #हमेशा बाईं ओर से पहुंचा जा सकेगा।
  • एक पथ की शुरुआत के दाईं ओर का चरित्र हमेशा रहेगा -
  • रास्ते हमेशा अच्छी तरह से बनेंगे।
  • #और :हमेशा एक ही कॉलम में रहेंगे।
  • हमेशा केवल एक :और 4 रास्ते होंगे।

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

A------#
B------#
C------#
D------:
=>
D
A-\ /---:
B-+-/ /-#
C-+---+-#
D-+---/
  \-----#
=>
B
  /-\
A-+\\---#
B-/\-\/-#
C----++-#
D----+/
     \--:
=>
A
A-\
B-+\
C-++\/----#
D-+++//---:
  \++-//--#
   \+--//-#
    \---/
=>
A
  /-\
A-+-/-\
B-+-+-\--#
C-+-/ |/-#
D-\---++-#
  \---+/
      \--:
=>
B

चूंकि यह , सबसे छोटी उत्तर जीत है।


क्या कभी एक ही रास्ते पर दो रास्ते की घटना होगी /या \?
मार्टिन एंडर

@MartinEnder हां
TuxCrafting

ओह, यह आखिरी टेस्ट केस में है। स्पष्ट रूप से उल्लेख के लायक हो सकता है।
मार्टिन एंडर

क्या :हमेशा बाईं ओर से पहुंचा जा सकता है या इसे ऊपर या नीचे से भी पहुँचा जा सकता है? दूसरे शब्दों में, अंतिम कॉलम में इसके अलावा #या अन्य वर्ण हो सकते हैं :?
मार्टिन एंडर

1
कृपया जवाब दें?
रोहन झुनझुनवाला

जवाबों:


14

स्लिप , 47 बाइट्स

`a(?,[`-+]*((`/<|`\>)[`|+]*(`/>|`\<)[`-+]*)*`:)

इसका परीक्षण यहां करें।

अनिर्दिष्ट सुविधाओं के लिए याय ...

व्याख्या

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

के रूप में regex के लिए, दुर्भाग्य से, वहाँ कुछ दोहराव है \और क्योंकि /हम क्षैतिज या लंबवत रूप से आगे बढ़ रहे हैं, इस आधार पर अलग तरह से इलाज करने की आवश्यकता है। दूसरी तरफ, जब से हम जानते हैं कि मार्ग क्षैतिज रूप से शुरू और समाप्त होता है, हम जानते हैं कि हर मार्ग में \या तो एक समान संख्या है /, ताकि हम एक समय में उनमें से दो का मिलान कर सकें।

`a             # Match a letter.
(?,            # Match but don't include in output...
  [`-+]*       #   Match a horizontal piece of path, consisting of - or +.
  (            #   Match 0 or more vertical segments...
    (`/<|`\>)  #     Match a / and turn left, or a \ and turn right.
    [`|+]*     #     Match a vertical piece of path, consisting of | or +.
    (`/>|`\<)  #     Match a / and turn right, or a \ and turn left.
    [`-+]*     #     Match a horizontal piece of path, consisting of - or +.
  )*
  `:           #   Match a : to ensure that this is the correct path.
)

9
खुश कोड के लिए +1:)
betseg

6

पायथन, 221 बाइट्स

def P(s,c=""):
 l=s.split("\n")
 v=[0,-1]
 p=[(i,l[i].index(":"))for i in range(len(l))if":"in l[i]][0]
 while c in"-:|+/\\":
    p=map(sum,zip(p,v))
    c=l[p[0]][p[1]]
    v=v[::1-(c=="\\")*2]
    if"/"==c:v=[-v[1],-v[0]]
 return c

पहला इंडिकेशन सिर्फ एक जगह है, जबकि लूप में यह एक टैब है।


2

जावास्क्रिप्ट (ईएस 6), 117 104 बाइट्स

p=>(r=d=>(c="\\/ABCD".indexOf(p[x+=[-1,-w,w,1][d]])+1)>2?p[x]:r(d^c))(0,w=p.indexOf`
`+1,x=p.indexOf`:`)

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

let f =
p=>(r=d=>(c="\\/ABCD".indexOf(p[x+=[-1,-w,w,1][d]])+1)>2?p[x]:r(d^c))(0,w=p.indexOf`
`+1,x=p.indexOf`:`)

var p0 = 'A------#\nB------#\nC------#\nD------:',
    p1 = 'A-\\ /---:\nB-+-/ /-#\nC-+---+-#\nD-+---/  \n  \\-----#',
    p2 = '  /-\\    \nA-+\\\\---#\nB-/\\-\\/-#\nC----++-#\nD----+/  \n     \\--:',
    p3 = 'A-\\        \nB-+\\       \nC-++\\/----#\nD-+++//---:\n  \\++-//--#\n   \\+--//-#\n    \\---/  ',
    p4 = '  /-\\     \nA-+-/-\\   \nB-+-+-\\--#\nC-+-/ |/-#\nD-\\---++-#\n  \\---+/  \n      \\--:';

console.log(p0, '=>', f(p0));
console.log(p1, '=>', f(p1));
console.log(p2, '=>', f(p2));
console.log(p3, '=>', f(p3));
console.log(p4, '=>', f(p4));


1

रूबी, 140 बाइट्स

->s{(?A..?D).find{|l,c|x=h=1
v=0
y=s[/.*#{l}/m].count$/
(v,h=c==?/?[-h,-v]:c==?\\?[h,v]:[v,h]
y+=v
x+=h)until(c=s.lines[y][x])=~/(:)|#/
$1}}

इसे repl.it पर आज़माएं: https://repl.it/CyJv

Ungolfed

->s{
  (?A..?D).find {|l,c|
    x = h = 1
    v = 0
    y = s[/.*#{l}/m].count $/

    ( v, h = c == ?/ ? [-h,-v] : c == ?\\ ? [h,v] : [v,h]
      y += v
      x += h
    ) until (c = s.lines[y][x]) =~ /(:)|#/

    $1
  }
}

0

पर्ल 211 बाइट्स

sub f{for($s=-1;++$s<~~@_;){if($_[$s][0]ne' '){$r=$s;$c=$m=0;$n=1;while($_[$r][$c]ne'#'){if($_[$r][$c]eq':'){return$_[$s][0];}($m,$n)=$_[$r][$c]eq'/'?(-$n,-$m):$_[$r][$c]eq'\\'?($n,$m):($m,$n);$r+=$m;$c+=$n;}}}}

Ungolfed:

sub q{
    for($start = -1; ++$start <~~@_;) {
        if($_[$start][0] ne ' ') {
            $row = $start;
            $col = $rowMove = 0;
            $colMove = 1;
            while($_[$row][$col] ne '#') {
                if($_[$row][$col] eq ':') {
                    return $_[$start][0];
                }
                ($rowMove, $colMove) =  $_[$row][$col] eq '/' ? (-$colMove,-$rowMove) : 
                                        $_[$row][$col] eq '\\' ? ($colMove,$rowMove) : 
                                        ($rowMove, $colMove);
                $row += $rowMove;
                $col += $colMove;
            }
        }
    }
}

यह मेरा पहला पर्ल गोल्फ है, इसलिए सुझावों का स्वागत है :)

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