以这一挑战为动力
让我们有一张方形的柔性材料。粗略地说,我们可以关闭它自己四种方式:

在这里,颜色标记了连接的边缘,向量表示方向。球和环面是不翻转的边,克莱因瓶-有一个翻转边,射影平面与两者。
令人惊讶的是,环面,而不是球体,在许多意义上是最简单的构造。例如,您可以在不创建不能把毛茸茸的球梳平的情况下创建一个牛仔(但是torus可以)。
这就是为什么环面经常被用于游戏,拼图和研究。
这是投影平面的基本多边形(或闭包规则)的单独图片(用于1..N符号):

[1, 1]格的N x N格邻域:

例如如何在(2, 4)投影平面上求点(5, 3)和5 x 5投影平面上的距离:

绿色道路最短,所以是距离。
对于给定的两点和点阵大小,
求射影平面上各点之间的欧氏距离。
灵活,以任何适当的格式
用于1..N符号
为了更好地理解N, p1, p2 → distance,还表示环面上的距离(对于相同的点和大小):
5, [1, 1], [1, 1] → 0.0 (0.0)
5, [2, 4], [5, 3] → 2.24 (2.24)
5, [2, 4], [4, 1] → 2.0 (1.41)
10, [2, 2], [8, 8] → 4.12 (5.66)
10, [1, 1], [10, 10] → 1.0 (1.41)
10, [4, 4], [6, 6] → 2.83 (2.83)发布于 2023-05-22 12:35:24
_~jUŒHƲ€N⁹ṭ"_þ/ẎÆḊ€Ṃ一种二进链接,它接受左边的大小和右边的一对对(点),并产生射影平面的欧几里德距离。
_~jUŒHƲ€N⁹ṭ"_þ/ẎÆḊ€Ṃ - Link: Size = S; Points = [[x1, y1], [x2, y2]]
_ - {Size} subtract {Points} -> [[S-x1, S-y1], [S-x2, S-y2]]
€ - for each of these pairs, [a, b]:
Ʋ - last four links as a monad:
~ - bitwise NOT (vectorises) -> [-1-a, -1-b]
U - upend -> [b,a]
j - join -> [-1-a, b, a, -1-b]
ŒH - halve -> [[-1-a, b], [a, -1-b]]
N - negate -> [[a+1, -b], [-a, b+1]]
⁹ - chain's right argument -> [[x1, y1], [x2, y2]]
" - zip with:
ṭ - tack -> [[[S-x1+1, y1-S], [x1-S, S-y1+1], [x1, y1]],
[[S-x2+1, y2-S], [x2-S, S-y2+1], [x2, y2]],
]
/ - reduce by:
þ - table with:
_ - subtraction
Ẏ - tighten
ÆḊ€ - vector norm of each
Ṃ - minimum发布于 2023-05-23 05:09:37
发布于 2023-05-24 04:22:27
lambda n,X,Y,x,y:min(abs(X-a+(Y-b)*1j)for k in[-n,n]for a,b in[(x,y),(n+1-x,y+k),(x+k,n+1-y)])更容易理解为:
lambda n,X,Y,x,y:min(abs(X-a+(Y-b)*1j)for a,b in[(x,y),(n+1-x,y-n),(n+1-x,y+n),(x-n,n+1-y),(x+n,n+1-y)])修复一个点到位,并选择最接近的版本,另一点从5个选项-原始和四个倒影在正方形的边缘。没有必要考虑对角相邻的副本,因为它们总是远离不动点而不是原始的。
https://codegolf.stackexchange.com/questions/261141
复制相似问题