Có vòng núi không?


14

Thử thách

Đưa ra một ma trận các số nguyên dương, xác định xem có bất kỳ "vòng" nào của núi không. Định nghĩa chính thức cho thử thách này là: đưa ra một ma trận các số nguyên dương, có bất kỳ số nguyên dương nnào có vòng kín của các ô trong ma trận lớn hơn nhiều so với ntất cả các ô được bao trong vòng nhỏ hơn hoặc bằng không để n.

Hãy lấy một ví dụ trung thực:

3 4 5 3
3 1 2 3
4 2 1 3
4 3 6 5

Nếu chúng ta đặt nthành 2:

1 1 1 1
1 0 0 1
1 0 0 1
1 1 1 1

Như chúng ta có thể thấy rõ, các 1s dọc theo cạnh tạo thành một vòng.

Chúng tôi định nghĩa một vòng là một tập hợp các ô theo thứ tự trong đó các ô liền kề trong bộ sưu tập cũng liền kề (cạnh hoặc góc) trên lưới. Ngoài ra, vòng phải chứa ít nhất 1 ô bên trong nó; nghĩa là, cố gắng cạnh - chỉ BFS - lấp đầy toàn bộ ma trận không bao gồm các ô trong bộ sưu tập và không bao giờ đi qua một ô trong bộ sưu tập phải bỏ lỡ ít nhất một ô.

Các trường hợp thử nghiệm thật

4 7 6 5 8 -> 1 1 1 1 1
6 2 3 1 5 -> 1 0 0 0 1 (n = 3)
6 3 2 1 5 -> 1 0 0 0 1
7 5 7 8 6 -> 1 1 1 1 1

1 3 2 3 2
1 6 5 7 2
1 7 3 7 4
1 6 8 4 6

1 3 1
3 1 3
1 3 1

7 5 8 7 5 7 8 -> if you have n = 4, you get an interesting ridge shape around the top and right of the grid
8 4 4 2 4 2 7
6 1 8 8 7 2 7
5 4 7 2 5 3 5
5 6 5 1 6 4 5
3 2 3 2 7 4 8
4 4 6 7 7 2 5
3 2 8 2 2 2 8
2 4 8 8 6 8 8

5 7 6 8 6 8 7 -> there is an island in the outer ring (n = 4), but the island is a ring
5 3 2 4 2 4 7
6 3 7 8 5 1 5
8 2 5 2 8 2 7
8 3 8 8 8 4 7
6 1 4 1 1 2 8
5 5 5 5 7 8 7

150 170 150
170 160 170
150 170 150

Trường hợp thử nghiệm giả

1 2 3 2 1 -> this is just a single mountain if you picture it graphcially
2 3 4 3 2
3 4 5 4 3
2 3 4 3 2
1 2 3 2 1

4 5 4 3 2 -> this is an off-centered mountain
5 6 5 4 3
4 5 4 3 2
3 4 3 2 1

1 1 1 1 1 -> this is four mountains, but they don't join together to form a ring
1 2 1 2 1
1 1 1 1 1
1 2 1 2 1
1 1 1 1 1

3 3 3 3 3 -> there is a ring formed by the `3`s, but the `4` in the middle is taller so it doesn't qualify as a mountain ring
3 1 1 1 3
3 1 4 1 3
3 1 1 1 3
3 3 3 3 3

3 4 4 4 3
4 4 3 4 4
3 3 3 3 4
4 4 3 4 4
3 4 4 4 3

1  2  3  4  5
6  7  8  9  10
11 12 13 14 15
16 17 18 19 20
22 23 24 25 26

Quy tắc

  • Áp dụng sơ hở tiêu chuẩn
  • Đây là , vì vậy câu trả lời ngắn nhất tính bằng byte trong mỗi ngôn ngữ được tuyên bố là người chiến thắng trong ngôn ngữ của nó. Không có câu trả lời sẽ được chấp nhận.
  • Đầu vào có thể được lấy dưới dạng bất kỳ dạng hợp lý nào cho ma trận các số nguyên dương
  • Đầu ra có thể được cung cấp dưới dạng bất kỳ hai giá trị hợp lý, nhất quán, riêng biệt nào cho biết [true] hoặc [false].

Đối với ntrường hợp thử nghiệm "trung thực" thứ ba thực sự là gì? [1,2] ?
Erik the Outgolfer

@EriktheOutgolfer Vòng 3s liền kề nhau. Vì vậy, vâng.
dùng202729

Câu trả lời:


3

Thạch , 38 byte

Ẇ€Z$⁺Ẏµ,ZẈ>2ẠµƇµḊṖZƊ⁺FṀ<,Z.ịḊṖ$€Ɗ€ƊȦ)Ṁ

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

Đầu ra 1 nếu ma trận chứa các dãy núi, 0 nếu không.

Cách thức hoạt động (hơi lỗi thời)

Tôi có thể rút ngắn mã một chút, vì vậy phần này có thể sẽ trải qua chỉnh sửa nặng.

Liên kết trợ giúp

,Z.ịḊṖ$€Ɗ€ – Helper link. Let S be the input matrix.
,Z         – Pair S with its transpose.
        Ɗ€ – For each matrix (S and Sᵀ), Apply the previous 3 links as a monad.
  .ị       – Element at index 0.5; In Jelly, the ị atom returns the elements at
             indices floor(x) and ceil(x) for non-integer x, and therefore this
             returns the 0th and 1st elements. As Jelly is 1-indexed, this is the
             same as retrieving the first and last elements in a list.
    ḊṖ$€   – And for each list, remove the first and last elements.

Ví dụ: đưa ra một ma trận ở dạng:

A(1,1) A(1,2) A(1,3) ... A(1,n)
A(2,1) A(2,2) A(2,3) ... A(2,n)
A(3,1) A(3,2) A(3,3) ... A(3,n)
...
A(m,1) A(m,2) A(m,3) ... A(m,n)

Điều này trả về các mảng (thứ tự không quan trọng):

A(1,2), A(1,3), ..., A(1,n-1)
A(m,2), A(m,3), ..., A(m,n-1)
A(2,1), A(3,1), ..., A(m-1,1)
A(2,n), A(3,n), ..., A(m-1,n)

Câu chuyện dài, điều này tạo ra các hàng và cột ngoài cùng, với các góc bị loại bỏ.

Liên kết chính

Ẇ€Z$⁺Ẏµ,ZẈ>2ẠµƇµḊṖZƊ⁺FṀ<ÇȦ)Ṁ – Main link. Let M be the input matrix.
Ẇ€                           – For each row of M, get all its sublists.
  Z$                         – Transpose and group into a single link with the above.
    ⁺                        – Do twice. So far, we have all contiguous sub-matrices.
     Ẏ                       – Flatten by 1 level.
      µ      µƇ              – Filter-keep those that are at least 3 by 3:
       ,Z                      – Pair each sub-matrix S with Sᵀ.
         Ẉ                     – Get the length of each (no. rows, no. columns).
          >2                   – Element-wise, check if it's greater than 2.
            Ạ                  – All.
               µ          )  – Map over each sub-matrix S that's at least 3 by 3
                ḊṖ           – Remove the first and last elements.
                  ZƊ         – Zip and group the last 3 atoms as a single monad.
                    ⁺        – Do twice (generates the inner cells).
                     FṀ      – Flatten, and get the maximum.
                       <Ç    – Element-wise, check if the results of the helper
                               link are greater than those in this list.
                         Ȧ   – Any and all. 0 if it is empty, or contains a falsey
                               value when flattened, else 1.
                           Ṁ – Maximum.

2

Sạch , 224 ... 161 byte

import StdEnv,StdLib
p=prod
~ =map
^ =reverse o$
@ =transpose o~(^o^)
$l=:[h:t]|h>1=l=[1: $t]
$e=e
?m=p[p(~p(limit(iterate(@o@)(~(~(\a|a>b=2=0))m))))\\n<-m,b<-n]

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

Xác định hàm ? :: [[Int]] -> Int, trả về 0nếu có vòng, và 1nếu không.

Hoạt động bằng cách biến ma trận thành 2s cho núi và 0s cho thung lũng, sau đó tràn vào với 1s cho đến khi kết quả ngừng thay đổi. Nếu bất kỳ 0s vẫn tồn tại cho bất kỳ chiều cao núi, sản phẩm sẽ được 0.


1

JavaScript (Node.js) , 302 byte

a=>a.some((b,i)=>b.some((n,j)=>(Q=(W=(i,j,f)=>[a.map((b,I)=>b.map((t,J)=>I==i&J==j)),...a+0].reduce(A=>A.map((b,I)=>b.map((t,J)=>f(I)(J)&&(A[I-1]||b)[J]|(A[I+1]||b)[J]|b[J-1]|b[J+1]|t))))(i,j,I=>J=>a[I][J]<=n)).some((b,i)=>b.some((d,j)=>d&&!i|!j|!Q[i+1]|b[j+1]==b.b))<!/0/.test(W(0,0,I=>J=>!Q[I][J]))))

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

Kiểm tra nếu chảy từ một điểm không thể đến biên giới, trong khi đường viền có thể đi đến mọi điểm

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.