找到正确的道路


13

给定路径列表,输出正确的路径。

路径示例:

    /\
----+/
    |
  • -并且|是水平和垂直路径。
  • /\转90°。
  • +根据当前方向被视为a -或a |

路径可以沿任何方向前进,并且可以在多个路径中使用一个字符。

输入将如下所示:

       /--\
A------+--+--#
B------/  \--:
C------------#
D------------#
  • ABCD是路径开始
  • # 是一堵墙(路径不好)
  • : 是终点(路径正确)

因此,这里的输出将是B

您可以假设:

  • :并且#总是从左边到达。
  • 路径开头右侧的字符将始终为-
  • 路径将永远形成良好。
  • #并且:将始终位于同一列中。
  • 始终只有一个:和四个路径。

测试用例

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

哦,这是最后一个测试用例。可能值得一提。
马丁·恩德

:始终从左侧到达,还是从顶部或底部到达?换句话说莫不是比其他字符#:最后一列?
马丁·恩德

1
SILOS回答吗?
Rohan Jhunjhunwala

Answers:


14

单据,47字节

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

在这里测试。

是的,未公开的功能...

说明

Slip基本上是二维正则表达式语法,默认情况下,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

Python,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

使用Javascript(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

Ruby,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

Perl 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高尔夫,欢迎提出建议:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.