Y a-t-il des anneaux de montagne?


14

Défi

Étant donné une matrice d'entiers positifs, déterminez s'il existe des «anneaux» de montagnes. La définition formelle de ce défi est: étant donné une matrice d'entiers positifs, y a-t-il un entier positif npour lequel il y a un anneau fermé de cellules dans la matrice qui est strictement supérieur à ntel que toutes les cellules enfermées dans l'anneau soient inférieures ou égales à n.

Prenons un exemple véridique:

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

Si nous nous mettons nà 2:

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

Comme nous pouvons le voir clairement, les 1s le long du bord forment un anneau.

Nous définissons un anneau comme une collection ordonnée de cellules où les cellules adjacentes de la collection sont également adjacentes (bord ou coin) sur la grille. De plus, l'anneau doit contenir au moins 1 cellule à l'intérieur de celui-ci; c'est-à-dire que toute tentative de remplissage BFS en bordure seule de la matrice entière à l'exclusion des cellules de la collection et de ne jamais traverser une cellule de la collection doit manquer au moins une cellule.

Cas de test authentiques

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

Cas de test de falsification

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

Règles

  • Les échappatoires standard s'appliquent
  • Il s'agit de , donc la réponse la plus courte en octets dans chaque langue est déclarée gagnante de sa langue. Aucune réponse ne sera acceptée.
  • L'entrée peut être prise sous n'importe quelle forme raisonnable pour une matrice d'entiers positifs
  • La sortie peut être donnée sous la forme de deux valeurs raisonnables, cohérentes et distinctes indiquant [vrai] ou [faux].

Car quel nest le troisième cas de test "véridique" réellement véridique? [1,2] ?
Erik the Outgolfer

@EriktheOutgolfer L'anneau de 3 est adjacent par coin. Donc oui.
user202729

Réponses:


3

Gelée , 38 octets

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

Essayez-le en ligne!

Affiche 1 si la matrice contient des chaînes de montagnes, 0 sinon.

Comment ça marche (un peu dépassé)

Je pourrais peut-être raccourcir un peu le code, donc cette section subira probablement une lourde édition.

Le lien d'aide

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

Par exemple, étant donné une matrice sous la forme:

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)

Cela renvoie les tableaux (l'ordre n'a pas d'importance):

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)

Pour faire court, cela génère les lignes et colonnes les plus externes, avec les coins supprimés.

Le maillon 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.

2

Nettoyer , 224 ... 161 octets

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]

Essayez-le en ligne!

Définit la fonction ? :: [[Int]] -> Int, renvoyant 0s'il y a un anneau, et1 sinon.

Fonctionne en transformant la matrice en 2s pour les montagnes et 0s pour les vallées, puis inonde avec 1s jusqu'à ce que le résultat cesse de changer. S'il 0en existe encore pour une hauteur de montagne, le produit sera 0.


1

JavaScript (Node.js) , 302 octets

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

Essayez-le en ligne!

Vérifie si l'écoulement d'un point ne peut pas atteindre la frontière, tandis que la frontière peut marcher jusqu'à chaque point

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.