一般的なアルゴリズムクラスとコンピューターサイエンスの非常に一般的な必要性は、グリッドまたはマトリックス(BFSまたはDFSなど)で4方向に反復することです。これは、多くの場合、ループ内で多くの算術演算と比較を行う、多くの不格好で冗長なコードをもたらすようです。これに対して多くの異なるアプローチを見てきましたが、これを行うためのより簡潔な方法があるという感覚を揺るがすことはできません。
課題はn, m
、point (0,0)
から始まる有限平面の幅と高さ、および(x,y)
その平面内の任意の有効な点を表すことができる座標が与えられ、4方向の平面内のすべての点の反復可能なオブジェクトを返す純粋な関数を書くことですに隣接(x,y)
。
目標は、できるだけ少ないバイトでその関数を定義することです。
有効な入力/出力を説明するのに役立つ例:
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)]
そして、条件を満たしている関数の例(Pythonのこれ)です:
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
上記の例では名前付き関数を定義していますが、匿名関数も使用できます。
入力n, m, x, y
はすべて、次の範囲内の符号なし32ビット整数です。
n > 0
m > 0
0 <= x < m
0 <= y < n
出力は(x、y)ペアの反復可能な形式(ただし、選択した言語で定義されている場合)でなければなりません。
追加の説明:
複素数(および他の表現/シリアル化)は、反復可能オブジェクトのコンシューマがアクセスできる限り、x
およびy
位置のみを知っている整数としては問題ありません。
非ゼロベースのインデックスは許容されますが、選択する言語が非ゼロインデックスの言語である場合のみです。言語で番号付けシステムが混在している場合は、マトリックスを表すために最も一般的に使用されるデータ構造の番号付けシステムがデフォルトになります。これらがまだ特定の言語のすべての外国の概念である場合、任意の開始インデックスが受け入れられます。
(x,y)
長方形の中にあることが保証されていますよね?