山の指輪はありますか?


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はリングを形成しています。

リングは、コレクション内の隣接するセルもグリッド上で隣接している(エッジまたはコーナー)セルの順序付けられたコレクションとして定義します。さらに、リングには少なくとも1つのセルが含まれている必要があります。つまり、コレクション内のセルを除くマトリックス全体をエッジのみのBFSフラッディングで埋めようとして、コレクション内のセルを走査しないようにするには、少なくとも1つのセルを逃す必要があります。

真実のテストケース

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]
エリックアウトゴルファー

@EriktheOutgolfer 3のリングはコーナーで隣接しています。あ、はい。
user202729

回答:


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に、谷の場合はsに変換し1、結果が変化しなくなるまでsであふれます。0山の高さに対してsがまだ存在する場合、製品はになります0


1

JavaScript(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.