산 고리가 있습니까?


14

도전

양의 정수 행렬이 주어지면 산의 "고리"가 있는지 확인하십시오. 이 문제에 대한 공식적인 정의는 다음과 같습니다. 양의 정수의 행렬이 주어지면, n고리에 n둘러싸인 모든 세포가 그보다 작거나 같도록 엄밀히 큰 행렬에 세포의 닫힌 고리가있는 양의 정수 가 있습니까? 에 n.

진실한 예를 들어 보자.

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

우리가 다음 n으로 설정 하면 2:

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

우리가 분명히 볼 수 있듯이 1가장자리를 따라 s가 고리를 형성합니다.

우리는 링을 컬렉션의 인접 셀이 그리드의 (가장자리 또는 모퉁이) 인접한 셀의 정렬 된 컬렉션으로 정의합니다. 또한, 고리는 그 안에 적어도 하나의 세포를 포함해야합니다. 즉, 컬렉션의 셀을 제외하고 컬렉션의 셀을 절대로 통과하지 않고 전체 매트릭스를 에지 전용 BFS-floodfill하려고하면 적어도 하나의 셀이 없어야합니다.

확실한 테스트 사례

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

거짓 테스트 사례

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

규칙

  • 표준 허점 적용
  • 이것은 이므로 각 언어에서 가장 짧은 바이트 단위 답변이 해당 언어의 승자로 선언됩니다. 답변이 없습니다.
  • 입력 값은 양의 정수로 구성된 합리적인 형식으로 간주 될 수 있습니다.
  • 출력은 [true] 또는 [false]를 나타내는 2 개의 합리적이고 일관된 고유 값으로 제공 될 수 있습니다.

무엇 n세 번째 "truthy"테스트 케이스는 실제로 truthy입니까? [1,2] ?
Outgolfer Erik

@EriktheOutgolfer 3s의 고리는 모퉁이 옆에 있습니다. 예.
user202729 2016 년

답변:


3

젤리 , 38 바이트

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

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

출력 1 매트릭스는 산맥 포함되어 있으면 0 , 그렇지.

작동 방식 (약간 구식)

코드를 약간 짧게 만들 수 있으므로이 섹션에서는 많은 편집 작업이 수행 될 수 있습니다.

도우미 링크

,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.

예를 들어 다음과 같은 형식의 행렬이 있습니다.

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)

이것은 배열을 반환합니다 (순서는 중요하지 않습니다).

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)

간단히 말해 모서리가 제거 된 가장 바깥 쪽 행과 열이 생성됩니다.

메인 링크

Ẇ€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

클린 , 224 ... 161 바이트

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]

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

링이 있으면 ? :: [[Int]] -> Int리턴 0하고 1그렇지 않으면 리턴 하는 함수를 정의합니다 .

행렬 2을 산과 0계곡 으로 s 로 변환 한 다음 1결과가 변경을 멈출 때까지 s로 플러딩하여 작동합니다. 어떤 경우 0의 여전히 어떤 산 높이 존재, 제품이 될 것입니다 0.


1

자바 스크립트 (Node.js) , 302 바이트

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

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

점에서 흐르는 물이 경계에 도달 할 수 없는지 확인하고 경계는 모든 점으로 이동할 수 있습니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.