Existem anéis de montanha?

14

Desafio

Dada uma matriz de números inteiros positivos, determine se existem "anéis" de montanhas. A definição formal para esse desafio é: dada uma matriz de números inteiros positivos, existe algum número inteiro positivo npara o qual exista um anel fechado de células na matriz que seja estritamente maior do que ntal que todas as células fechadas no anel sejam menores ou iguais para n.

Vamos dar um exemplo verdadeiro:

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

Se definirmos npara 2:

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

Como podemos ver claramente, os 1s ao longo da borda formam um anel.

Definimos um anel como uma coleção ordenada de células onde as células adjacentes na coleção também são adjacentes (aresta ou canto) na grade. Além disso, o anel deve conter pelo menos 1 célula dentro dele; isto é, a tentativa de preencher somente a borda do BFS em toda a matriz, excluindo as células da coleção e nunca atravessando uma célula na coleção, deve perder pelo menos uma célula.

Casos de teste de verdade

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

Casos de teste de falsidade

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

Regras

  • As brechas padrão se aplicam
  • Isso é , então a resposta mais curta em bytes em cada idioma é declarada a vencedora do seu idioma. Nenhuma resposta será aceita.
  • A entrada pode ser tomada como qualquer forma razoável para uma matriz de números inteiros positivos
  • A saída pode ser dada como dois valores razoáveis, consistentes e distintos, indicando [verdadeiro] ou [falso].
HyperNeutrino
fonte
Pois qual né realmente o terceiro caso de teste "verdade"? [1,2] ?
Erik the Outgolfer
@EriktheOutgolfer O anel dos 3s é adjacente ao canto. Então sim.
User202729

Respostas:

3

Gelatina , 38 bytes

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

Experimente online!

Produz 1 se a matriz contiver cadeias de montanhas, 0 caso contrário.

Como funciona (um pouco desatualizado)

Talvez eu consiga reduzir um pouco o código, portanto esta seção provavelmente passará por uma edição pesada.

O link auxiliar

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

Por exemplo, dada uma matriz no formulário:

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)

Isso retorna as matrizes (o pedido não importa):

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)

Para encurtar a história, isso gera as linhas e colunas mais externas, com os cantos removidos.

O link principal

Ẇ€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.
Mr. Xcoder
fonte
2

Limpo , 224 ... 161 bytes

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]

Experimente online!

Define a função ? :: [[Int]] -> Int, retornando 0se houver um toque e 1caso contrário.

Trabalha transformando a matriz em 2s para montanhas e 0s para vales e depois inunda com 1s até que o resultado pare de mudar. Se 0ainda existirem s para qualquer altura de montanha, o produto será 0.

Furioso
fonte
1

JavaScript (Node.js) , 302 bytes

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

Experimente online!

Verifica se o fluxo de um ponto não pode alcançar a borda, enquanto a borda pode caminhar para cada ponto

l4m2
fonte