Trouvez les voisins de la cellule

20

... ou Toroidal Moore Quartiers

Compte tenu des nombres entiers positifs h, wet un entier non négatif i, retournent tous les indices environnants i.

Vous devez supposer une matrice composée de hrangées d' wéléments, numérotées du plus bas, dans le coin supérieur gauche, au plus haut, dans le coin inférieur droit, et renvoyer, dans un format raisonnable, une liste des indices qui entourer l'indice, i. Cette matrice est un tore (une carte infinie qui s'enroule autour de chaque bord).

Par exemple, les entrées h=4et w=4entraîneraient la matrice:

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

mais plus précisément:

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

de sorte que si ic'était le cas 0, vous auriez besoin de revenir 15, 12, 13, 3, 1, 7, 4, 5(sur la base de 0).

Exemples

Basé sur 0:

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 basé:

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

Règles

  • Votre réponse peut être indexée 0 ou 1, votre choix, veuillez préciser.
  • Vous pouvez supposer cela i < h * w(ou i <= h * wpour les réponses indexées 1).
  • Vous pouvez supposer cela i >= 0(ou i > 0pour les réponses indexées 1).
  • L'ordre des valeurs renvoyées n'est pas important tant que seules les huit valeurs souhaitées sont incluses.
  • Les failles standard sont interdites .
  • C'est le donc la réponse la plus courte, dans chaque langue, gagne!

Merci à @Conor O'Brien pour le titre à consonance plus technique et @ngm pour plus de cas de test!

Dom Hastings
la source
3
Pouvons-nous renvoyer une matrice de voisins 3 par 3?
Adám
@ Adám Je préférerais que la liste n'inclue pas la cellule centrale si possible. Mais sachez qu'il existe déjà des réponses. Est-il assez facile de filtrer cela?
Dom Hastings
La commande est-elle importante?
Robert Fraser
L'ordre @RobertFraser n'est pas important. J'ajouterai cela aux règles.
Dom Hastings
@DomHastings J'interprète ce commentaire comme: il n'est pas permis de renvoyer une matrice 3 x 3 ou d'inclure la cellule centrale?
JungHwan Min

Réponses:

8

JavaScript (ES6), 75 octets

Enregistré 2 octets grâce à @KevinCruijssen

Attend un index basé sur 0.

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

Essayez-le en ligne!

Les indices environnants sont renvoyés dans l'ordre suivant:

54362sept01

Comment?

Les indices de chaque cellule environnante en ( x + d x , y + d y ) sont donnés par:jeX,y(X+X,y+y)

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

où est l'indice de la cellule cible.N=wy+X

Nous la liste et soustrayons pour obtenir la valeur de , ce qui donne:1 d x[1,2,2,2,1,0,0,0]1X

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

Pour les valeurs correspondantes de , nous utilisons la même liste décalée de 2 positions, ce qui donne:y

[1,1,0,-1,-1,-1,0,1]
Arnauld
la source
w*(~~(i/w+h+~-a[j+2&7])%h)pour ~~(a[j+2&7]-1+i/w+h)%h*wenregistrer 2 octets en se débarrassant d'une paire de parenthèses.
Kevin Cruijssen
@KevinCruijssen Belle prise. Merci!
Arnauld
6

APL (Dyalog Classic) , 27 octets

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

Essayez-le en ligne!

{ }est une fonction avec des arguments (les dimensions h w) et (l'index i)

⍳3 3est une matrice de tous les nombres ternaires à 2 chiffres: 0 0, 0 1, ...,2 2

, enrôle la matrice comme vecteur

1↓4⌽supprime l'élément central 1 1en tournant 4 vers la gauche ( 4⌽) et en déposant un ( 1↓)

1- soustrait de 1, donnant aux 8 voisins des décalages

( applique le train de fonctions entre parenthèses à chaque décalage

⍺⊤⍵est le codage de base de - les coordonnées de dans la matrice

(⍺⊤⍵)-⊢ soustrait le décalage actuel, donnant les coordonnées d'un voisin

⍺|est un mod apour envelopper les coordonnées et rester dans la matrice

⍺⊥ décode à partir de la base

ngn
la source
5

APL (Dyalog Unicode) , 40 octets SBCS

Fonction d'infixation anonyme. Prend h wcomme argument de gauche et icomme argument de droite.

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

Essayez-le en ligne!

{} "Dfn"; est l'argument gauche (dimensions) et l' argument droit (index).

×/⍺ produit (multiplication-réduction) des dimensions

 le premier que de nombreux indices

⍺⍴ utiliser les dimensions de r Eshape que

 l'enfermer (pour le traiter comme un seul élément)

(), Ajoutez ce qui suit:

  ⍺⊤⍵ encoder l'index en mixte-radix h w(cela nous donne les coordonnées de l'index)

  ¯1+ ajouter un négatif à ces coordonnées

⊖∘⍉/ réduire par rotation-transposition
  cela équivaut à y⊖⍉x⊖⍉… qui est équivalent à y⊖x⌽… qui tourne à gauche autant de pas que idécalé vers la droite (moins un), et monte autant de pas que idécalé vers le bas (moins un), provoquant la matrice 3 par 3 que nous cherchons à être dans le coin supérieur gauche

 divulguer (parce que la réduction a réduit le vecteur en scalaire en entourant)

⍪⍨⍣2 empiler deux fois sur lui-même (nous n'avons vraiment besoin que de trois fois pour les matrices à une rangée)

,⍨⍣2 s'ajouter deux fois à lui-même (nous n'avons vraiment besoin que de trois fois pour les matrices à colonne unique)

3 3↑ prendre les trois premières lignes des trois premières colonnes

Les deux étapes suivantes peuvent être omises si le retour d'une matrice 3 par 3 est acceptable:

, défiler (aplatir)

4⌽ faire pivoter de quatre pas vers la gauche (amène l'élément central vers l'avant)

1↓ déposer le premier élément

Adam
la source
@ Adám corrige ce qui précède et le raccourcit:, {,(⍺⊥⍺|(⍺⊤⍵)-⊢)¨1-⍳3 3}je ne sais pas si vous devez également supprimer l'élément central: {4⌽1↓4⌽...}
ngn
@ngn Euh, c'est assez original. Vous postez ça!
Adám
@ Adám ok
ngn
Je ne pense pas que la sortie devrait contenir l'élément central.
JungHwan Min
1
Le dernier cas de test comporte toujours 8 éléments. Je pense que la sortie prévue est d'imprimer les voisins à des positions relatives[-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1]
JungHwan Min
4

Python 2 , 79 69 66 octets

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

Essayez-le en ligne!

3 octets offerts par Neil notant cela (x*w)%(h*w)==((x)%h)*w==(x)%h*w.

Solution indexée 0.

Chas Brown
la source
%h*w économise plus de 3 octets *w%(h*w).
Neil
4

R , 125 111 108 octets

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]

Essayez-le en ligne!

14 et 8 octets golfés par @JayCe et @Mark.

L'entrée est [w, h], idue au fait que R remplit d'abord la colonne des tableaux.

Rend le tableau puis "triple" le rang et la colonne. Ensuite, localisez idans le tableau d'origine et trouvez son voisinage. Sortie sans i.

ngm
la source
1
Vous pouvez enregistrer 14 octets . Je ne savais pas ce qui avait un argument arr.ind, appris quelque chose aujourd'hui!
JayCe
Vous pouvez économiser 8 octets en remplaçant seq()par1:
Mark
3

PHP , 165 octets

C'est "basé sur 0". Il doit y avoir une meilleure solution en PHP, mais c'est un point de départ!

<?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;

Pour l'exécuter:

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

Exemple:

php -n cell_neighbours.php 4 5 1

Ou essayez-le en ligne!

Nuit2
la source
3

K (ngn / k) , 27 24 octets

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

Essayez-le en ligne!

{ }est une fonction avec des arguments x(les dimensions h w) et y(l'index i)

(!9)^4est 0 1 2 3 4 5 6 7 8sans4

3\ code en ternaire: (0 0;0 1;0 2;1 0;1 2;2 0;2 1;2 2)

1-soustrait de 1, donnant des décalages voisins:(1 1;1 0;1 -1;0 1;0 -1;-1 1;-1 0;-1 -1)

x\yest le xcodage de base de y- les coordonnées de ydans la matrice

- soustrait chaque décalage, nous donnant 8 paires de coordonnées voisines

x!''est mod xpour chacun - enrouler les coordonnées pour rester dans la matrice

x/décode à partir de la base x- transforme des paires de coordonnées en entiers simples

ngn
la source
Par curiosité, votre variante de K a-t-elle un adverbe "arguments inverses", comme celui de J ~?
Conor O'Brien
1
@ ConorO'Brien Aucun des ks que je connais (Kx's K, Kona, oK et le mien) n'en a, ce qui est malheureux pour le golf. Il n'y a que 6 adverbes intégrés: / \ '/: \:': et aucun mécanisme pour les définir par l'utilisateur.
ngn
Bien sûr, je pourrais ajouter un adverbe selfie, mais le golf n'est pas une fin en soi pour ngn / k, seulement un moyen d'accumuler des cas de test et de l'expérience.
ngn
C'est juste. Bien sûr, vous pouvez le voir comme une lacune potentielle de la langue. J'ai utilisé PPCG pour aider à développer Attache, et j'ai réalisé qu'il manquait à Attache des fonctions très utiles que je n'aurais pas incluses autrement. Je n'utilise pas K, mais peut-être y a-t-il d'autres cas d'utilisation qui peuvent justifier ce type d'adverbe?
Conor O'Brien
@ ConorO'Brien que je connais dans APL qui est comme ~dans J et je suis convaincu de son utilité, mais, vous voyez, k est limité à ASCII imprimable et (presque) pas de digraphes, donc, un nouvel adverbe signifierait le sacrifice d'une autre primitive utile ainsi qu'une incompatibilité accrue entre les implémentations. Je ne vois pas ce que je peux faire pour mettre ça
dedans
2

MATL , 24 octets

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

Les entrées sont h, w, i. La sortie est un vecteur de ligne ou un vecteur de colonne avec les nombres.

L'entrée iet la sortie sont basées sur 1.

Essayez-le en ligne! Ou vérifiez tous les cas de test .

Explication

*     % 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]
Luis Mendo
la source
2

Lot, 105 octets

@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 indexé. Sauvegardé 23 octets en volant l'astuce modulo 3 de @ ChasBrown.

Neil
la source
2

MATL, 24 octets

X[h3Y6&fh2-+1GX\1Gw!Z}X]

Essayez-le sur MATL Online

Prend des entrées [w h]et i. 8 octets ont été volés sans vergogne à partir de la réponse de Luis Mendos, bien que l'approche globale soit différente.

Sundar - Rétablir Monica
la source
1

Nettoyer , 85 83 octets

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

Essayez-le en ligne!

Traite icomme une coordonnée (0 <= p < h, 0 <= q < w)et génère les valeurs des éléments adjacents où se trouve la valeur p'w + q'.

Οurous
la source
1

Gelée , 20 octets

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

Un lien dyadique acceptant une liste des dimensions à gauche, [h,w]et la cellule comme un entier à droite i, ce qui donne une liste du voisinage.

Remarque: l'ordre est différent de celui des exemples autorisé dans l'OP

Essayez-le en ligne!

Comment?

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)
Jonathan Allan
la source
1

Attaché , 66 octets

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

Essayez-le en ligne!

J'ai encore besoin d'implémenter Mooreset NMoore, mais j'ai toujours Moorequi sert de fonction d'itération. Essentiellement, Integers@@__2crée un tableau de forme entier __2(les deux derniers arguments) des premiers Prod[__2]entiers. Cela nous donne le tableau cible. Ensuite, Mooreitère la fonction {Push[a,_]}sur chaque voisinage de taille Moore 1(argument implicite), avec l'option de faire défiler chaque élément ( cycle->1). Cela ajoute chaque quartier au tableau a. Ensuite, Flat[a@_]aplatit le _e membre du a, c'est-à-dire le quartier de Moore centré autour _(le premier argument). [0:3'5:8]obtient tous les membres sauf le centre de ce tableau aplati.

Cette solution, avec une mise à jour de la langue, ressemblerait à ceci (49 octets):

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

Kotlin , 88 octets

Utilise des index basés sur zéro et génère une liste de 8 éléments.

{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}}

Essayez-le en ligne!

JohnWells
la source