多面体のオイラーポアンカレ特性


15

所定の三角測量多面体の表面のp、そのオイラー・ポアンカレ特性計算χ(p) = V-E+FV頂点の数、あるEエッジの数とF顔の数。

詳細

頂点はとして列挙され1,2,...,Vます。三角形分割はリストとして指定されます。各エントリは、時計回りまたは反時計回りの順序で指定された1つの面の頂点のリストです。

名前にもかかわらず、三角形分割には3面以上の面を含めることもできます。面は単純に接続されていると想定できます。つまり、各面の境界は、1つの閉じた非自己交差ループを使用して描画できます。

テトラヘドロン:この四面体が凸であるとありχ = 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です。これは、上のドーナツの2つのコピーを使用して構築され[1,2,5,4]、最初のドーナツの側面[1,3,6,4]と2番目のドーナツの側面を識別します。

[[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
はい、頂点はいくつでも持つことができます。
-flawr

回答:





4

ゼリー18 17 11 10 9バイト

Erik the Outgolferに1バイト、ありがとうございましたƊ

FṀ_FLHƊ+L

オンラインでお試しください!

他の誰もがおそらく使用している、実際にはインテリジェントでハッキングされていないソリューションを使用します。(私がそれを再実装するのに十分理解できる唯一の他の解決策について、@ totallyhumanに感謝します。)

古いソリューション(17バイト)

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

オンラインでお試しください!

私はすべてが正しいことを願っています。すべての面に少なくとも3つの頂点が含まれ、2つの面が同じ頂点を持たないと仮定します。トポロジがコードを壊すようなものを思い付くほど私は十分ではありません。

代替の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?;-)
アウトゴルファーのエリック

@EriktheOutgolfer Lol、それは明らかに、開発バージョンからのある種の脳みそとしてそこに残された
PurkkaKoodari

実際、空の配列の場合はコードエラーが発生しました。
エリックアウトゴルファー

空の配列はありますか?
-PurkkaKoodari

ああ、そして1)TIOリンクに異なるコードがあり、2)新しいクイックがあります!
エリックアウトゴルファー


2

Python 2、47バイト

-1バイトのおかげで... user56656(元はWheat Wizardでした)。

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

オンラインでお試しください!


1
sum(l,[])2回使用できるように保存することで、元のhaskellの回答を改善しました。これがPythonでも使用できるかどうかはわかりません。
ポストロックガーフハンター

@ user56656それは確かにバイトを節約します、ありがとう!
完全に人間








0

JavaScript(ES6)、60バイト

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

説明:各面でループし、見られる最大の頂点vを追跡し、d@ xnorの答えに従ってエッジの数から面の数を引いたものを追跡します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.