... ou Bairros Toroidal Moore
Inteiros positivos dadas h
, w
e um número inteiro não negativo i
, voltar todos os índices circundantes i
.
Você deve assumir uma matriz composta por h
linhas de w
elementos, numeradas do mais baixo, no canto superior esquerdo, ao mais alto, no canto inferior direito, e retornar, em qualquer formato razoável, uma lista dos índices que rodeie o índice i
. Essa matriz é um toro (um mapa infinito que envolve cada borda).
Por exemplo, entradas h=4
e w=4
, resultariam na matriz:
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
mas mais especificamente:
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 modo que, se i
fosse 0
, seria necessário retornar 15, 12, 13, 3, 1, 7, 4, 5
(com base em 0).
Exemplos
Baseado em 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
Baseado em 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
Regras
- Sua resposta pode ser indexada em 0 ou 1, sua escolha, por favor especifique.
- Você pode assumir isso
i < h * w
(oui <= h * w
para respostas indexadas em 1). - Você pode assumir isso
i >= 0
(oui > 0
para respostas indexadas em 1). - A ordem dos valores retornados não é importante desde que apenas os oito valores desejados sejam incluídos.
- As brechas padrão são proibidas .
- Isso é código-golfe, então a resposta mais curta, em cada idioma, vence!
Agradecemos a @Conor O'Brien pelo título mais técnico e o @ngm por mais casos de teste!
Respostas:
JavaScript (ES6), 75 bytes
Guardado 2 bytes graças a @KevinCruijssen
Espera um índice baseado em 0.
Experimente online!
Os índices circundantes são retornados na seguinte ordem:
Quão?
Os índicesIdx,dy de cada célula circundante em (x+dx,y+dy) são dados por:
onde é o índice da célula de destino.N=wy+x
Percorremos a lista e para obter o valor de , que fornece:[1,2,2,2,1,0,0,0] 1 dx
Para os valores correspondentes de , usamos a mesma lista deslocada em 2 posições, o que fornece:dy
fonte
w*(~~(i/w+h+~-a[j+2&7])%h)
a~~(a[j+2&7]-1+i/w+h)%h*w
salva 2 bytes por se livrar de um par de parênteses.APL (Dyalog Classic) , 27 bytes
Experimente online!
{
}
é uma função com argumentos⍺
(as dimensõesh w
) e⍵
(o índicei
)⍳3 3
é uma matriz de todos os números ternários de 2 dígitos:0 0
,0 1
, ...,2 2
,
inscreve a matriz como um vetor1↓4⌽
remove o elemento central1 1
girando 4 para a esquerda (4⌽
) e soltando um (1↓
)1-
subtrai de 1, dando todas as 8 compensações vizinhas(
)¨
aplica o trem de função entre parênteses a cada deslocamento⍺⊤⍵
é a⍺
codificação base de⍵
- as coordenadas de⍵
na matriz(⍺⊤⍵)-⊢
subtrai o deslocamento atual, fornecendo as coordenadas de um vizinho⍺|
é moda
para envolver as coordenadas e permanecer dentro da matriz⍺⊥
decodifica a partir da base⍺
fonte
APL (Dyalog Unicode) , SBCS de 40 bytes
Função de infixo anônimo. Toma
h
w
como argumento à esquerda ei
como argumento à direita.Experimente online!
{
...}
"dfn";⍺
é argumento à esquerda (dimensões) e⍵
é argumento à direita (índice).×/⍺
produto (redução-multiplicação) das dimensões⍳
o primeiro que muitos índices⍺⍴
utilizar as dimensões de r eshape que⊂
coloque-o (para tratá-lo como um único elemento)(
…),
Acrescente o seguinte:⍺⊤⍵
codificar o índice em base mistah
w
(isso nos fornece as coordenadas do índice)¯1+
adicione um negativo a essas coordenadas⊖∘⍉/
reduzir girando a transposiçãoé equivalente a
y⊖⍉x⊖⍉
... o que equivale ay⊖x⌽
... que gira para a esquerda quantas etapasi
é deslocada para a direita (menos uma) e gira para cima quantas etapasi
é deslocada para baixo (menos uma), causando a matriz 3 por 3, procuramos estar no canto superior esquerdo⊃
divulgar (porque a redução reduziu o vetor a escalar ao encerrar)⍪⍨⍣2
empilhar duas vezes em cima de si mesmo (só precisamos realmente três vezes para matrizes de linha única),⍨⍣2
anexar a si mesmo duas vezes (precisamos apenas três vezes para matrizes de coluna única)3 3↑
pegue as três primeiras linhas das três primeiras colunasAs próximas duas etapas podem ser omitidas se o retorno de uma matriz 3 por 3 for aceitável:
,
ravel (achatar)4⌽
gire quatro etapas para a esquerda (traz o elemento central para a frente)1↓
solte o primeiro elementofonte
{,(⍺⊥⍺|(⍺⊤⍵)-⊢)¨1-⍳3 3}
, eu não tenho certeza se você também deve remover o elemento do meio:{4⌽1↓4⌽
...}
[-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1]
Python 2 ,
796966 bytesExperimente online!
3 bytes dados por Neil notando isso
(x*w)%(h*w)==((x)%h)*w==(x)%h*w
.Solução 0 indexada.
fonte
%h*w
economiza 3 bytes acima*w%(h*w)
.R ,
125 111108 bytesExperimente online!
14 e 8 bytes jogados por @JayCe e @Mark.
A entrada ocorre
[w, h], i
porque R preenche a coluna de matrizes primeiro.Cria a matriz e, em seguida, "triplica" a linha e a coluna. Em seguida, localize
i
na matriz original e encontre a vizinhança. Saída semi
.fonte
seq()
por #1:
PHP , 165 bytes
Isso é "baseado em 0". Deve haver uma solução melhor em PHP, mas este é um ponto de partida!
Para executá-lo:
Exemplo:
Ou Experimente online!
fonte
K (ngn / k) ,
2724 bytesExperimente online!
{
}
é uma função com argumentosx
(as dimensõesh w
) ey
(o índicei
)(!9)^4
está0 1 2 3 4 5 6 7 8
sem o4
3\
codifica em ternário:(0 0;0 1;0 2;1 0;1 2;2 0;2 1;2 2)
1-
subtrai de1
, fornecendo compensações vizinhas:(1 1;1 0;1 -1;0 1;0 -1;-1 1;-1 0;-1 -1)
x\y
é ax
codificação base dey
- as coordenadas dey
na matriz-
subtrai cada deslocamento, dando-nos 8 pares de coordenadas vizinhasx!''
é modx
para cada um - agrupa as coordenadas para permanecer na matrizx/
decodifica da basex
- transforma pares de coordenadas em números inteiros únicosfonte
~
?⍨
APL, que é como~
J, e estou convencido de sua utilidade, mas, veja bem, k é limitado a ASCII imprimível e (quase) sem dígrafos, portanto, um novo advérbio significaria o sacrifício de alguma outra primitiva útil, bem como mais incompatibilidade entre implementações. Não vejo o que posso fazer para colocar isso em questão.MATL , 24 bytes
As entradas são
h
,w
,i
. A saída é um vetor de linha ou vetor de coluna com os números.Entrada
i
e saída são baseadas em 1.Experimente online! Ou verifique todos os casos de teste .
Explicação
fonte
Wolfram Language (Mathematica) , 74 bytes
Experimente online!
Leva a entrada em reverso (
i, w, h
), com base em 0.Matriz 3x3 com a célula central, (60 bytes)
Toma (
w, h, i
), com base em 1.Experimente online!
fonte
Lote, 105 bytes
Indexado a 0. Economizou 23 bytes roubando o truque do módulo 3 de ChasBrown.
fonte
MATL, 24 bytes
Experimente no MATL Online
Toma entradas
[w h]
ei
. 8 bytes disso foramdescaradamente roubados,inspirados na resposta de Luis Mendos, embora a abordagem geral seja diferente.fonte
Limpo ,
8583 bytesExperimente online!
Trata
i
como uma coordenada(0 <= p < h, 0 <= q < w)
e gera os valores dos elementos adjacentes onde está o valorp'w + q'
.fonte
Gelatina , 20 bytes
Um link diádico que aceita uma lista das dimensões à esquerda
[h,w]
e a célula como um número inteiro à direitai
, o que gera uma lista da vizinhança.Nota: a ordem é diferente da dos exemplos permitidos no OP
Experimente online!
Quão?
fonte
Anexo , 66 bytes
Experimente online!
Ainda preciso implementar
Moores
eNMoore
, mas ainda tenho oMoore
que serve como uma função de iteração. Essencialmente,Integers@@__2
cria uma matriz inteira de forma__2
(os dois últimos argumentos) dos primeirosProd[__2]
inteiros. Isso nos dá a matriz de destino. Em seguida,Moore
itera a função{Push[a,_]}
sobre cada vizinhança de Moore de tamanho1
(argumento implícito), com a opção de alternar cada elemento (cycle->1
). Isso adiciona cada vizinhança à matriza
. Então,Flat[a@_]
aplaina o_
membro tha
, ou seja, o bairro de Moore centrado em torno_
(o primeiro argumento).[0:3'5:8]
obtém todos os membros, exceto o centro, dessa matriz achatada.Esta solução, com uma atualização para o idioma, ficaria assim (49 bytes):
fonte
Kotlin , 88 bytes
Usa índices baseados em zero e gera uma lista de 8 elementos.
Experimente online!
fonte