Một con rùa tìm thấy một cổng thông tin


30

Con rùa muốn di chuyển dọc theo lưới để lấy thức ăn của mình. Anh ta muốn biết anh ta sẽ mất bao nhiêu di chuyển để đến đó.

Cũng vì anh ta chậm, anh ta có các thiết bị dịch chuyển tức thời được thiết lập xung quanh miền mà anh ta sẽ sử dụng nếu nó rút ngắn con đường của anh ta. Hoặc tránh chúng nếu nó kéo dài con đường của anh ấy.

Gặp rùa

🐢

Cuộc sống con rùa trên một mạng lưới

XXXXXXXXXXXX🐢XXXXXXXXXXXX
Con rùa có thể di chuyển đến bất kỳ vuông liền kề ...
XXXXXXXX🐢XXXXXXXX

Tuy nhiên, những con rùa không thể di chuyển đến một hình vuông với một ngọn núi

X🌄XXXXXX🌄🐢XX🌄XX🌄XXX

X🌄🍓🐢🌄XX🌄XXXX
5
X🌄🍓🌄🌄XX
🔵🌄🍓🐢🌄🔴X🌄XXXX
2
🔵🌄🐢🌄🔴X🌄XXXX

Các thách thức

Với một đầu ra cấu hình lưới ban đầu, số lần di chuyển sẽ đưa con rùa đến được quả dâu tây của anh ta.

Quy tắc

  • Bạn có thể cho rằng lưới đầu vào có một giải pháp

  • Mỗi lưới sẽ chỉ có một strawberryvà hai portalsvà mộtturtle

  • Lưới đầu vào có thể được nhập ở bất kỳ định dạng thuận tiện

  • Bạn nên đối xử teleporterslà những mặt hàng sử dụng một lần

  • Lần lượt con rùa di chuyển lên một teleporterhình vuông mà anh ta đã ở trên đó teleporter. Anh ta không bao giờ di chuyển lên teleportervà ở đó để di chuyển

  • Con đường ngắn nhất không cần sử dụng cổng thông tin

  • Con rùa không thể chui vào gạch núi

  • Bạn có thể sử dụng bất kỳ ký tự ASCII hoặc số nguyên để biểu diễn mountains, turtle, empty grid square,strawberry

  • Bạn có thể sử dụng cùng một ký tự hoặc hai ký tự hoặc số nguyên ASCII khác nhau để thể hiện các teleportercặp

  • Một lưới có thể có nhiều hơn một đường dẫn có cùng độ dài đường dẫn ngắn nhất

  • Đây là

Làm rõ các quy tắc

  • Bạn nên đối xử teleporterslà những mặt hàng sử dụng một lần.

🐢X🔵X🍓🌄🌄🌄🌄🌄🔴XXXX

Chỉ có thể được giải quyết bằng cách nhập và thoát khỏi cổng hai lần. Tại thời điểm thực hiện việc làm rõ này, cả hai giải pháp đã hành động bằng cách giả sử rằng chúng là một lần sử dụng hoặc không có lý do để thử các hình vuông được sử dụng trước đó. Để tránh phá vỡ các giải pháp làm việc chăm chỉ của họ, đây dường như là cách tốt nhất cho thiết lập này. Do đó, đây sẽ được coi là một lưới không hợp lệ.

Các trường hợp kiểm tra được định dạng như danh sách

[ ['T', 'X', 'X', 'S', 'X'], ['X', 'X', 'X', 'X', 'X'], ['X', 'X', 'X', 'X', 'X'] ] --> 3
[ ['T', 'M', 'X', 'S', 'X'], ['X', 'M', 'X', 'X', 'X'], ['O', 'X', 'X', 'X', 'O'] ] --> 4
[ ['T', 'M', 'X', 'S', 'O'], ['O', 'M', 'X', 'X', 'X'], ['X', 'X', 'X', 'X', 'X'] ] --> 2
[ ['T', 'M', 'X', 'S', 'X'], ['O', 'M', 'X', 'X', 'X'], ['O', 'X', 'X', 'X', 'X'] ] --> 4
[ ['T', 'M', 'S', 'X', 'O'], ['X', 'M', 'M', 'M', 'M'], ['X', 'X', 'X', 'X', 'O'] ] --> 7
[ ['T', 'X', 'X', 'S', 'X'], ['O', 'M', 'M', 'M', 'X'], ['X', 'X', 'O', 'X', 'X'] ] --> 3

Các trường hợp thử nghiệm được định dạng cho con người

T X X S X
X X X X X
X X X X X --> 3

T M X S X
X M X X X
O X X X O --> 4

T M X S O
O M X X X
X X X X X --> 2

T M X S X
O M X X X
O X X X X --> 4

T M S X O
X M M M M
X X X X O --> 7

T X X S X
O M M M X
X X O X X --> 3

Tín dụng

Thiết kế và cấu trúc thông qua: Hungry mouse của Arnauld

Những thách thức được đề xuất Chỉnh sửa lời khuyên: Kamil-drakari , thịt bò

Lời khuyên chỉnh sửa chung: okx nedla2004 mbomb007


2
Tôi nghĩ rằng sẽ là một ý tưởng tốt để thêm một trường hợp thử nghiệm trong đó việc sử dụng dịch chuyển tức thời sẽ làm cho nó mất nhiều thời gian hơn.
Okx

@Okx Tạo và thêm ngay bây giờ.
akozi

Đã chỉnh sửa, cảm ơn.
akozi

1
@xnor Tôi cảm thấy rằng điều này có thể là trừu tượng từ các quy tắc ban đầu của tôi. Vì vậy, có lẽ tốt hơn để cổng một mục sử dụng?
akozi

1
Liên quan (tôi nghĩ).
Charlie

Câu trả lời:


13

JavaScript (ES7),  140 139  138 byte

Lấy đầu vào dưới dạng ma trận các số nguyên với ánh xạ sau:

  • 1
  • 0X
  • 1
  • 2
  • 3
m=>(R=g=(t,X,Y,i)=>m.map((r,y)=>r.map((v,x)=>r[(u=0,t?v-t:(x-X)**2+(y-Y)**2<3?v-3?~v?v:u--:R=R<i?R:i:1)||g(u,x,y,u-~i,r[x]=1),x]=v)))(2)|R

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

Làm sao?

gtt0(x,y)(X,Y)

iRmin(R,i)

Đầu tiên nó được gọi với để tìm vị trí bắt đầu của rùa.t=2

Nó tự gọi mình bằng nếu đạt được một cổng, để rùa được dịch chuyển đến cổng khác. Chúng tôi không tăng trong một lần lặp như vậy.t=1i

Mỗi ô được truy cập tạm thời được đặt thành một ngọn núi để ngăn rùa di chuyển hai lần trên cùng một ô trên cùng một đường. Nếu chúng ta bị mắc kẹt trong một ngõ cụt, các đệ quy đơn giản dừng lại mà không cần cập nhật .R

Đã bình luận

m => (                        // m[] = input matrix
  R =                         // initialize R to a non-numeric value
  g = (t, X, Y, i) =>         // g = recursive search function taking t = expected tile,
                              //     (X, Y) = current coordinates, i = path length
    m.map((r, y) =>           // for each row r[] at position y in m[]:
      r.map((v, x) =>         //   for each tile v at position x in r[]:
        r[                    //     this statement will eventually restore r[x] to v
          ( u = 0,            //     u = next tile to look for, or 0 if none
            t ?               //     if we're looking for a specific tile:
              v - t           //       test whether we've found it
            :                 //     else:
              (x - X) ** 2 +  //       compute the squared Euclidean distance between
              (y - Y) ** 2    //       (x, y) and (X, Y)
              < 3 ?           //       if it's less than 3 (i.e. reachable from (X, Y)):
                v - 3 ?       //         if v is not equal to 3:
                  ~v ?        //           if v is not equal to -1:
                    v         //             test if v = 0
                  :           //           else (v = -1):
                    u--       //             set u = -1 to find the other portal
                :             //         else (v = 3):
                  R = R < i ? //           we've found the strawberry: set R = min(R, i)
                      R : i   //
              :               //       else (this tile can't be reached):
                1             //         yield 1
          ) ||                //     if the above result is falsy:
          g(                  //       do a recursive call:
            u,                //         t = u
            x, y,             //         move to (x, y)
            u - ~i,           //         unless u is set to -1, increment i
            r[x] = 1          //         set this tile to a mountain
          ),                  //       end of recursive call
          x                   //     restore r[x] ...
        ] = v                 //     ... to v
    ))                        // end of both map() loops
)(2) | R                      // initial call to g with t = 2; return R

1
"Mỗi ô được truy cập tạm thời được đặt lên một ngọn núi để ngăn rùa di chuyển hai lần trên cùng một ô" Thật là một mẹo nhỏ đáng yêu. Câu trả lời tuyệt vời, và như mọi khi tôi đánh giá cao câu trả lời với lời giải thích :)
akozi

5

Python 2 , 441 431 341 byte

from itertools import*
G=input()
W=len(G[0])
H=len(G)
A=[0]*5
E=enumerate
for y,r in E(G):
 for x,C in E(r):A[C]=[x,y]
for L in count():
 for M in product(*[zip('UDLR'*2,'LRDU    ')]*L):
  x,y=A[0]
  for m in M:
    x+='R'in m;x-='L'in m;y+='D'in m;y-='U'in m
    if(x,y)==A[3]:x,y=A[2]
    if 1-(W>x>-1<y<H)or G[y][x]>3:break
  if[x,y]==A[1]:exit(L)

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

Nhập dưới dạng danh sách, nhưng sử dụng số thay vì ký tự (nhờ Quintec) và giá trị riêng cho đích của dịch chuyển tức thời. Những vết lõm lớn đó phải là ký tự tab nếu Stack Exchange loại bỏ chúng. Bất cứ lời khuyên hay ý tưởng đặc biệt hoan nghênh, như tôi cảm thấy rằng điều này có thể có được nhiều hơi ngắn hơn.

Bảng cho các ký tự được sử dụng trong thử thách cho các số được sử dụng cho chương trình của tôi ở bên dưới, nhưng bạn cũng có thể sử dụng chương trình này .

Challenge | My program
T         | 0
S         | 1
E         | 2
O         | 3
M         | 4
X         | -1

-10 byte nhờ Quintec bằng cách thay đổi đầu vào từ sử dụng ký tự thành số.

-Có rất nhiều byte nhờ Jonathan Frech, ElPedro và Jonathan Allan.


2
Bạn có thể có thể loại bỏ một vài ký tự bằng cách đưa vào một danh sách trong đó mỗi đối tượng được đại diện bởi một số thay vì một ký tự chuỗi.
Quintec

@Quintec Đã thêm, cảm ơn. Tôi muốn làm tương tự cho các hướng, nhưng sau đó các đường chéo sẽ phải được thực hiện riêng. Nó vẫn có thể di chuyển chúng đến số mặc dù.
nedla2004

1
@ElPedro Ahha Tôi có thể cạo 4 cái như thế này
Jonathan Allan

1
... và 10 điểm khác cho 356
Jonathan Allan

2
@Jonathan ALLan và ElPedro và Jonathan Pháp. Những lời khuyên tuyệt vời từ tất cả các bạn, và tôi đã thêm chúng cùng với tôi vài điều tôi nghĩ ra. (Sau nhiều lần trì hoãn)
nedla2004

2

Python 2 , 391 397 403 422 byte

M=input()
from networkx import*
a=b=c=d=0
N,h,w,S=[-1,0,1],len(M),len(M[0]),[]
for i in range(h):
 for j in range(w):
  I,m=(i,j),M[i][j]
  if m>7:c,d=a,b;a,b=I
  if m<0:Z=I
  if m==5:F=I
  S+=[I+I]
S+=[(a,b,c,d),(c,d,a,b)]
print len(shortest_path(from_edgelist([((A+p,B+q),(C,D))for A,B,C,D in S for p,q in[(p,q)for p in N for q in N]if-1<A+p<h and-1<B+q<w and M[C][D]*M[A+p][B+q]]),Z,F))-1

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

Vấn đề được dịch thành một biểu đồ và giải pháp là tìm ra con đường ngắn nhất tạo thành con rùa đến quả dâu tây.

Challenge | This code
T         | -1
S         |  5
O         |  8
M         |  0
X         |  1
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.