이 도전은 그리드에서 발생합니다.
+----------+
| |
| |
| |
| |
| |
| |
| |
| |
| |
+----------+
이것은 10 x 10이지만 직사각형 일 수 있습니다.
이 그리드에는 네 가지 방향이 있습니다. 위, 아래, 왼쪽 및 오른쪽.
작업은 대문자 방향으로 시작하여 경로를 그리는 것입니다. 이 예에서는 U에서 바로 위로 이동합니다.
+----------+
| |
| |
| |
| |
| |
| |
| |
| |
| U |
+----------+
경로는 위쪽으로 올라가 벽에 닿을 때까지 별표 (*)로 끝나는 마침표 문자 (.)로 구성됩니다.
+----------+
| * |
| . |
| . |
| . |
| . |
| . |
| . |
| . |
| U |
+----------+
경로 시작 외에도 소문자 방향 이니셜로 표시되는 방향 전환기가 있습니다.
+----------+
| |
| |
| |
| r.....*|
| . |
| . |
| . |
| . |
| U |
+----------+
또한, 대문자 X는 경로를 종료시키는 장애물을 우리에게 제공한다.
+----------+
| |
| |
| |
| |
| r...*X |
| . |
| . |
| . |
| U |
+----------+
규칙
- 입력은 경로 시작, 방향 전환기 및 장애물을 나타내는 문자를 포함하는 프레임 (|,-및 + 문자로 구성됨)으로 구성된 문자열입니다.
- 코드는 시작 및 방향 변경자가 설명하는 경로와 경로가 벽 또는 장애물을 만나는 경우 별표를 따라 가기 위해 완전 정지 문자를 추가해야합니다.
- 여러 경로가 시작될 수 있습니다.
- 경로가 루프를 설명하는 경우 코드는 여전히 오류없이 종료됩니다.
- 경로가 경로 시작과 만나면 방향 전환기 역할을합니다.
- 코드 골프, 저 바이트 코드 및 표준 허점이 아닙니다.
- 나는 항상 온라인 통역사와의 링크를 선호합니다.
테스트 사례
1 : 단순
+----------+
| |
| |
| |
| |
| |
| |
| |
| |
| U |
+----------+
+----------+
| * |
| . |
| . |
| . |
| . |
| . |
| . |
| . |
| U |
+----------+
2 : 우회전
+----------+
| |
| |
| |
| r |
| |
| |
| |
| |
| U |
+----------+
+----------+
| |
| |
| |
| r.....*|
| . |
| . |
| . |
| . |
| U |
+----------+
3 : 교차로
+----------+
| |
| |
| |
| r d |
| |
| u l |
| |
| |
| U |
+----------+
+----------+
| * |
| . |
| . |
| . r..d |
| . . . |
| u....l |
| . |
| . |
| U |
+----------+
4 : 4 교차로
+----------+
| D |
| |
| |
|R |
| |
| L|
| |
| |
| U |
+----------+
+----------+
| * D |
| . . |
| . . |
|R........*|
| . . |
|*........L|
| . . |
| . . |
| U * |
+----------+
5 : 첫 번째 루프
+----------+
| |
| |
| |
| r d |
| |
| u l |
| |
| |
| U |
+----------+
+----------+
| |
| |
| |
| r..d |
| . . |
| u..l |
| . |
| . |
| U |
+----------+
6 : 교환기로서의 스타터
+----------+
| |
| |
| |
| L |
| |
| |
| |
| |
| U |
+----------+
+----------+
| |
| |
| |
|*..L |
| . |
| . |
| . |
| . |
| U |
+----------+
7 : 스트레이트 루프
+----------+
| |
| |
| |
| |
| r l |
| |
| |
| |
| U |
+----------+
+----------+
| |
| |
| |
| |
| r..l |
| . |
| . |
| . |
| U |
+----------+
8 : 꽉 매듭
+----------+
| |
| |
| |
| d l |
| r u |
| r u |
| |
| |
| U |
+----------+
+----------+
| * |
| . |
| . |
| d..l |
| .r.u |
| r.u |
| . |
| . |
| U |
+----------+
9 : 장애물
+----------+
| |
| |
| |
| |
| r X |
| |
| |
| |
| U |
+----------+
+----------+
| |
| |
| |
| |
| r...*X |
| . |
| . |
| . |
| U |
+----------+
10 : S 모양
+----------+
|r d |
| |
| XXXXXXXX|
| d l |
|ul |
|XXXXXXX |
| |
|R u |
| |
+----------+
+----------+
|r.....d |
|. * |
|. XXXXXXXX|
|.d......l |
|ul . |
|XXXXXXX . |
| . |
|R.......u |
| |
+----------+
11 : 4 방향 매듭
+----------+
| D |
| |
| r |
|R d |
| |
| u L|
| l |
| |
| U |
+----------+
+----------+
| * D |
| . . |
| r.....*|
|R....d. |
| .... |
| .u....L|
|*.....l |
| . . |
| U * |
+----------+
12 : 바쁜 정션
+----------+
|rrrrr rrrd|
| rlrl |
|ul rrd |
|ruX X |
|udl ll |
|ull |
|rlr |
|rdr d |
|Uruull |
+----------+
+----------+
|rrrrr.rrrd|
|.rlrl .|
|ul rrd .|
|ruX.X. .|
|udl.ll .|
|ull. .|
|rlr. .|
|rdr..d .|
|Uruull *|
+----------+
13 : 가장자리로 시작
+----------+
| U |
| |
| |
| |
| |
| |
| |
| |
| |
+----------+
+----------+
| U |
| |
| |
| |
| |
| |
| |
| |
| |
+----------+
14 : 죽은 길을 건너다
+----------+
| |
| |
| |
| R |
| |
| |
| |
| |
| U|
+----------+
+----------+
| *|
| .|
| .|
| R..*|
| .|
| .|
| .|
| .|
| U|
+----------+
답변
자바 스크립트 (ES6), 191 (183) 181 바이트
버그 수정에 도움을 주신 @tsh에게 감사합니다.
문자 행렬로 입력을받습니다. 입력을 수정하여 출력합니다.
f=(a,X,Y,d,n=0)=>a.map((r,y)=>r.map((v,x)=>(a+0)[i=' .*dlurDLUR'.indexOf(v),n]?X?X-x+~-d%2|Y-y+(d-2)%2?0:~i?f(a,x,y,i>2?i&3:d,n+1,r[x]=i?v:'.'):n?a[Y][X]='*':0:i>6&&f(a,x,y,i&3):0))
댓글
f = ( a, // a[] = input matrix
X, Y, // X, Y = coordinates of the previous cell
d, // d = current direction (0 .. 3)
n = 0 // n = number of iterations for the current path
) => //
a.map((r, y) => // for each row r[] a position y in a[]:
r.map((v, x) => // for each character v at position x in r[]:
(a + 0)[ //
i = ' .*dlurDLUR' // i = index of the character
.indexOf(v), // blocking characters '-', '|' and 'X' gives -1
n // by testing (a + 0)[n], we allow each cell to be
] // visited twice (once horizontally, once vertically)
? // if it is set:
X ? // if this is not the 1st iteration:
X - x + ~-d % 2 | // if x - X is not equal to dx[d]
Y - y + (d - 2) % 2 ? // or y - Y is not equal to dy[d]:
0 // ignore this cell
: // else:
~i ? // if this is not a blocking character:
f( // do a recursive call:
a, // pass a[] unchanged
x, y, // pass the coordinates of this cell
i > 2 ? i & 3 : d, // update d if v is a direction char.
n + 1, // increment n
r[x] = i ? v : '.' // if v is a space, set r[x] to '.'
) // end of recursive call
: // else (this is a blocking character):
n ? // if this is not the 1st iteration:
a[Y][X] = '*' // set the previous cell to '*'
: // else:
0 // do nothing
: // else (1st iteration):
i > 6 && // if v is a capital letter:
f(a, x, y, i & 3) // do a recursive call with this direction
: // else ((a + 0)[n] is not set):
0 // we must be in an infinite loop: abort
) // end of inner map()
) // end of outer map()
답변
파이썬 2 , 283 279 293 288 279 바이트
e=enumerate
def f(M):
s=[(x,y,c)for y,l in e(M)for x,c in e(l)if'A'<c<'X'];v=set(s)
for x,y,C in s:
d=ord(C)%87%5;q=d>1;X,Y=x-d+q*3,y+~-d-q;c=M[Y][X];N=(X,Y,[C,c]['a'<c<'x'])
if'!'>c:M[Y][X]='.'
if(c in'-|X')*('/'>M[y][x]):M[y][x]='*'
if(c in'udlr. *')>({N}<v):v|={N};s+=N,
목록의 목록을 가져옵니다.
입력 배열을 수정하여 출력합니다.
답변
펄 5 203 188 166 바이트
$l='\K[ a-z](?=';$t='([-|X])?';$s=$_;/
/;$n='.'x"@-";{$_|=s/(?|R[.*]*$l$t)|$t${l}[.*]*L)|D$n(?:[.*]$n)*$l$n$t)|$t$n$l$n([.*]$n)*U))/$&eq$"?$1?'*':'.':uc$&/es?redo:$s}
작동 원리
$s=$_
입력을 저장$s
하여 소문자 체인저를 복원합니다.$_|=$s
비트 또는 공간이 있기 때문에변경되지 않습니다
.
및*
소문자 문자는urld
비트 또는 조작으로 복원됩니다./\n/;$n='.'x"@-"
“너비”를 얻고$n
모든 문자 “너비”시간과 일치$l='\K[ a-z](?=';$t='([-|X])?'
정규식 길이를 줄이기 위해;$l
소문자urld
또는 경로의 공백$t
을 일치시키고 종결자를 일치시킵니다.
교체 후 :
(?|
R[.*]*\K[ a-z](?=([-|X])?)
|
([-|X])?\K[ a-z](?=[.*]*L)
|
D$n(?:[.*]$n)*\K[ a-z](?=$n([-|X])?)
|
([-|X])?$n\K[ a-z](?=$n([.*]$n)*U)
)
- (inside )가 개행 문자와도 일치 하도록
/e
eval로 전환/s
.
$n
$&eq$"?$1?'*':'.':uc$&
matched가 공백이면, termiator가 일치하면*
그렇지.
않으면 대문자입니다.
답변
깨끗 하고 409 바이트
import StdEnv,Data.List
q=flatlines
$m=foldl(zipWith\a b|a=='*'||b=='*'='*'=max a b)(q m)[q(foldl(\m(_,y,x)=[[if(b<>x||a<>y)if(k=='*')'.'k'*'\\k<-r&b<-[0..]]\\r<-m&a<-[0..]])m(last(takeWhile(not o hasDup)(inits(f 0y 0x)))))\\l<-m&y<-[0..],c<-l&x<-[0..]|isUpper c]
where f a y b x=let(u,v)=(a+y,b+x)in(case toLower((m!!u)!!v)of' '=[((a,b),u,v):f a u b v];'r'=f 0u 1v;'l'=f 0u -1v;'u'=f -1u 0v;'d'=f 1u 0v;_=[])
답변
파이썬 2 , 250 바이트
def f(G,e=enumerate):
for i,k in e(G):
for j,l in e(k):
v=X=x=y=m,=l,
while(m in'-X|')<(l in'DLRU')>(X in v):v+=X,;y,x=zip((1,0,0,-1,y),(0,-1,1,0,x))['DLRU dlru'.find(m)%5];G[i][j]=(m,'.*'[G[i+y][j+x]in'-X|'])[m<'!'];i+=y;j+=x;X=x,i,j;m=G[i][j]
OP에서 명시 적으로 허용하는대로 1 문자열 목록을 가져옵니다.
목록을 변경합니다.