Vị trí mơ hồ trên lưới


11

Bạn có một robot nhỏ với bốn cảm biến khoảng cách. Nó biết cách bố trí của một căn phòng, nhưng nó không có ý nghĩa định hướng ngoài việc có thể khóa vào hướng lưới. Bạn muốn có thể tìm ra nơi robot dựa trên bài đọc, nhưng nó có thể mơ hồ vì các cảm biến hạn chế.

Giải thích thách thức

Bạn sẽ được bố trí phòng và bốn bài đọc khoảng cách theo chiều kim đồng hồ cho số lượng ô giữa bạn và một bức tường. Có thể có những bức tường ở giữa phòng và các cạnh của lưới cũng là những bức tường. Robot không thể được đặt trên tường.

Mục tiêu của bạn là liệt kê tất cả các vị trí trong phòng mà robot có thể ở trong đó sẽ đưa ra các bài đọc nhất định. Hãy nhớ rằng robot không có ý nghĩa định hướng (ngoài việc bị khóa ở góc 90 độ trên lưới - tức là robot sẽ không bao giờ được định hướng theo đường chéo hoặc một số góc nghiêng khác), vì vậy hãy đọc [1, 2, 3, 4], ví dụ, giống như đọc [3, 4, 1, 2].

Ví dụ

Đối với các ví dụ này, tọa độ ô sẽ được cung cấp dưới dạng cặp 0 (x, y) từ ô trên cùng bên trái. Bài đọc sẽ được đưa ra theo thứ tự theo chiều kim đồng hồ trong một danh sách ngoặc vuông. Bố cục sẽ sử dụng dấu thăng cho tường và các ký tự khác (thường là dấu chấm) để thể hiện các ô trống.

Trường hợp 1

. . . .
. . . .
. . # .
. . . .
  • [1, 0, 2, 3] ==> (1, 0), (3, 1)
  • [0, 0, 3, 3] ==> (0, 0), (3, 0), (0, 3), (3, 3)
  • [2, 1, 1, 0] ==> (0, 2), (2, 1)
  • [1, 1, 2, 2] ==> (1, 1)

Trường hợp 2

# a . # a .
a # . . # a
. . # . . #
# . . # . .
a # . . # a
. a # . a #
  • [0, 0, 1, 1] ==> mọi vị trí trên lưới là một dấu chấm
  • [1, 0, 0, 0] ==> tất cả các a trên lưới

Trường hợp 3

.
  • [0, 0, 0, 0] ==> (0, 0)

Trường hợp 4

. # #
. . .
  • [1, 2, 0, 0] ==> (0, 1)
  • [0, 1, 2, 0] ==> (0, 1)
  • [0, 0, 1, 0] ==> (0, 0)
  • [1, 0, 1, 0] ==> (1, 1)
  • [0, 1, 0, 1] ==> (1, 1)

Trường hợp 5

. # . .
. . . .
. . # .
. . . .
  • [2, 1, 1, 0] ==> (0, 2), (2, 1)
  • [0, 2, 2, 1] ==> (1, 1)
  • [1, 0, 2, 2] ==> (1, 1)
  • [0, 3, 0, 0] ==> (0, 0)
  • [1, 0, 1, 1] ==> (1, 2)

Các quy tắc khác

  • Đầu vào có thể ở bất kỳ định dạng thuận tiện. Đầu vào là một lưới các bức tường và không gian và một danh sách bốn khoảng cách theo chiều kim đồng hồ.
  • Đầu ra có thể là một danh sách tất cả các ô thỏa mãn việc đọc hoặc một phiên bản sửa đổi của lưới cho thấy ô nào thỏa mãn việc đọc. Định dạng chính xác của đầu ra không quan trọng miễn là hợp lý và nhất quán. Các định dạng đầu ra hợp lệ bao gồm, nhưng không giới hạn ở :
    • In một dòng cho mỗi ô tọa độ như một cặp theo thứ tự
    • In lưới với ., #!cho không gian, tường và các vị trí có thể, tương ứng.
    • Trả về danh sách các cặp đã đặt hàng
    • Trả về một danh sách các chỉ mục
    • Trả về danh sách các danh sách sử dụng các giá trị khác nhau cho không gian, tường và các vị trí có thể
    • Trả về / in một ma trận 0 và 1, sử dụng 1 để biểu thị các ô nơi đọc sẽ xảy ra. (Không cần thiết phải bao gồm các bức tường)
    • Một lần nữa, danh sách này không đầy đủ, vì vậy các đại diện khác có giá trị miễn là chúng nhất quán và hiển thị mọi vị trí hợp lệ có thể có trong lưới hoặc danh sách. Nếu bạn không chắc chắn, hãy để lại nhận xét và tôi sẽ vui lòng làm rõ.
  • Bạn có thể cho rằng một lần đọc tương ứng với ít nhất một vị trí trên lưới.
  • Bạn có thể giả định rằng lưới đầu vào có kích thước tối thiểu 1x1 và có ít nhất một khoảng trống.
  • Bạn có thể giả định rằng lưới đầu vào không lớn hơn 256 ô trong mỗi chiều.
  • Bạn có thể cho rằng lưới đầu vào luôn là một hình chữ nhật hoàn hảo và không bị lởm chởm.
  • Không có hình phạt hoặc tiền thưởng nếu chương trình của bạn xảy ra để cung cấp đầu ra lành mạnh cho đầu vào không hợp lệ.
  • Đây là mã golf, vì vậy mã ngắn nhất sẽ thắng.

Các thử nghiệm cho Case 5dường như không hoàn toàn đúng. Tôi nhận được (0,2),(2,1), (1,3), (1,3), và nothing.
TFeld

@TFeld Cảm ơn. Đã sửa.
Beefster

1
@Arnauld Có vẻ hợp lý với tôi. Tôi sẽ thêm nó vào danh sách đã không đầy đủ.
Beefster

Câu trả lời:


3

JavaScript (ES6),  130 128 126  125 byte

(m)(l)m01l

1

m=>l=>m.map((r,y)=>r.map((v,x)=>v&!!([...'3210321'].map(d=>(g=X=>(m[Y+=~-d%2]||0)[X+=(d-2)%2]?1+g(X):0)(x,Y=y))+g).match(l)))

Hãy thử trực tuyến! (với đầu ra được xử lý sau để dễ đọc)

Đã bình luận

m => l =>                         // m[] = layout matrix; l[] = list of distances
  m.map((r, y) =>                 // for each row r[] at position y in m[]:
    r.map((v, x) =>               //   for each cell v at position x in r[];
      v &&                        //     yield 0 if v = 0
      !!(                         //     otherwise, test whether we can find l[] within a
        [...'3210321']            //     list containing twice the results of the sensors
        .map(d =>                 //       for each direction d:
          (g = X => (             //         g = recursive function taking X
              m[Y += ~-d % 2]     //         add dy[d] to Y
              || 0                //         use a dummy object if we're out of the board
            )[X += (d - 2) % 2] ? //         add dx[d] to X; if (m[Y] || 0)[X] is equal to 1:
              1 +                 //           add 1 to the final result
              g(X)                //           and do a recursive call
            :                     //         else:
              0                   //           yield 0 and stop recursion
          )(x, Y = y)             //         initial call to g with X = x and Y = y
        )                         //       end of map() over directions
        + g                       //       coerce the result to a comma-separated string,
                                  //       followed by harmless garbage
      ).match(l)                  //     test whether l[] can be found in this string
                                  //     (l[] is implicitly coerced to a string as well)
    )                             //   end of map() over r[]
  )                               // end of map() over m[]

1

Python 2 , 234 202 200 191 byte

lambda m,a:[(i,j)for j,l in e(m)for i,c in e(l)if('#'<c)*[(''.join(L)[::-1]+'#').find('#')for L in l[:i],zip(*m)[i][:j],l[:i:-1],zip(*m)[i][:j:-1]]in[a[q:]+a[:q]for q in 0,1,2,3]]
e=enumerate

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


1

Than , 42 byte

PθFθ¿⁼¶ι⸿¿№E⁴E⁴⊖⌕⁺⪫KD⊕⌈η✳§⟦→↓←↑⟧⁺κμω#¦#η!ι

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Than dường như thêm một số phần đệm vào đầu ra vì một số lý do; Tôi cho rằng đó là một lỗi trong Than. Giải trình:

Pθ

In bản đồ mà không di chuyển con trỏ.

Fθ

Vòng qua từng nhân vật trong bản đồ.

¿⁼¶ι⸿

Nếu đó là một dòng mới, sau đó di chuyển con trỏ đến đầu dòng tiếp theo.

⊖⌕⁺⪫KD⊕⌈η✳§⟦→↓←↑⟧⁺κμω#¦#

Tìm khoảng cách đến tường theo hướng k+m.

¿№E⁴E⁴...η!ι

Lặp lại tất cả bốn hướng bắt đầu k, nhìn trộm theo cả bốn hướng theo chiều kim đồng hồ mvà nếu kết quả bao gồm đầu vào thứ hai thì hãy in một !ký tự hiện tại.

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.