Đường dẫn & thời gian lãng phí


22

Tiền đề

Vì vậy, gần đây tôi đến sớm khoảng nửa tiếng cho một cuộc hẹn, và quyết định chờ đợi bên ngoài. Tôi cũng xác định rằng nó sẽ trông thật kỳ lạ nếu tôi chỉ đứng bất động trước nhà. Do đó, tôi quyết định đi bộ nhanh, trong một khu vực hạn chế. Tôi cũng kết luận rằng nếu tôi bắt đầu đi theo vòng tròn sẽ thấy rõ rằng tôi đang lảng vảng. Vì vậy, tôi đã được truyền cảm hứng để tạo ra thử thách Code Golf đầu tiên của mình.

Đặc điểm kỹ thuật

Bạn sẽ được cung cấp một danh sách, bản đồ của khu vực, trong đó sẽ chứa một " "hoặc "#", đại diện cho không gian trống và chướng ngại vật nào đó. Không gian trống chỉ có thể được vượt qua một lần và phải mất 1 phút để vượt qua nó. Vị trí ban đầu của bạn sẽ được biểu thị "@"theo truyền thống theo roguelike và mục tiêu sẽ được thể hiện bằng một "$"vì đó là những gì bạn sẽ mất ở đó. Bạn cũng sẽ được cung cấp một số nguyên biểu thị số phút bạn phải lãng phí trước khi không có vẻ như bạn đang xâm nhập. Khi bạn hạ cánh trên"$", nó sẽ phải có số phút chính xác (vì vậy nếu bạn đang đếm ngược, nó sẽ phải là 1 trên một ô liền kề và là 0 trên ô đó). Nó sẽ luôn luôn có thể đến đích. Chương trình hoặc chức năng của bạn sẽ phải trả về một danh sách hiển thị đường dẫn ngắn nhất với <,>, ^ và v để thể hiện bốn hướng có thể.

Ví dụ

Đầu vào:

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

5

Ouput:

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

Đầu vào:

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

7

Đầu ra:

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

Đầu vào:

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

17

Đầu ra:

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

Quy tắc

  • Áp dụng sơ hở tiêu chuẩn
  • Mỗi ô chỉ phải được di chuyển qua một lần
  • Số lượng thời gian chính xác phải được dành cho hội đồng quản trị
  • Chỉ một đường dẫn cần được hiển thị trong trường hợp có nhiều đường dẫn
  • Đây là một câu hỏi golf mã để câu trả lời ngắn nhất chiến thắng
  • Theo câu hỏi của người dùng202729 trong các bình luận, bạn có thể giả sử đầu vào hợp lệ.

Thêm một bình luận nếu cần làm rõ thêm


1
Có đảm bảo rằng "Sẽ luôn có thể đến đích trong thời gian quy định " không?
dùng202729

Vâng, nó sẽ, sẽ luôn có một cách, ngay cả khi bị
chia rẽ

5
Chào mừng đến với PPCG! :) Thử thách đầu tiên tốt đẹp.
Giuseppe

Điều gì đã xảy ra với nửa phút ở mỗi đầu?! (không cần thay đổi bất cứ điều gì nếu nó không rõ ràng)
Jonathan Allan

Câu trả lời:


6

JavaScript (ES6), 171 byte

Đưa đầu vào theo cú pháp currying (a)(n). Đầu ra bằng cách sửa đổi ma trận đầu vào.

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]=' '))

Hãy thử trực tuyến!

Đã bình luận

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

Python 2 , 310 256 byte

Cảm ơn @cairdcoinheringaahing cho except:0-3 byte
Cảm ơn @Mnemonic cho -8 byte
Cảm
ơn @Jonathan ALLan cho -3 byte Cảm ơn @ovs cho -5 byte

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]

Hãy thử trực tuyến!

Một số giải thích:

try-exceptđược sử dụng để đảm bảo rằng cả hai xytọa độ nằm trong ranh giới. Ngoại lệ sẽ được nâng lên khi truy cập vào G[y][x]. Python là quá tốt và chỉ số tiêu cực được chấp nhận, vì vậy kiểm tra x>-1<yđược thêm vào.

T=[r[:]for r in G]được sử dụng để tạo bản sao của Gcác giá trị

~-i/2~-(i^2)/2được sử dụng để tạo các cặp (-1, 0), (0, 1), (0, -1), (1, 0), được sử dụng để di chuyển trong lưới (vẫn nên có cách ngắn hơn!)

R+=[G]*(0==c<'$'==G[y][x])kiểm tra, đó '$'là đạt được trong số bước cần thiết. Rđược sử dụng để có được kết quả này từ các lệnh gọi hàm đệ quy.

for i,y in enumerate(G):"@"in y>S(y.index("@"),i,G,L,R)Tìm thấy xycác '@'chức năng đầu vào và gọi S.

print R[0] R có thể chứa nhiều hơn một giải pháp, vì vậy đầu ra chỉ là đầu tiên



1
Bạn có thể lưu một byte bằng cách thay thế if G[y][x]=='$':bằng if'$'==G[y][x]:.

1
Trên thực tế, toàn bộ điều kiện có thể được thay thế bằng R+=(G[y][x]=='$')*(c==0)*[G]một byte khác.

1
Huh, không chắc chắn những gì tôi đã nhìn thấy. Bạn có thể lưu một vài byte trong điều kiện đầu tiên vớiif(x>-1<y)*(G[y][x]in' @'):

1
Một cách ngắn hơn cho bạn y+cmp(i%2,i/2)sẽ là y+~-(i^2)/2; có thể vẫn còn ngắn hơn
Jonathan Allan

2

Python 2 , 264 261 251 249 byte

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

Hãy thử trực tuyến!


1
@Arnauld: Rất tiếc! Có một chút quá ưa thích. Đã sửa.
Chas Brown
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.