多面体的欧拉-庞加莱特征


15

给定多面体的表面的三角剖分p,请计算其Euler-Poincaré-Characteristic χ(p) = V-E+F,其中V的数量是顶点E的数量,边F的数量和面的数量。

细节

顶点被枚举为1,2,...,V。三角剖分以列表形式给出,其中每个条目都是一个面的顶点的列表,以顺时针或逆时针顺序给出。

尽管有名称,但三角剖分还可以包含具有3个以上边的面。可以假定这些面是简单连接的,这意味着可以使用一个闭合的非自相交环路绘制每个面的边界。

例子

四面体:这个四面体是凸面的,具有凸面χ = 2。可能的三角剖分是

[[1,2,3], [1,3,4], [1,2,4], [2,3,4]]

立方体:这个立方体是凸的并且具有χ = 2。可能的三角剖分是

[[1,2,3,4], [1,4,8,5], [1,2,6,5], [2,3,7,6], [4,3,7,8],  [5,6,7,8]]

甜甜圈:这种甜甜圈/环形形状具有χ = 0。可能的三角剖分是

[[1,2,5,4], [2,5,6,3], [1,3,6,4], [1,2,7,9], [2,3,8,7], [1,9,8,3], [4,9,8,6], [4,5,7,9], [5,7,8,6]]

双甜甜圈:这种双甜甜圈应该有χ = -2。它是通过使用上面两个甜甜圈的副本[1,2,5,4]并将第一个甜甜圈的侧面[1,3,6,4]与第二个甜甜圈的侧面标识来构造的。

[[2,5,6,3], [1,3,6,4], [1,2,7,9], [2,3,8,7], [1,9,8,3], [4,9,8,6], [4,5,7,9], [5,7,8,6], [1,10,11,4], [10,11,5,2], [1,10,12,14], [10,2,13,12], [1,14,13,2], [4,14,13,5], [4,11,12,14], [11,12,13,5]]

(使用此Haskell程序验证的示例。)


2
不同的面可以具有不同数量的顶点吗?
xnor

1
是的,它们可以具有任意数量的顶点。
瑕疵的

Answers:


5

Haskell49 46字节

u=length
f x|j<-x>>=id=maximum j+u x-u j`div`2

在线尝试!

我通过遮盖面并找到最大值来获得顶点数。我通过取长度来找到面孔的数量。我通过将面孔的长度相加并除以2来找到边缘的数量。




4

果冻18 17 11 10 9字节

感谢Outgolfer的Erik提供了1个字节,还向我讲述了1个字节Ɗ

FṀ_FLHƊ+L

在线尝试!

使用其他人可能正在使用的实际上很聪明的统一解决方案。(只有我可以理解的其他解决方案,才能使用@totallyhuman来重新实现它。)

旧解决方案(17个字节)

ṙ€1FżFṢ€QL
;FQL_Ç

在线尝试!

我希望我一切都好。假定所有面至少包含3个顶点,并且没有两个面具有相同的顶点;我在拓扑方面还不够好,无法提出一些破坏代码的方法。

备用17字节解决方案:

ṙ€1FżFṢ€,;F$QL$€I

说明

;FQL_Ç    Main link. Argument: faces
            e.g. [[1,2,3],[1,3,4],[1,2,4],[2,3,4]]
 F          Flatten the list. We now have a flat list of vertices.
            e.g. [1,2,3,1,3,4,1,2,4,2,3,4]
;           Append this to the original list.
            e.g. [[1,2,3],[1,3,4],[1,2,4],[2,3,4],1,2,3,1,3,4,1,2,4,2,3,4]
  Q         Remove duplicates. We now have a list of faces and vertices.
            e.g. [[1,2,3],[1,3,4],[1,2,4],[2,3,4],1,2,3,4]
   L        Get the length of this list. This is equal to V+F.
            e.g. 8
     Ç      Call the helper link on the faces to get E.
            e.g. 6
    _       Subtract the edges from the previous result to get V-E+F.
            e.g. 2

ṙ€1FżFṢ€QL    Helper link. Argument: faces
                e.g. [[1,2,3],[1,3,4],[1,2,4],[2,3,4]]
ṙ€1             Rotate each face 1 position to the left.
                e.g. [[2,3,1],[3,4,1],[2,4,1],[3,4,2]]
   F            Flatten this result.
                e.g. [2,3,1,3,4,1,2,4,1,3,4,2]
     F          Flatten the original faces.
                e.g. [1,2,3,1,3,4,1,2,4,2,3,4]
    ż           Pair the items of the two flattened lists.
                e.g. [[2,1],[3,2],[1,3],[3,1],[4,3],[1,4],[2,1],[4,2],[1,4],[3,2],[4,3],[2,4]]
      Ṣ€        Order each edge.
                e.g. [[1,2],[2,3],[1,3],[1,3],[3,4],[1,4],[1,2],[2,4],[1,4],[2,3],[3,4],[2,4]]
        Q       Remove duplicates. We now have a list of edges.
                e.g. [[1,2],[2,3],[1,3],[3,4],[1,4],[2,4]]
         L      Get the length of the list to get E.
                e.g. 6

您不能替换;/F吗?;-)
暴民埃里克(Erik the Outgolfer)

@EriktheOutgolfer大声笑,显然是作为开发者版本的
智囊团而留下的

实际上,在数组为空的情况下,它会导致代码错误。
暴民埃里克(Erik the Outgolfer)

会不会有空数组?
PurkkaKoodari

哦,并且1)您的TIO链接具有不同的代码,并且2)有新的速记!
暴民埃里克(Erik the Outgolfer)


2

Python 2,47个字节

-1个字节,感谢... user56656(最初是Wheat Wizard)。

lambda l:len(l)-len(sum(l,[]))/2+max(sum(l,[]))

在线尝试!


1
我通过保存sum(l,[])两次来改进了我原来的haskell答案。我不知道是否也可以在Python中使用它。
发布Rock Garf Hunter,

@ user56656它确实节省了一个字节,谢谢!
–totalhuman




1

05AB1E10 9字节

ZsgI˜g;-+

在线尝试!

说明

Z          # push number of vertices (V)
 sg        # push number of faces (F)
   I˜g;    # push number of edges (E)
       -   # subtract (F-E)
        +  # add (F-E+V)




0

JavaScript(ES6),60个字节

a=>a.map(b=>(v=Math.max(v,...b),d+=b.length/2-1),d=v=0)&&v-d

说明:循环遍历每个面,跟踪@xnor的答案v,跟踪在其中看到的最大顶点,并跟踪边数减去其中的面d数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.