경로 및 낭비 시간


22

전제

그래서 최근에 나는 약 30 분 일찍 약속을 잡고 밖에서 기다렸다. 나는 또한 집 앞에 움직이지 않고 서 있으면 이상하게 보일 것이라고 결정했다. 따라서 나는 제한된 지역 내에서 빨리 걸어 가기로 결정했습니다. 나는 또한 내가 서클에서 걷기 시작하면 내가 배회하고 있다는 것을 분명히 할 것이라고 결론 지었다. 그래서 저는 첫 번째 코드 골프 도전을 만들도록 영감을 받았습니다.

사양

당신도 포함 목록은 지역의지도, 주어집니다 " "또는 "#"무료 공간과 어떤 종류의 장애물을 나타냅니다. 여유 공간은 한 번만 교차 할 수 있으며 교차하는 데 1 분이 걸립니다. 초기 위치는 "@"불량한 전통으로 표시되며 대상은 "$"잃어 버릴 것이므로 로 표시 됩니다. 당신이 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치고 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치고 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 마치 방해되고있는 것처럼 보이게하지는 않습니까? 당신이 착륙 할 때"$", 정확한 분 분이되어야합니다. 따라서 카운트 다운하는 경우 인접한 타일에서 1이어야하고 타일에서 0이어야합니다. 항상 목적지에 도달 할 수 있습니다. 프로그램이나 함수는 가능한 4 가지 방향을 나타 내기 위해 <,>, ^ 및 v와 함께 최단 경로를 표시하는 목록을 반환해야합니다.

입력:

[[" ", " ", " ", " "],
 ["@", " ", " ", "$"],
 [" ", " ", " ", " "],
 [" ", " ", " ", " "]]

5

출력 :

[[">", ">", ">", "v"],
 ["^", " ", " ", "$"],
 [" ", " ", " ", " "],
 [" ", " ", " ", " "]]

입력:

[[" ", "#", " ", " ", " "],
 [" ", "#", " ", " ", " "],
 ["@", "#", " ", "$", " "],
 [" ", " ", " ", " ", " "],
 [" ", "#", " ", " ", " "],
 [" ", "#", " ", " ", " "]]

7

산출:

[[" ", "#", " ", " ", " "],
 [" ", "#", ">", "v", " "],
 ["v", "#", "^", "$", " "],
 [">", ">", "^", " ", " "],
 [" ", "#", " ", " ", " "],
 [" ", "#", " ", " ", " "]]

입력:

[[" ", "#", " ", " ", " "],
 [" ", "#", " ", " ", " "],
 ["@", "#", " ", "$", " "],
 [" ", " ", " ", " ", " "],
 [" ", "#", " ", " ", " "],
 [" ", "#", " ", " ", " "]]

17

산출:

[[" ", "#", " ", "v", "<"],
 [" ", "#", " ", "v", "^"],
 ["v", "#", " ", "$", "^"],
 [">", ">", "v", ">", "^"],
 [" ", "#", "v", "^", "<"],
 [" ", "#", ">", ">", "^"]]

규칙

  • 표준 허점 적용
  • 각 타일은 한 번만 이동해야합니다
  • 보드에서 정확한 시간을 보내야합니다
  • 여러 경로의 경우 하나의 경로 만 표시하면됩니다.
  • 이것은 코드 골프 질문이므로 가장 짧은 답변이 이깁니다.
  • 의견에서 user202729의 질문에 따라 유효한 입력을 가정 할 수 있습니다.

추가 설명이 필요한 경우 의견 추가


1
" 지정된 시간 내에 항상 목적지 도달 할 수 있습니다"는 것이 보장 됩니까?
user202729

그렇습니다. 복잡 할지라도 항상 길은있을 것입니다
LForchini

5
PPCG에 오신 것을 환영합니다! :) 좋은 첫 번째 도전.
Giuseppe

각 끝에서 30 분 동안 무슨 일이 있었습니까?! (명확하지 않으면 아무것도 변경할 필요가 없습니다)
Jonathan Allan

답변:


6

자바 스크립트 (ES6), 171 바이트

카레 구문으로 입력을 (a)(n)받습니다. 입력 행렬 을 수정 하여 출력합니다 .

a=>g=(n,y=a[F='findIndex'](r=>~(i=r[F](v=>v>'?'))),x=i,R=a[y])=>!n--|[-1,0,1,2].every(d=>(R[x]='<^>v'[d+1],(c=(a[Y=y+~-d%2]||0)[X=x+d%2])<1?g(n,Y,X):n|c!='$')&&(R[x]=' '))

온라인으로 사용해보십시오!

댓글

a =>                           // a[] = input matrix
g = (                          // g = recursive function taking:
  n,                           //   n = number of remaining moves
                               //   (x, y) = current coordinates, initialized as follows:
  y = a[F = 'findIndex'](r =>  //     y = index of the row containing the starting point,
    ~(i = r[F](v => v > '?'))  //         found by iterating over all rows r until we
  ),                           //         find some i such that r[i] > '?'
  x = i,                       //     x = index of the column of the starting point
  R = a[y]                     //   R[] = current row
) =>                           //
  !n-- |                       // decrement n; force failure if we're out of moves
  [-1, 0, 1, 2].every(d =>     // for each direction d, where -1 = left, 0 = up,
    (                          // 1 = right and 2 = down:
      R[x] = '<^>v'[d + 1], (  //   update the current cell with the direction symbol
        c = (                  //   c = content of the new cell at (X, Y) with:
          a[Y = y + ~-d % 2]   //     Y = y + dy
          || 0                 //     (use a dummy value if this row does not exist)
        )[X = x + d % 2]       //     X = x + dx
      ) < 1 ?                  //   if c is a space:
        g(n, Y, X)             //     we can go on with a recursive call
      :                        //   else:
        n | c != '$'           //     return false if n = 0 and we've reached the target
    ) &&                       //   unless the above result is falsy,
    (R[x] = ' ')               //   restore the current cell to a space
  )                            // end of every()

5

파이썬 2 , 310 256 바이트

except:0-3 바이트에 대한 @cairdcoinheringaahing
감사 -8 바이트에 대한 @Mnemonic 감사 -3 바이트에 대한 @JonathanAllan
감사
@Mnemonic 감사 대한 @JonathanAllan 감사 -5 바이트에 대한 @ovs 감사

G,L=input()
R=[]
def S(x,y,G,c,R):
 try:
	if x>-1<y<G[y][x]in' @':i=0;exec"T=[r[:]for r in G];T[y][x]='<v^>'[i];S(x+~-i/2,y+~-(i^2)/2,T,c-1,R);i+=1;"*4
	R+=[G]*(0==c<'$'==G[y][x])
 except:0
for i,y in enumerate(G):"@"in y>S(y.index("@"),i,G,L,R)
print R[0]

온라인으로 사용해보십시오!

몇 가지 설명 :

try-except좌표 xy좌표가 경계 에 있는지 확인하는 데 사용됩니다 . 에 액세스하면 예외가 발생합니다 G[y][x]. 파이썬이 너무 좋고 음수 색인이 허용되므로 확인하십시오.x>-1<y 가 추가됩니다.

T=[r[:]for r in G] 의 사본을 만드는 데 사용 G 값을하여

~-i/2~-(i^2)/2쌍을 생성하는 데 사용되는 (-1, 0), (0, 1), (0, -1), (1, 0)격자 이동하는 데 사용, (여전히 짧은 방법으로해야합니다!)

R+=[G]*(0==c<'$'==G[y][x])'$'필요한 단계 수에 도달했는지 확인 하십시오. R재귀 함수 호출에서이 결과를 얻는 데 사용됩니다.

for i,y in enumerate(G):"@"in y>S(y.index("@"),i,G,L,R)실측치 xy'@'입력 및 호출 함수 S.

print R[0] R 하나 이상의 솔루션을 포함 할 수 있으므로 먼저 출력하십시오.



1
당신은 대체하여 바이트를 저장할 수 있습니다 if G[y][x]=='$':if'$'==G[y][x]:.

1
실제로, 그 전체 조건은 R+=(G[y][x]=='$')*(c==0)*[G]다른 바이트 로 대체 될 수 있습니다 .

1
허, 내가 뭘 봤는지 모르겠어 다음 조건을 사용하여 첫 번째 조건에서 몇 바이트를 저장할 수 있습니다.if(x>-1<y)*(G[y][x]in' @'):

1
당신 y+cmp(i%2,i/2)을 위한 더 짧은 방법은 y+~-(i^2)/2; 아직도 더 짧을 수도 있습니다.
Jonathan Allan

2

파이썬 2 , 264 261 251 249 바이트

def f(a,n,r=-1,s=0):
 j=len(a[0]);x=1;z=y=0
 if r<0:s,r=divmod(sum(a,[]).index('@'),j)
 for c in'>v<^':
	u=r+x;v=s+y;x,y=-y,x
	if j>u>-1<v<len(a):b=[e[:]for e in a];b[s][r]=c;w=a[v][u];z=n*(w<'!')and f(b,n-1,u,v)or n==1and w=='$'and b
	if z:return z

온라인으로 사용해보십시오!


1
@Arnauld : 죄송합니다! 너무 멋져요. 결정된.
Chas Brown
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.