경로 목록이 제공되면 올바른 경로를 출력하십시오.
경로의 예 :
/\
----+/
|
-
및|
수평 및 수직 경로이다./
및\
90 ° 회전이다.+
현재 방향에 따라-
또는 로 취급됩니다|
.
경로는 어느 방향으로나 갈 수 있으며 문자는 여러 경로에 사용될 수 있습니다.
입력은 다음과 같습니다 :
/--\
A------+--+--#
B------/ \--:
C------------#
D------------#
A
,B
,C
및D
경로의 시작입니다#
벽이다 (경로가 나쁘다):
끝입니다 (경로가 정확합니다)
따라서 출력은입니다 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
이것이 code-golf 이므로 가장 짧은 답변이 이깁니다.
답변
슬립 , 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.
)
답변
파이썬, 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 루프에서는 탭입니다.
답변
자바 (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));
답변
루비, 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
}
}
답변
펄 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 골프이다. 그래서 제안은 환영 받다 🙂