... o vecindarios de Toroidal Moore
Enteros positivos Dadas h
, w
y un número entero no negativo i
, devolver todos los índices de los alrededores i
.
Debe asumir una matriz que consiste en h
filas de w
elementos, numerados desde el más bajo, en la esquina superior izquierda, hasta el más alto, en la esquina inferior derecha, y devolver, en cualquier formato razonable, una lista de los índices que rodear el índice, i
. Esta matriz es un toro (un mapa infinito que se envuelve alrededor de cada borde).
Por ejemplo, las entradas h=4
y w=4
, darían como resultado la matriz:
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
pero más específicamente:
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
así que si i
fuera así 0
, necesitaría regresar 15, 12, 13, 3, 1, 7, 4, 5
(basado en 0).
Ejemplos
Basado en 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
Basado en 1:
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
Reglas
- Su respuesta puede ser 0 o 1 indexada, su elección, por favor especifique.
- Puede suponer eso
i < h * w
(oi <= h * w
para respuestas indexadas 1). - Puede suponer eso
i >= 0
(oi > 0
para respuestas indexadas 1). - El orden de los valores devueltos no es importante siempre que se incluyan solo los ocho valores deseados.
- Las lagunas estándar están prohibidas .
- Este es el código de golf, por lo que la respuesta más corta, en cada idioma, ¡gana!
¡Gracias a @Conor O'Brien por el título más técnico y a @ngm por más casos de prueba!
Respuestas:
JavaScript (ES6), 75 bytes
Guardado 2 bytes gracias a @KevinCruijssen
Espera un índice basado en 0.
Pruébalo en línea!
Los índices circundantes se devuelven en el siguiente orden:
¿Cómo?
Los índices de cada celda circundante en ( x + d x , y + d y ) están dados por:Idx,dy ( x+dX,y+dy)
donde es el índice de la celda objetivo.norte= w y+ x
Recorremos la lista y restamos 1 para obtener el valor de d x , que da:[ 1 , 2 , 2 , 2 , 1 , 0 , 0 , 0 ] 1 reX
Para los valores correspondientes de , usamos la misma lista desplazada por 2 posiciones, que da:rey
fuente
w*(~~(i/w+h+~-a[j+2&7])%h)
que~~(a[j+2&7]-1+i/w+h)%h*w
ahorra 2 bytes por deshacerse de un par de paréntesis.APL (Dyalog Classic) , 27 bytes
Pruébalo en línea!
{
}
es una función con argumentos⍺
(las dimensionesh w
) y⍵
(el índicei
)⍳3 3
es una matriz de todos los números ternarios de 2 dígitos:0 0
,0 1
, ...,2 2
,
alista la matriz como un vector1↓4⌽
elimina el elemento central1 1
girando 4 hacia la izquierda (4⌽
) y soltando uno (1↓
)1-
resta de 1, dando las 8 compensaciones vecinas(
)¨
aplica el tren de funciones entre paréntesis a cada desplazamiento⍺⊤⍵
es la⍺
codificación base de⍵
- las coordenadas de⍵
en la matriz(⍺⊤⍵)-⊢
resta el desplazamiento actual, dando las coordenadas de un vecino⍺|
es moda
para envolver coordenadas y permanecer dentro de la matriz⍺⊥
decodifica desde la base⍺
fuente
APL (Dyalog Unicode) , SBCS de 40 bytes
Función de infijo anónimo. Toma
h
w
como argumento izquierdo yi
como argumento derecho.Pruébalo en línea!
{
...}
"dfn";⍺
es argumento izquierdo (dimensiones) y⍵
argumento derecho (índice).×/⍺
producto (multiplicación-reducción) de las dimensiones⍳
el primero que muchos índices⍺⍴
utilizar las dimensiones a r eshape que⊂
encerrarlo (para tratarlo como un elemento único)(
...),
anteponer lo siguiente:⍺⊤⍵
codificar el índice en mezcla mixtah
w
(esto nos da las coordenadas del índice)¯1+
agregue uno negativo a esas coordenadas⊖∘⍉/
reduzca rotando-la-transposiciónesto es equivalente a
y⊖⍉x⊖⍉
... que es equivalente ay⊖x⌽
... que gira a la izquierda tantos pasos comoi
se desplaza a la derecha (menos uno), y gira hacia arriba tantos pasos comoi
se compensa hacia abajo (menos uno), causando la matriz de 3 por 3 buscamos estar en la esquina superior izquierda⊃
revelar (porque la reducción redujo el vector a escalar al encerrar)⍪⍨⍣2
apilar dos veces sobre sí mismo (solo necesitamos tres veces para matrices de una sola fila),⍨⍣2
agregarse a sí mismo dos veces (solo necesitamos tres veces para matrices de una sola columna)3 3↑
tomar las primeras tres filas de las primeras tres columnasLos siguientes dos pasos se pueden omitir si es aceptable devolver una matriz de 3 por 3:
,
ravel (aplanar)4⌽
gire cuatro pasos hacia la izquierda (lleva el elemento central al frente)1↓
soltar el primer elementofuente
{,(⍺⊥⍺|(⍺⊤⍵)-⊢)¨1-⍳3 3}
no estoy seguro de si también debes eliminar el elemento del medio:{4⌽1↓4⌽
...}
[-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1]
Python 2 ,
796966 bytesPruébalo en línea!
3 bytes dotados por Neil señalando eso
(x*w)%(h*w)==((x)%h)*w==(x)%h*w
.Solución indexada 0.
fuente
%h*w
ahorra 3 bytes más*w%(h*w)
.R ,
125 111108 bytesPruébalo en línea!
14 y 8 bytes jugados por @JayCe y @Mark.
La entrada se
[w, h], i
debe a que R llena primero la columna de matrices.Hace la matriz y luego la "triplica" en forma de fila y columna. Luego, ubíquese
i
en la matriz original y encuentre su vecindario. Salida sini
.fuente
seq()
con1:
PHP , 165 bytes
Esto es "basado en 0". Debe haber una mejor solución en PHP, ¡pero este es un punto de partida!
Para ejecutarlo:
Ejemplo:
O Pruébelo en línea!
fuente
K (ngn / k) ,
2724 bytesPruébalo en línea!
{
}
es una función con argumentosx
(las dimensionesh w
) yy
(el índicei
)(!9)^4
es0 1 2 3 4 5 6 7 8
sin el4
3\
codifica en ternario:(0 0;0 1;0 2;1 0;1 2;2 0;2 1;2 2)
1-
resta de1
, dando compensaciones vecinas:(1 1;1 0;1 -1;0 1;0 -1;-1 1;-1 0;-1 -1)
x\y
es lax
codificación base dey
- las coordenadas dey
en la matriz-
resta cada desplazamiento, dándonos 8 pares de coordenadas vecinasx!''
es modx
para cada uno: ajusta las coordenadas para permanecer dentro de la matrizx/
decodifica desde la basex
: convierte pares de coordenadas en enteros únicosfuente
~
?⍨
en APL, que es como~
en J, y estoy convencido de su utilidad, pero, como puede ver, k está limitado a ASCII imprimible y (casi) sin dígrafos, por lo que un nuevo adverbio significaría el sacrificio de alguna otra primitiva útil, así como más incompatibilidad entre implementaciones. No veo todo lo que pueda para poner esto.MATL , 24 bytes
Las entradas son
h
,w
,i
. La salida es un vector de fila o de columna con los números.La entrada
i
y la salida están basadas en 1.Pruébalo en línea! O verificar todos los casos de prueba .
Explicación
fuente
Wolfram Language (Mathematica) , 74 bytes
Pruébalo en línea!
Toma entrada en reversa (
i, w, h
), basada en 0.Matriz 3x3 con la celda central en ella, (60 bytes)
Toma (
w, h, i
), basado en 1.Pruébalo en línea!
fuente
Lote, 105 bytes
0 indexado. Ahorró 23 bytes al robar el truco del módulo 3 de @ ChasBrown.
fuente
MATL, 24 bytes
Pruébalo en MATL Online
Toma entradas
[w h]
yi
. 8 bytes de esto fueronrobados descaradamente de lainspiración de la respuesta de Luis Mendos, aunque el enfoque general es diferente.fuente
Limpio ,
8583 bytesPruébalo en línea!
Se trata
i
como una coordenada(0 <= p < h, 0 <= q < w)
y genera los valores de los elementos adyacentes donde está el valorp'w + q'
.fuente
Jalea , 20 bytes
Un enlace diádico que acepta una lista de las dimensiones a la izquierda
[h,w]
, y la celda como un entero a la derecha,i
, que produce una lista del vecindario.Nota: el orden es diferente al de los ejemplos que está permitido en el OP
Pruébalo en línea!
¿Cómo?
fuente
Adjunto , 66 bytes
Pruébalo en línea!
Todavía necesito implementar
Moores
yNMoore
, pero todavía tengo elMoore
que sirve como una función de iteración. Esencialmente,Integers@@__2
crea una matriz de forma entera__2
(los dos últimos argumentos) de los primerosProd[__2]
enteros. Esto nos da la matriz de destino. Luego,Moore
itera la función{Push[a,_]}
sobre cada vecindario de tamaño de Moore1
(argumento implícito), con la opción de alternar cada elemento (cycle->1
). Esto agrega cada vecindario a la matriza
. Luego,Flat[a@_]
aplana el_
miembro th dea
, es decir, el vecindario de Moore centrado alrededor_
(el primer argumento).[0:3'5:8]
obtiene todos los miembros excepto el centro de esta matriz aplanada.Esta solución, con una actualización del idioma, se vería así (49 bytes):
fuente
Kotlin , 88 bytes
Utiliza índices basados en cero y genera una lista de 8 elementos.
Pruébalo en línea!
fuente