... ou Toroidal Moore Quartiers
Compte tenu des nombres entiers positifs h
, w
et un entier non négatif i
, retournent tous les indices environnants i
.
Vous devez supposer une matrice composée de h
rangé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=4
et w=4
entraî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 i
c'é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
(oui <= h * w
pour les réponses indexées 1). - Vous pouvez supposer cela
i >= 0
(oui > 0
pour 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 code-golf 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!
Réponses:
JavaScript (ES6), 75 octets
Enregistré 2 octets grâce à @KevinCruijssen
Attend un index basé sur 0.
Essayez-le en ligne!
Les indices environnants sont renvoyés dans l'ordre suivant:
Comment?
Les indices de chaque cellule environnante en ( x + d x , y + d y ) sont donnés par:jeréx , dy ( x + dx , y+ dy)
où est l'indice de la cellule cible.N= w y+ 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 ] 1 réX
Pour les valeurs correspondantes de , nous utilisons la même liste décalée de 2 positions, ce qui donne:réy
la source
w*(~~(i/w+h+~-a[j+2&7])%h)
pour~~(a[j+2&7]-1+i/w+h)%h*w
enregistrer 2 octets en se débarrassant d'une paire de parenthèses.APL (Dyalog Classic) , 27 octets
Essayez-le en ligne!
{
}
est une fonction avec des arguments⍺
(les dimensionsh w
) et⍵
(l'indexi
)⍳3 3
est une matrice de tous les nombres ternaires à 2 chiffres:0 0
,0 1
, ...,2 2
,
enrôle la matrice comme vecteur1↓4⌽
supprime l'élément central1 1
en 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 moda
pour envelopper les coordonnées et rester dans la matrice⍺⊥
décode à partir de la base⍺
la source
APL (Dyalog Unicode) , 40 octets SBCS
Fonction d'infixation anonyme. Prend
h
w
comme argument de gauche eti
comme argument de droite.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-radixh
w
(cela nous donne les coordonnées de l'index)¯1+
ajouter un négatif à ces coordonnées⊖∘⍉/
réduire par rotation-transpositioncela équivaut à
y⊖⍉x⊖⍉
… qui est équivalent ày⊖x⌽
… qui tourne à gauche autant de pas quei
décalé vers la droite (moins un), et monte autant de pas quei
dé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 colonnesLes 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émentla source
{,(⍺⊥⍺|(⍺⊤⍵)-⊢)¨1-⍳3 3}
je ne sais pas si vous devez également supprimer l'élément central:{4⌽1↓4⌽
...}
[-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1]
Python 2 ,
796966 octetsEssayez-le en ligne!
3 octets offerts par Neil notant cela
(x*w)%(h*w)==((x)%h)*w==(x)%h*w
.Solution indexée 0.
la source
%h*w
économise plus de 3 octets*w%(h*w)
.R ,
125 111108 octetsEssayez-le en ligne!
14 et 8 octets golfés par @JayCe et @Mark.
L'entrée est
[w, h], i
due au fait que R remplit d'abord la colonne des tableaux.Rend le tableau puis "triple" le rang et la colonne. Ensuite, localisez
i
dans le tableau d'origine et trouvez son voisinage. Sortie sansi
.la source
seq()
par1:
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!
Pour l'exécuter:
Exemple:
Ou essayez-le en ligne!
la source
K (ngn / k) ,
2724 octetsEssayez-le en ligne!
{
}
est une fonction avec des argumentsx
(les dimensionsh w
) ety
(l'indexi
)(!9)^4
est0 1 2 3 4 5 6 7 8
sans4
3\
code en ternaire:(0 0;0 1;0 2;1 0;1 2;2 0;2 1;2 2)
1-
soustrait de1
, donnant des décalages voisins:(1 1;1 0;1 -1;0 1;0 -1;-1 1;-1 0;-1 -1)
x\y
est lex
codage de base dey
- les coordonnées dey
dans la matrice-
soustrait chaque décalage, nous donnant 8 paires de coordonnées voisinesx!''
est modx
pour chacun - enrouler les coordonnées pour rester dans la matricex/
décode à partir de la basex
- transforme des paires de coordonnées en entiers simplesla source
~
?⍨
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 çaMATL , 24 octets
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
i
et la sortie sont basées sur 1.Essayez-le en ligne! Ou vérifiez tous les cas de test .
Explication
la source
Wolfram Language (Mathematica) , 74 octets
Essayez-le en ligne!
Prend l'entrée en inverse (
i, w, h
), sur la base de 0.Matrice 3x3 avec la cellule centrale, (60 octets)
Prend (
w, h, i
), basé sur 1.Essayez-le en ligne!
la source
Lot, 105 octets
0 indexé. Sauvegardé 23 octets en volant l'astuce modulo 3 de @ ChasBrown.
la source
MATL, 24 octets
Essayez-le sur MATL Online
Prend des entrées
[w h]
eti
. 8 octets ont étévolés sans vergogne à partirde la réponse de Luis Mendos, bien que l'approche globale soit différente.la source
Nettoyer ,
8583 octetsEssayez-le en ligne!
Traite
i
comme une coordonnée(0 <= p < h, 0 <= q < w)
et génère les valeurs des éléments adjacents où se trouve la valeurp'w + q'
.la source
Gelée , 20 octets
Un lien dyadique acceptant une liste des dimensions à gauche,
[h,w]
et la cellule comme un entier à droitei
, 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?
la source
Attaché , 66 octets
Essayez-le en ligne!
J'ai encore besoin d'implémenter
Moores
etNMoore
, mais j'ai toujoursMoore
qui sert de fonction d'itération. Essentiellement,Integers@@__2
crée un tableau de forme entier__2
(les deux derniers arguments) des premiersProd[__2]
entiers. Cela nous donne le tableau cible. Ensuite,Moore
itère la fonction{Push[a,_]}
sur chaque voisinage de taille Moore1
(argument implicite), avec l'option de faire défiler chaque élément (cycle->1
). Cela ajoute chaque quartier au tableaua
. Ensuite,Flat[a@_]
aplatit le_
e membre dua
, 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):
la source
Kotlin , 88 octets
Utilise des index basés sur zéro et génère une liste de 8 éléments.
Essayez-le en ligne!
la source