Trova i vicini della cellula


20

... o quartieri di Toroidal Moore

Interi positivi trovati h, we un intero non negativo i, restituiscono tutti gli indici circostanti i.

Devi assumere una matrice composta da hfile di welementi, numerati dal più basso, nell'angolo in alto a sinistra, al più alto, nell'angolo in basso a destra, e restituire, in qualsiasi formato ragionevole, un elenco degli indici che circondare l'indice, i. Questa matrice è un toro (una mappa infinita che avvolge ogni bordo).

Ad esempio, input h=4e w=4, comporterebbero la matrice:

 0  1  2  3 
 4  5  6  7
 8  9 10 11
12 13 14 15

ma più specificamente:

15 12 13 14 15 12
 3  0  1  2  3  0
 7  4  5  6  7  4
11  8  9 10 11  8
15 12 13 14 15 12
 3  0  1  2  3  0

quindi, se lo ifosse 0, dovresti tornare 15, 12, 13, 3, 1, 7, 4, 5(basato su 0).

Esempi

0-based:

h   w   i       Expected result

4   4   5       0, 1, 2, 4, 6, 8, 9, 10
4   4   0       15, 12, 13, 3, 1, 7, 4, 5
4   5   1       15, 16, 17, 0, 2, 5, 6, 7
1   3   2       1, 2, 0, 1, 0, 1, 2, 0
1   1   0       0, 0, 0, 0, 0, 0, 0, 0

1-based:

h   w   i       Expected result

4   4   6       1, 2, 3, 5, 7, 9, 10, 11
4   4   1       16, 13, 14, 4, 2, 8, 5, 6
4   5   2       16, 17, 18, 1, 3, 6, 7, 8
1   3   3       2, 3, 1, 2, 1, 2, 3, 1
1   1   1       1, 1, 1, 1, 1, 1, 1, 1

Regole

  • La tua risposta può essere 0 o 1 indicizzata, a tua scelta, specifica.
  • Puoi presumere che i < h * w(o i <= h * wper risposte con 1 indice).
  • Puoi presumere che i >= 0(o i > 0per risposte con 1 indice).
  • L'ordine dei valori restituiti non è importante finché sono inclusi solo gli otto valori desiderati.
  • Sono vietate le scappatoie standard .
  • Questo è quindi la risposta più breve, in ogni lingua, vince!

Grazie a @Conor O'Brien per il titolo dal suono più tecnico e @ngm per altri casi di test!


3
Possiamo restituire una matrice 3 per 3 di vicini?
Adám,

@Adám Preferirei che l'elenco non includesse la cella centrale, se possibile. Ma apprezzare che ci sono già risposte. È abbastanza facile filtrarlo?
Dom Hastings,

L'ordine è importante?
Robert Fraser,

@RobertFraser L'ordine non è importante. Lo aggiungerò alle regole.
Dom Hastings,

@DomHastings interpreto quel commento come: non è permesso restituire una matrice 3 per 3 o includere la cella centrale?
JungHwan Min

Risposte:


8

JavaScript (ES6), 75 byte

Salvato 2 byte grazie a @KevinCruijssen

Si aspetta un indice basato su 0.

(h,w,i)=>[...'12221000'].map((k,j,a)=>(i+w+~-k)%w+~~(i/w+h+~-a[j+2&7])%h*w)

Provalo online!

Gli indici circostanti vengono restituiti nel seguente ordine:

54362701

Come?

Gli indici di ciascuna cella circostante in sono dati da: ( x + d x , y + d y )Idx,dy(x+dx,y+dy)

Idx,dy=((x+dx)modw)+w((y+dy)modh)=((N+dx)modw)+w((Nw+dy)modh)

dove è l'indice della cella target.N=wy+x

Camminiamo attraverso l'elenco e sottraggiamo per ottenere il valore di , che dà:1 d x[1,2,2,2,1,0,0,0]1dx

[0,1,1,1,0,1,1,1]

Per i corrispondenti valori di , utilizziamo lo stesso elenco spostato di 2 posizioni, che fornisce:dy

[1,1,0,1,1,1,0,1]

w*(~~(i/w+h+~-a[j+2&7])%h)per ~~(a[j+2&7]-1+i/w+h)%h*wsalvare 2 byte eliminando una coppia di parentesi.
Kevin Cruijssen,

@KevinCruijssen Bella cattura. Grazie!
Arnauld,

6

APL (Dyalog Classic) , 27 byte

{(⍺⊥⍺|(⍺⊤⍵)-⊢)¨1-14⌽,⍳3 3}

Provalo online!

{ }è una funzione con argomenti (le dimensioni h w) e (l'indice i)

⍳3 3è una matrice di tutti i numeri ternari 2 cifre: 0 0, 0 1, ...,2 2

, ravviva la matrice come un vettore

1↓4⌽rimuove l'elemento centrale 1 1ruotando 4 a sinistra ( 4⌽) e rilasciando uno ( 1↓)

1- sottrae da 1, dando a tutti e 8 gli offset vicini

( applica il treno di funzioni tra parentesi a ciascun offset

⍺⊤⍵è la codifica base di - le coordinate di nella matrice

(⍺⊤⍵)-⊢ sottrae l'offset corrente, fornendo le coordinate di un vicino

⍺|è mod aper avvolgere le coordinate e rimanere all'interno della matrice

⍺⊥ decodifica dalla base


5

APL (Dyalog Unicode) , SBCS da 40 byte

Funzione infix anonima. Prende h wcome argomento sinistro e icome argomento giusto.

{14⌽,3 3↑,⍨⍣2⍪⍨⍣2⊃⊖∘⍉/(¯1+⍺⊤⍵),⊂⍺⍴⍳×/⍺}

Provalo online!

{... } "dfn"; è argomento di sinistra (dimensioni) ed è argomento di destra (indice).

×/⍺ prodotto (moltiplicazione-riduzione) delle dimensioni

 il primo che molti indici

⍺⍴ utilizzare le dimensioni per r eshape che

 racchiuderlo (per trattarlo come un singolo elemento)

(... ), anteporre quanto segue:

  ⍺⊤⍵ codifica l'indice in mixed-radix h w(questo ci dà le coordinate dell'indice)

  ¯1+ aggiungi uno negativo a quelle coordinate

⊖∘⍉/ riduci ruotando-trasponi
  questo equivale a y⊖⍉x⊖⍉... che equivale a y⊖x⌽... che ruota a sinistra di quanti passi iè spostato a destra (meno uno) e ruota su quanti passi iè spostato verso il basso (meno uno), causando la matrice 3 per 3 che cerchiamo di essere nell'angolo in alto a sinistra

 rivelare (perché la riduzione ha ridotto il vettore a scalare racchiudendolo)

⍪⍨⍣2 impilare sopra se stesso due volte (abbiamo davvero bisogno tre volte per matrici a riga singola)

,⍨⍣2 aggiungere a se stesso due volte (abbiamo davvero bisogno di tre volte solo per le matrici a colonna singola)

3 3↑ prende le prime tre file delle prime tre colonne

I due passaggi successivi possono essere omessi se è accettabile la restituzione di una matrice 3 per 3:

, corvo (appiattire)

4⌽ ruota di quattro passi a sinistra (porta l'elemento centrale in primo piano)

1↓ rilascia il primo elemento


@Adám aggiustare quanto sopra e accorciarlo: {,(⍺⊥⍺|(⍺⊤⍵)-⊢)¨1-⍳3 3}non sono sicuro che si dovrebbe rimuovere anche l'elemento centrale: {4⌽1↓4⌽...}
ngn

@ngn Uh, è abbastanza originale. Lo pubblichi!
Adám,

@Adám ok
ngn,

Non credo che l'output dovrebbe contenere l'elemento centrale.
JungHwan Min,

1
L'ultimo caso di test ha ancora 8 elementi. Penso che l'output previsto sia quello di stampare i vicini in posizioni relative[-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1]
JungHwan Min

4

Python 2 , 79 69 66 byte

lambda h,w,i:[(i+q%3-1)%w+(i/w+q/3-1)%h*w for q in range(9)if q-4]

Provalo online!

3 byte donati da Neil notandolo (x*w)%(h*w)==((x)%h)*w==(x)%h*w.

Soluzione indicizzata 0.


%h*w salva 3 byte sopra *w%(h*w).
Neil,

4

R , 125 111 108 byte

function(x,i,m=array(1:prod(x),x),n=rbind(m,m,m),o=cbind(n,n,n),p=which(m==i,T)+x-1)o[p[1]+0:2,p[2]+0:2][-5]

Provalo online!

14 e 8 byte giocati da @JayCe e @Mark.

L'input è [w, h], idovuto al fatto che R popola prima la colonna degli array.

Rende l'array e quindi "triplica" per riga e colonna. Quindi individuare inella matrice originale e trovare il suo quartiere. Uscita senza i.


1
È possibile salvare 14 byte . Non sapevo quello che aveva un argomento arr.ind, ho imparato qualcosa oggi!
JayCe

È possibile salvare 8 byte sostituendo seq()con1:
Mark

3

PHP , 165 byte

Questo è "basato su 0". Ci deve essere una soluzione migliore in PHP, ma questo è un punto di partenza!

<?list(,$h,$w,$i)=$argv;for($r=-2;$r++<1;)for($c=-2;$c++<1;)$r||$c?print(($k=(int)($i/$w)+$r)<0?$h-1:($k>=$h?0:$k))*$w+(($l=$i%$w+$c)<0?$w-1:($l>=$w?0:$l))%$w.' ':0;

Per eseguirlo:

php -n <filename> <h> <w> <i>

Esempio:

php -n cell_neighbours.php 4 5 1

Oppure provalo online!


3

K (ngn / k) , 27 24 byte

{x/x!''(x\y)-1-3\(!9)^4}

Provalo online!

{ }è una funzione con argomenti x(le dimensioni h w) e y(l'indice i)

(!9)^4è 0 1 2 3 4 5 6 7 8senza il4

3\ codifica in ternario: (0 0;0 1;0 2;1 0;1 2;2 0;2 1;2 2)

1-sottrae 1, dando offset del vicino:(1 1;1 0;1 -1;0 1;0 -1;-1 1;-1 0;-1 -1)

x\yè la xcodifica base di y- le coordinate di ynella matrice

- sottrae ogni offset, dandoci 8 coppie di coordinate vicine

x!''è mod xper ciascuno - avvolgi le coordinate per rimanere all'interno della matrice

x/decodifica dalla base x: trasforma le coppie di coordinate in numeri interi singoli


Per curiosità, la tua variante di K ha un avverbio "argomenti inversi", come quello di J ~?
Conor O'Brien,

1
@ ConorO'Brien Nessuno dei k che conosco (Kx's K, Kona, oK e mine) ce l'ha, il che è un peccato per il golf. Esistono solo 6 avverbi incorporati: / \ '/: \:': e nessun meccanismo per tali definiti dall'utente.
ngn,

Ovviamente potrei aggiungere un avverbio selfie, ma il golf non è un fine in sé per ngn / k, solo un mezzo per accumulare casi di prova ed esperienza.
ngn,

È giusto. Certo, potresti vederlo come un potenziale difetto della lingua. Ho usato PPCG per aiutare a sviluppare Attache e ho capito che ad Attache mancavano alcune funzioni molto utili che altrimenti non avrei incluso. Non uso K, ma forse ci sono altri casi d'uso che possono giustificare quel tipo di avverbio?
Conor O'Brien,

@ ConorO'Brien ho familiarità con APL che è come ~in J e sono convinto della sua utilità, ma, vedi, k è limitato a ASCII stampabile e (quasi) nessun digraph, quindi, un nuovo avverbio significherebbe il sacrificio di qualche altra primitiva utile e una maggiore incompatibilità tra le implementazioni. Non vedo che cosa posso fare per metterlo dentro.
ngn

2

MATL , 24 byte

*:2Geti=&fh3Y6&fh2-+!Z{)

Gli ingressi sono h, w, i. L'output è un vettore riga o un vettore colonna con i numeri.

Input ie output sono basati su 1.

Provalo online! Oppure verifica tutti i casi di test .

Spiegazione

*     % Take two inputs implicitly. Multiply
      % STACK: 16
:     % Range
      % STACK: [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16]
2G    % Push second input again
      % STACK: [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16], 4
e     % Reshape with that number of rows, in column-major order
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16]
t     % Duplicate
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16],
      %        [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16]
i=    % Take third input and compare, element-wise
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16],
      %        [0 0 0 0; 0 1 0 0; 0 0 0 0; 0 0 0 0]
&f    % Row and column indices of nonzeros (1-based)
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16], 2, 2,
h     % Concatenate horizontally
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16], [2 2]
3Y6   % Push Moore mask
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16], [2 2],
      %        [1 1 1; 1 0 1; 1 1 1]
&f    % Row and column indices of nonzeros (1-based)
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16], [2 2],
      %        [1; 2; 3; 1; 3; 1; 2; 3], [1; 1; 1; 2; 2; 3; 3; 3] 
h     % Concatenate horizontally
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16], [2 2],
      %        [1 1; 2 1; 3 1; 1 2; 3 2; 1 3; 2 3; 3 3] 
2-    % Subtract 2, element-wise
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16], [2 2],
      %        [-1 -1; 0 -1; 1 -1; -1 0; -1 0; -1 1; 0 1; 1 1] 
+     % Add, element-wise with broadcast
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16],
      %        [1 1; 2 1; 3 1; 1 2; 3 2; 1 3; 2 3; 3 3]
!     % Transpose
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16],
      %        [1 2 3 1 3 1 2 3; 1 1 1 2 2 3 3 3]
Z{    % Convert into a cell array of rows
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16],
      %        {[1 2 3 1 3 1 2 3], [1 1 1 2 2 3 3 3]}
)     % Index. A cell array acts as an element-wise (linear-like) index
      % STACK: [1 2 3 5 7 9 10 11]


2

Lotto, 105 byte

@for /l %%c in (0,1,8)do @if %%c neq 4 cmd/cset/a(%3/%2+%1+%%c/3-1)%%%1*%2+(%3%%%2+%2+%%c%%3-1)%%%2&echo.

0-indicizzati. Hai salvato 23 byte rubando il trucco modulo 3 di ChasBrown.



1

Pulito , 85 83 byte

import StdEnv
r=(rem)
$h w i=tl[r(n+i/w)h*w+r(r(m+i)w)w\\n<-[0,1,h-1],m<-[0,1,w-1]]

Provalo online!

Tratta icome una coordinata (0 <= p < h, 0 <= q < w)e genera i valori degli elementi adiacenti dove si trova il valore p'w + q'.


1

Gelatina , 20 byte

PRs©Ṫ{œi+€Ø-Ż¤ŒpḊœị®

Un collegamento diadico che accetta un elenco delle dimensioni a sinistra [h,w]e la cella come numero intero a destra i, che fornisce un elenco del vicinato.

Nota: l'ordine è diverso da quello degli esempi consentiti nel PO

Provalo online!

Come?

PRs©Ṫ{œi+€Ø-Ż¤ŒpḊœị® - Link: [h,w], i
P                    - product -> h*w
 R                   - range -> [1,2,3,...,h*w]
    Ṫ{               - tail of left -> w
  s                  - split into chunks -> [[1,2,3,...w],[w+1,...,2*w],[(h-1)*w+1,...,h*w]]
   ©                 - ...and copy that result to the register
      œi             - multi-dimensional index of (i) in that list of lists, say [r,c]
             ¤       - nilad followed by link(s) as a nilad:
          Ø-         -   literal list -> [-1,1]
            Ż        -   prepend a zero -> [0,-1,1]
        +€           - addition (vectorises) for €ach -> [[r,r-1,r+1],[c,c-1,c+1]]
              Œp     - Cartesian product -> [[r,c],[r,c-1],[r,c+1],[r-1,c],[r-1,c-1],[r-1,c+1],[r+1,c],[r+1,c-1],[r+1,c+1]]
                Ḋ    - dequeue -> [[r,c-1],[r,c+1],[r-1,c],[r-1,c-1],[r-1,c+1],[r+1,c],[r+1,c-1],[r+1,c+1]]
                   ® - recall (the table) from the register
                 œị  - multi-dimensional index into (1-indexed & modular)

1

Attache , 66 byte

{a.=[]Moore[Integers@@__2,{Push[a,_]},cycle->1]Flat[a@_][0:3'5:8]}

Provalo online!

Ho ancora bisogno di implementare Moorese NMoore, ma ho ancora Mooreche funge da funzione di iterazione. In sostanza, Integers@@__2crea un array intero di forma __2(gli ultimi due argomenti) dei primi Prod[__2]numeri interi. Questo ci dà l'array target. Quindi, Mooreitera la funzione {Push[a,_]}su ogni vicinato di Moore di dimensioni 1(argomento implicito), con l'opzione di ciclo di ciascun elemento ( cycle->1). Questo aggiunge ogni quartiere alla matrice a. Quindi, Flat[a@_]appiattisce il _terzo membro a, cioè il quartiere di Moore incentrato _(il primo argomento). [0:3'5:8]ottiene tutti i membri tranne il centro da questo array appiattito.

Questa soluzione, con un aggiornamento della lingua, sarebbe simile a questa (49 byte):

{Flat[NMoore[Integers@@__2,_,cycle->1]][0:3'5:8]}

1

Kotlin , 88 byte

Utilizza indici a base zero e genera un elenco di 8 elementi.

{h:Int,w:Int,i:Int->List(9){(w+i+it%3-1)%w+(h+i/w+it/3-1)%h*w}.filterIndexed{i,v->i!=4}}

Provalo online!

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.