올바른 길 찾기


13

경로 목록이 제공되면 올바른 경로를 출력하십시오.

경로의 예 :

    /\
----+/
    |
  • -|수평 및 수직 경로이다.
  • /\90 ° 회전이다.
  • +현재 방향에 따라 -또는 로 취급됩니다 |.

경로는 어느 방향으로나 갈 수 있으며 문자는 여러 경로에 사용될 수 있습니다.

입력은 다음과 같습니다 :

       /--\
A------+--+--#
B------/  \--:
C------------#
D------------#
  • A, B, CD경로의 시작입니다
  • # 벽이다 (경로가 나쁘다)
  • : 끝입니다 (경로가 정확합니다)

따라서 출력은입니다 B.

당신은 가정 할 수 있습니다 :

  • :그리고 #항상 왼쪽에서 도달 할 것입니다.
  • 경로 시작 오른쪽의 문자는 항상입니다 -.
  • 경로는 항상 잘 형성됩니다.
  • #그리고 :항상 같은 칼럼에있을 것입니다.
  • 항상 1 개와 :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

이것이 이므로 가장 짧은 답변이 이깁니다.


거기에 지금까지 같은 두 경로 입사 것인가 /또는 \?
Martin Ender

@MartinEnder 예
TuxCrafting

아, 그것은 마지막 테스트 케이스에 있습니다. 명시 적으로 언급 할 가치가있을 수 있습니다.
Martin Ender

의지 :항상 왼쪽에서 도달되거나 상단 또는 하단뿐만 아니라에서 도달 할 수 있을까? 즉 이외의 문자가있을 수 #또는 :마지막 열의를?
Martin Ender

1
실로 스가 대답하십시오?
Rohan Jhunjhunwala

답변:


14

슬립 , 47 바이트

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

여기에서 테스트하십시오.

문서화되지 않은 기능에 대한 예 ...

설명

Slip은 기본적으로 2 차원 정규식 구문이며 Slip 프로그램은 기본적으로 일치하는 입력의 하위 집합을 인쇄합니다. 이 경우 단순히 유효한 경로와 일치합니다. 전체 경로를 인쇄하지 못하도록 문서화되지 않은 (?,...)그룹을 사용하여 내부에서 일치하는 문자를 출력에서 ​​생략해야 함을 나타냅니다.

때문에 정규식에 관해서는, 불행하게도, 일부 중복이있다 \/필요는 우리가 수평 또는 수직으로 이동하고 있는지에 따라 다르게 처리 될 수 있습니다. 장점은 경로가 수평으로 시작하고 끝나는 것을 알기 때문에 짝수 \또는 /모든 경로가 있으므로 한 번에 두 개를 일치시킬 수 있다는 것입니다.

`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

첫 번째 들여 쓰기는 하나의 공백이며 while 루프에서는 탭입니다.


2

자바 (ES6) 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

언 골프

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

언 골프 드 :

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

이것은 나의 첫번째 Perl 골프이다. 그래서 제안은 환영 받다 :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.