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)
我可以看到这段代码使“获取邻居”行易于编写/思考,但我不认为值得增加复杂性(没有双关语)。
有人可以解释为什么将网格坐标存储为复数很有用吗?
是的,因为它很容易/很少编写和思考。也意味着拼写错误的机会更少:-)
自从我看到别人这样做以来,我已经这样做很多年了。通常甚至不显式地输入增量而是计算它们。即,而不是
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,太令人沮丧了。事实上,我在写这些文章时确实犯了几个错别字:-)
(尝试在线测试!)