使用复数来存储图形坐标有什么好处?

out*_*tis 4 python graph-theory complex-numbers

我正在寻找一个将坐标存储为复数的 Advent of Code 谜题的解决方案:

 heightmap = {
    complex(x, y): c
        for y, ln in enumerate(sys.stdin.read().strip().split("\n"))
        for x, c in enumerate(ln)
}
Run Code Online (Sandbox Code Playgroud)

然后稍后访问它们,如下所示:

for xy, c in heightmap.items():
    for d in (1, -1, 1j, -1j):
        if ord(heightmap.get(xy + d, "{")) <= ord(c) + 1:
            G.add_edge(xy, xy + d)
Run Code Online (Sandbox Code Playgroud)

我可以看到这段代码使“获取邻居”行易于编写/思考,但我不认为值得增加复杂性(没有双关语)。

有人可以解释为什么将网格坐标存储为复数很有用吗?

Kel*_*ndy 5

是的,因为它很容易/很少编写和思考。也意味着拼写错误的机会更少:-)

自从我看到别人这样做以来,我已经这样做很多年了。通常甚至不显式地输入增量而是计算它们。即,而不是

for d in (1, -1, 1j, -1j):
    use(z + d)
Run Code Online (Sandbox Code Playgroud)

做:

for i in range(4):
    use(z + 1j**i)
Run Code Online (Sandbox Code Playgroud)

使用单独的 x 和 y 变量时可能的替代方案:

for dx, dy in ((1, 0), (0, 1), (-1, 0), (0, -1)):
    use(x+dx, y+dy)
Run Code Online (Sandbox Code Playgroud)
for x2, y2 in ((x+1, y), (x, y+1), (x-1, y), (x, y-1)):
    use(x2, y2)
Run Code Online (Sandbox Code Playgroud)

Ermahgerd,太令人沮丧了。事实上,我在写这些文章时确实犯了几个错别字:-)

尝试在线测试!