Di chi sono i vicini ostili?


10

introduzione

Ai fini di questa sfida, definiremo i vicini di un elemento in una matrice quadrata (tale che ) come tutte le voci di che sono immediatamente adiacenti in diagonale, orizzontale o verticale a (cioè "circondano" , senza avvolgersi).A E = A i , j A EEUNE=UNio,jUNE E

Per i pedanti, una definizione formale dei vicini di per un matix è (indicizzata 0): dove n×nA N i ,UNio,jn×nUNE i ,

Nio,j={UNun',B|(un',B)Eio,j([0,n)Z)2}
Eio,j={io-1,io,io+1}×{j-1,j,j+1} \ {io,j}

Diciamo che l'elemento all'indice vive nell'ostilità se è coprime per tutti i suoi vicini (cioè, ). Purtroppo, questa povera voce non può prendere in prestito nemmeno una tazza di zucchero dai suoi maleducati residenti nelle vicinanze ...io,jGCD(UNio,j,n)=1nNio,j

Compito

Abbastanza storie: data una matrice quadrata M di numeri interi positivi, genera uno dei seguenti:

  • Un elenco semplice di elementi (deduplicati o meno) che indicano tutte le voci che occupano alcuni indici io,j in M tale che i vicini Nio,j siano ostili.
  • Una matrice booleana con 1 s in posizioni in cui i vicini sono ostili e 0 altrimenti (puoi scegliere qualsiasi altro valore coerente al posto di 0 e 1 ).
  • L'elenco di coppie di indici io,j che rappresentano i quartieri ostili.

Implementazione di riferimento in Physica : supporta la sintassi di Python anche per l'I / O. Puoi prendere input e fornire output attraverso qualsiasi metodo standard e in qualsiasi formato ragionevole, tenendo presente che queste scappatoie sono vietate per impostazione predefinita. Questo è code-golf, quindi vince il codice più breve in byte (in ogni lingua)!

Inoltre, puoi prendere anche la dimensione della matrice come input e inoltre puoi prendere la matrice come una lista piatta poiché sarà sempre quadrata.

Esempio

Considera la seguente matrice:

(641014272232535836)

I vicini corrispondenti di ciascun elemento sono:

i j – E  -> Neighbours                          | All coprime to E?
                                                |
0 0 – 64 -> {10; 27; 22}                        | False
0 1 – 10 -> {64; 14; 27; 22; 32}                | False
0 2 – 14 -> {10; 22; 32}                        | False
1 0 – 27 -> {64; 10; 22; 53; 58}                | True
1 1 – 22 -> {64; 10; 14; 27; 32; 53; 58; 36}    | False
1 2 – 32 -> {10; 14; 22; 58; 36}                | False
2 0 – 53 -> {27; 22; 58}                        | True
2 1 – 58 -> {27; 22; 32; 53; 36}                | False
2 2 – 36 -> {22; 32; 58}                        | False

E quindi l'output deve essere uno dei seguenti:

  • {27; 53}
  • {{0; 0; 0}; {1; 0; 0}; {1; 0; 0}}
  • {(1; 0); (2; 0)}

Casi test

Input –> Version 1 | Version 2 | Version 3

[[36, 94], [24, 69]] ->
    []
    [[0, 0], [0, 0]]
    []
[[38, 77, 11], [17, 51, 32], [66, 78, 19]] –>
    [38, 19]
    [[1, 0, 0], [0, 0, 0], [0, 0, 1]]
    [(0, 0), (2, 2)]
[[64, 10, 14], [27, 22, 32], [53, 58, 36]] ->
    [27, 53]
    [[0, 0, 0], [1, 0, 0], [1, 0, 0]]
    [(1, 0), (2, 0)]
[[9, 9, 9], [9, 3, 9], [9, 9, 9]] ->
    []
    [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
    []
[[1, 1, 1], [1, 1, 1], [1, 1, 1]] ->
    [1, 1, 1, 1, 1, 1, 1, 1, 1] or [1]
    [[1, 1, 1], [1, 1, 1], [1, 1, 1]]
    [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
[[35, 85, 30, 71], [10, 54, 55, 73], [80, 78, 47, 2], [33, 68, 62, 29]] ->
    [71, 73, 47, 29]
    [[0, 0, 0, 1], [0, 0, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1]]
    [(0, 3), (1, 3), (2, 2), (3, 3)]

Prendere in prestito cose da vicini ostili? Per qualche motivo, questo mi ricorda il gioco di Jeff Minter Hover Bovver ...
Arnauld

Possiamo prendere la dimensione della matrice come input?
Delfad0r

@ Delfad0r Mi dimentico sempre di menzionarlo. Sì, puoi prendere la dimensione della matrice come input.
Mr. Xcoder,

Risposte:


3

APL (Dyalog) , 17 byte

1=⊢∨(×/∘,↓)⌺3 3÷⊢

Provalo online! (crediti a ngn per la traduzione dei casi di test in APL)

Breve spiegazione

(×/∘,↓)⌺3 3 ottiene il prodotto di ogni elemento con i suoi vicini.

Quindi divido per l'argomento ÷⊢, in modo che ogni voce nella matrice sia stata mappata sul prodotto dei suoi vicini.

Alla fine prendo il gcd dell'argomento con questa matrice ⊢∨e controllo l'uguaglianza con 1,1=

Nota, come con la risposta di ngn , questo fallisce per alcuni input a causa di un bug nell'interprete.


2

JavaScript (ES6), 121 byte

Restituisce una matrice di valori booleani, dove false significa ostile.

m=>m.map((r,y)=>r.map((v,x)=>[...'12221000'].some((k,j,a)=>(g=(a,b)=>b?g(b,a%b):a>1)(v,(m[y+~-k]||0)[x+~-a[j+2&7]]||1))))

Provalo online!

Come?

Il metodo utilizzato per isolare gli 8 vicini di ogni cella è simile a quello che ho descritto qui .

Commentate

m =>                            // m[] = input matrix
  m.map((r, y) =>               // for each row r[] at position y in m[]:
    r.map((v, x) =>             //   for each value v at position x in r[]:
      [...'12221000']           //     we consider all 8 neighbors
      .some((k, j, a) =>        //     for each k at position j in this array a[]:
        ( g = (a, b) =>         //       g is a function which takes 2 integers a and b
            b ?                 //       and recursively determines whether they are
              g(b, a % b)       //       coprime to each other
            :                   //       (returns false if they are, true if they're not)
              a > 1             //
        )(                      //       initial call to g() with:
          v,                    //         the value of the current cell
          (m[y + ~-k] || 0)     //         and the value of the current neighbor
          [x + ~-a[j + 2 & 7]]  //
          || 1                  //         or 1 if this neighbor is undefined
  ))))                          //         (to make sure it's coprime with v)

2

MATL , 22 byte

tTT1&Ya3thYC5&Y)Zd1=A)

L'input è una matrice. L'output è costituito da tutti i numeri con vicini ostili.

Provalo online! Oppure verifica tutti i casi di test .

Spiegazione con esempio funzionante

Considera l'input [38, 77, 11; 17, 51, 32; 66, 78, 19]come esempio. I contenuti dello stack sono mostrati dal basso verso l'alto.

t         % Implicit input. Duplicate
          % STACK: [38, 77, 11;
                    17, 51, 32;
                    66, 78, 19]
                   [38, 77, 11;
                    17, 51, 32;
                    66, 78, 19]
TT1&Ya    % Pad in the two dimensions with value 1 and width 1
          % STACK: [38, 77, 11;
                    17, 51, 32;
                    66, 78, 19]
                   [1,  1,  1,  1,  1;
                    1,  38, 77, 11, 1;
                    1,  17, 51, 32, 1;
                    1,  66, 78, 19, 1
                    1,  1,  1,  1,  1]
3thYC     % Convert each sliding 3×3 block into a column (in column-major order)
          % STACK: [38, 77, 11;
                    17, 51, 32;
                    66, 78, 19]
                   [ 1,  1,  1,  1, 38, 17,  1, 77, 51;
                     1,  1,  1, 38, 17, 66, 77, 51, 78;
                     1,  1,  1, 17, 66,  1, 51, 78,  1;
                     1, 38, 17,  1, 77, 51,  1, 11, 32;
                    38, 17, 66, 77, 51, 78, 11, 32, 19;
                    17, 66,  1, 51, 78,  1, 32, 19,  1;
                     1, 77, 51,  1, 11, 32,  1,  1,  1;
                    77, 51, 78, 11, 32, 19,  1,  1,  1;
                    51, 78,  1, 32, 19,  1,  1,  1,  1]
5&Y)      % Push 5th row (centers of the 3×3 blocks) and then the rest of the matrix
          % STACK: [38, 77, 11;
                    17, 51, 32;
                    66, 78, 19]
                   [38, 17, 66, 77, 51, 78, 11, 32, 19]
                   [ 1,  1,  1,  1, 38, 17,  1, 77, 51;
                     1,  1,  1, 38, 17, 66, 77, 51, 78;
                     1,  1,  1, 17, 66,  1, 51, 78,  1;
                     1, 38, 17,  1, 77, 51,  1, 11, 32;
                    17, 66,  1, 51, 78,  1, 32, 19,  1;
                     1, 77, 51,  1, 11, 32,  1,  1,  1;
                    77, 51, 78, 11, 32, 19,  1,  1,  1;
                    51, 78,  1, 32, 19,  1,  1,  1,  1]
Zd        % Greatest common divisor, element-wise with broadcast
          % STACK: [38, 77, 11;
                    17, 51, 32;
                    66, 78, 19]
                   [1,  1,  1,  1,  1,  1,  1,  1,  1;
                    1,  1,  1,  1, 17,  6, 11,  1,  1;
                    1,  1,  1,  1,  3,  1,  1,  2,  1;
                    1,  1,  1,  1,  1,  3,  1,  1,  1;
                    1,  1,  1,  1,  3,  1,  1,  1,  1;
                    1,  1,  3,  1,  1,  2,  1,  1,  1;
                    1, 17,  6, 11,  1,  1,  1,  1,  1;
                    1,  1,  1,  1,  1,  1,  1,  1,  1]
1=        % Compare with 1, element-wise. Gives true (1) or false (0)
          % STACK: [38, 77, 11;
                    17, 51, 32;
                    66, 78, 19]
                   [1, 1, 1, 1, 1, 1, 1, 1, 1;
                    1, 1, 1, 1, 0, 0, 0, 1, 1;
                    1, 1, 1, 1, 0, 1, 1, 0, 1;
                    1, 1, 1, 1, 1, 0, 1, 1, 1;
                    1, 1, 1, 1, 0, 1, 1, 1, 1;
                    1, 1, 0, 1, 1, 0, 1, 1, 1;
                    1, 0, 0, 0, 1, 1, 1, 1, 1;
                    1, 1, 1, 1, 1, 1, 1, 1, 1]
A         % All: true (1) for columns that do not contain 0
          % STACK: [38, 77, 11;
                    17, 51, 32;
                    66, 78, 19]
                   [1, 0, 0, 0, 0, 0, 0, 0, 1]
)         % Index (the matrix is read in column-major order). Implicit display
          % [38, 19]

Funzionerà se la matrice è più grande di 3x3?
Robert Fraser,

@RobertFraser Sì, la procedura non dipende dalla dimensione della matrice. Vedi l'ultimo caso di prova, ad esempio
Luis Mendo,

1

APL (Dyalog Classic) , 23 22 byte

-1 byte grazie a @ H.PWiz

{∧/1=1↓∨∘⊃⍨14⌽,⍵}⌺3 3

Provalo online!

non supporta matrici inferiori a 3x3 a causa di un bug nell'interprete


@ H.PWiz è molto intelligente, vuoi pubblicarlo come tuo?
ngn,

Certo, puoi anche usare (⊃∨⊢)-> ∨∘⊂⍨Penso
H.Piz il

1

Gelatina , 24 byte

Hmm, sembra lungo.

ỊẠ€T
ŒJ_€`Ç€ḟ"J$ịFg"FÇịF

Un collegamento monadico che accetta un elenco di elenchi di numeri interi positivi che restituisce un elenco di ciascuno dei valori che si trovano in quartieri ostili (versione 1 senza deduplicazione).

Provalo online! O vedi una suite di test .

Come?

ỊẠ€T - Link 1: indices of items which only contain "insignificant" values: list of lists
Ị    - insignificant (vectorises) -- 1 if (-1<=value<=1) else 0 
  €  - for €ach:
 Ạ   -   all?
   T - truthy indices

ŒJ_€`Ç€ḟ"J$ịFg"FÇịF - Main Link: list of lists of positive integers, M
ŒJ                  - multi-dimensional indices
    `               - use as right argument as well as left...
   €                -   for €ach:
  _                 -     subtract (vectorises)
      €             - for €ach:
     Ç              -   call last Link (1) as a monad
          $         - last two links as a monad:
         J          -   range of length -> [1,2,3,...,n(elements)]
        "           -   zip with:
       ḟ            -     filter discard (remove the index of the item itself)
            F       - flatten M
           ị        - index into (vectorises) -- getting a list of lists of neighbours
               F    - flatten M
              "     - zip with:
             g      -   greatest common divisor
                Ç   - call last Link (1) as a monad
                  F - flatten M
                 ị  - index into

1

Python 2 , 182 177 166 byte

lambda a:[[all(gcd(t,a[i+v][j+h])<2for h in[-1,0,1]for v in[-1,0,1]if(h|v)*(i+v>-1<j+h<len(a)>i+v))for j,t in E(s)]for i,s in E(a)]
from fractions import*
E=enumerate

Provalo online!

Emette un elenco di elenchi con voci Vero / Falso.


1

Haskell , 95 byte

m?n|l<-[0..n-1]=[a|i<-l,j<-l,a<-[m!!i!!j],2>sum[1|u<-l,v<-l,(i-u)^2+(j-v)^2<4,gcd(m!!u!!v)a>1]]

Provalo online!

La funzione ?prende la matrice mcome un elenco di elenchi e le dimensioni della matrice n; restituisce l'elenco delle voci in ostilità .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.