Uma necessidade muito comum nas classes de algoritmos e ciência da computação em geral é iterar de forma quadridirecional em uma grade ou matriz (como no BFS ou DFS). Isso geralmente resulta em muitos códigos desajeitados e detalhados, com muita aritmética e comparações em loops. Eu já vi muitas abordagens diferentes disso, mas não posso deixar de pensar que há uma maneira mais concisa de fazer isso.
O desafio é escrever uma função pura que, dada a largura e a altura de um plano finito com n, m
origem no ponto (0,0)
, e as coordenadas (x,y)
que podem representar qualquer ponto válido dentro desse plano, retorne um objeto iterável de todos os pontos no plano que sejam de direção 4 adjacente a (x,y)
.
O objetivo é definir essa função no menor número possível de bytes.
Alguns exemplos para ajudar a ilustrar entrada / saída válida:
n = 5 (y-axis), m = 3 (x-axis) (zero-based)
matrix = [
[A, B, C],
[D, E, F],
[G, H, I],
[J, K, L],
[M, N, O],
]
(x, y) => [valid iterable points]
E: (1, 1) => [(1, 0), (2, 1), (1, 2), (0, 1)]
A: (0, 0) => [(1, 0), (0, 1)]
L: (2, 3) => [(2, 2), (2, 4), (1, 3)]
N: (1, 4) => [(1, 3), (2, 4), (0, 4)]
n = 1 (y-axis), m = 1 (x-axis) (zero-based)
matrix = [
[A],
]
(x, y) => [valid iterable points]
A: (0, 0) => []
n = 2 (y-axis), m = 1 (x-axis) (zero-based)
matrix = [
[A],
[B],
]
(x, y) => [valid iterable points]
A: (0, 0) => [(0, 1)]
B: (0, 1) => [(0, 0)]
E aqui está um exemplo (este em Python) de uma função que satisfaz as condições:
def four_directions(x, y, n, m):
valid_coordinates = []
for xd, yd in [(1, 0), (0, 1), (-1, 0), (0, -1)]:
nx, ny = x + xd, y + yd
if 0 <= nx < m and 0 <= ny < n:
valid_coordinates.append((nx, ny))
return valid_coordinates
O exemplo acima definiu uma função nomeada, mas funções anônimas também são aceitáveis.
As entradas n, m, x, y
são todos números inteiros de 32 bits não assinados dentro dos seguintes intervalos:
n > 0
m > 0
0 <= x < m
0 <= y < n
A saída deve assumir a forma de um iterável (no entanto, seu idioma de escolha define isso) de pares (x, y).
Esclarecimentos adicionais:
Números complexos (e outras representações / serializações) são válidos desde que o consumidor do iterável possa acessar x
e y
como números inteiros sabendo apenas sua localização.
Índices que não sejam baseados em zero são aceitáveis, mas apenas se o idioma de escolha for um idioma que não seja zero. Se o idioma usar uma combinação de sistemas de numeração, use como padrão o sistema de numeração da estrutura de dados mais comumente usado para representar uma matriz. Se esses ainda são todos conceitos estranhos no idioma especificado, qualquer índice inicial é aceitável.
(x,y)
ele está no retângulo, certo?