¿Hay anillos de montaña?

14

Desafío

Dada una matriz de enteros positivos, determine si hay "anillos" de montañas. La definición formal de este desafío es: dada una matriz de enteros positivos, ¿hay algún entero positivo npara el que haya un anillo cerrado de celdas en la matriz que sea estrictamente mayor nque todas las celdas encerradas en el anillo son menores o iguales? a n.

Tomemos un ejemplo verdadero:

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

Si establecemos na 2:

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

Como podemos ver claramente, las 1s a lo largo del borde forman un anillo.

Definimos un anillo como una colección ordenada de celdas donde las celdas adyacentes en la colección también son adyacentes (borde o esquina) en la cuadrícula. Además, el anillo debe contener al menos 1 celda dentro de él; es decir, intentar rellenar con BFS solo borde toda la matriz, excluyendo las celdas en la colección y nunca atravesando una celda en la colección, debe perder al menos una celda.

Casos de prueba de la verdad

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

Falsy Test Cases

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

Reglas

  • Se aplican lagunas estándar
  • Este es el , por lo que la respuesta más corta en bytes en cada idioma se declara ganadora de su idioma. No se aceptarán respuestas.
  • La entrada puede tomarse como cualquier forma razonable para una matriz de enteros positivos
  • La salida se puede dar como dos valores razonables, consistentes y distintos que indican [verdadero] o [falso].
Hiperneutrino
fuente
¿ nCuál es el tercer caso de prueba "verdadero" realmente verdadero? [1,2] ?
Erik the Outgolfer
@EriktheOutgolfer El anillo de 3s está adyacente por la esquina. Entonces sí.
user202729

Respuestas:

3

Jalea , 38 bytes

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

Pruébalo en línea!

Salidas 1 si la matriz contiene cadenas montañosas, 0 contrario.

Cómo funciona (un poco anticuado)

Es posible que pueda acortar un poco el código, por lo que esta sección probablemente sufrirá una gran edición.

El enlace de ayuda

,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 ejemplo, dada una matriz en la forma:

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)

Esto devuelve las matrices (el orden no 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)

En pocas palabras, esto genera las filas y columnas más externas, con las esquinas eliminadas.

El enlace 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.
Sr. Xcoder
fuente
2

Limpio , 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]

Pruébalo en línea!

Define la función ? :: [[Int]] -> Int, devolviendo 0si hay un anillo, y de lo 1contrario.

Funciona convirtiendo la matriz en 2s para montañas 0ys para valles, luego se inunda con 1s hasta que el resultado deja de cambiar. Si 0todavía existe alguna s para cualquier altura de montaña, el producto será 0.

Οurous
fuente
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]))))

Pruébalo en línea!

Comprueba si el flujo desde un punto no puede alcanzar el borde, mientras que el borde puede caminar a cada punto

l4m2
fuente