Euler-Poincaré-Charakteristik der Polyeder


15

Berechnen Sie anhand einer Triangulation der Oberfläche eines Polyeders pdessen Euler-Poincaré-Charakteristik χ(p) = V-E+F, wobei Vdie Anzahl der Eckpunkte, Edie Anzahl der Kanten und Fdie Anzahl der Flächen ist.

Einzelheiten

Die Eckpunkte werden als aufgelistet 1,2,...,V. Die Triangulation wird als Liste angegeben, wobei jeder Eintrag eine Liste der Eckpunkte einer Fläche im oder gegen den Uhrzeigersinn ist.

Trotz des Namens kann die Triangulation auch Gesichter mit mehr als drei Seiten enthalten. Es kann angenommen werden, dass die Flächen einfach verbunden sind, was bedeutet, dass die Grenze jeder Fläche unter Verwendung einer geschlossenen, sich nicht selbst schneidenden Schleife gezeichnet werden kann.

Beispiele

Tetraeder : Dieser Tetraeder ist konvex und hat χ = 2. Eine mögliche Triangulation ist

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

Würfel : Dieser Würfel ist konvex und hat χ = 2. Eine mögliche Triangulation ist

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

Donut : Diese Donut- / Toroidform hat χ = 0. Eine mögliche Triangulation ist

[[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]]

Doppelter Donut : Dieser doppelte Donut sollte haben χ = -2. Es wird konstruiert, indem zwei Kopien des obigen Donuts verwendet werden und die Seiten [1,2,5,4]des ersten mit der Seite [1,3,6,4]des zweiten identifiziert werden .

[[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]]

(Beispiele, die mit diesem Haskell-Programm überprüft wurden .)


2
Können verschiedene Gesichter eine unterschiedliche Anzahl von Scheitelpunkten haben?
Xnor

1
Ja, sie können beliebig viele Eckpunkte haben.
Fehler

Antworten:


5

Haskell , 49 46 Bytes

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

Probieren Sie es online!

Die Anzahl der Eckpunkte erhalte ich, indem ich die Flächen konzentriere und das Maximum ermittle. Die Anzahl der Gesichter ermittle ich über die Länge. Die Anzahl der Kanten ermittle ich, indem ich die Länge der Flächen summiere und durch 2 dividiere.




4

Jelly , 18 17 11 10 9 Bytes

1 Byte danke an Erik den Outgolfer und 1 weiteres Byte, dass er mir davon erzählt hat Ɗ.

FṀ_FLHƊ+L

Probieren Sie es online!

Verwendet die tatsächlich intelligente, nicht gehackte Lösung, die wahrscheinlich alle anderen verwenden. ( Dank an @totallyhuman für die einzige andere Lösung, die ich verstehen konnte, um sie erneut zu implementieren.)

Alte Lösung (17 Bytes)

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

Probieren Sie es online!

Ich hoffe, ich habe alles richtig gemacht. Angenommen, alle Flächen enthalten mindestens 3 Eckpunkte und keine zwei Flächen haben dieselben Eckpunkte. Ich bin nicht gut genug in der Topologie, um etwas zu finden, das den Code bricht.

Alternative 17-Byte-Lösung:

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

Erläuterung

;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

Kannst du nicht ersetzen ;/durch F? ;-)
Erik der Outgolfer

@EriktheOutgolfer Lol, das war offenbar eine Art Brainfart von einer Dev-Version
PurkkaKoodari

Tatsächlich wurde der Codefehler bei leeren Arrays verursacht.
Erik der Outgolfer

Wird es jemals leere Arrays geben?
PurkkaKoodari

Oh, und 1) Ihr TIO-Link hat einen anderen Code und 2) es gibt neue Quick-Infos!
Erik der Outgolfer


2

Python 2 , 47 Bytes

-1 Byte danke an ... user56656 (war ursprünglich Wheat Wizard).

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

Probieren Sie es online!


1
Ich habe meine ursprüngliche Hash-Antwort verbessert, indem ich gespeichert habe sum(l,[]), um sie zweimal zu verwenden. Ich weiß nicht, ob dies auch in Python verwendet werden könnte.
Wheat Wizard

@ user56656 Es spart ja ein Byte, danke!
Totalhuman




1

05AB1E , 10 9 Bytes

ZsgI˜g;-+

Probieren Sie es online!

Erläuterung

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 Byte

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

Erläuterung: Durchläuft jede Fläche mit einer Schleife, wobei der größte Scheitelpunkt nachverfolgt wird vund die Anzahl der Kanten abzüglich der Anzahl der Flächen dgemäß der Antwort von @ xnor nachverfolgt wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.