Euler-Poincaré-Caractéristique des polyèdres


15

Étant donné une triangulation de la surface d'un polyèdre p, calculez sa caractéristique d'Euler-Poincaré χ(p) = V-E+F, où Vest le nombre de sommets, Ele nombre d'arêtes et Fle nombre de faces.

Détails

Les sommets sont énumérés comme 1,2,...,V. La triangulation est donnée sous forme de liste, où chaque entrée est une liste des sommets d'une face, donnée dans le sens horaire ou antihoraire.

Malgré son nom, la triangulation peut également contenir des faces avec plus de 3 côtés. Les faces peuvent être supposées être simplement connectées, ce qui signifie que la frontière de chaque face peut être dessinée à l'aide d'une boucle fermée non auto-intersectée.

Exemples

Tétraèdre : Ce tétraèdre est convexe et a χ = 2. Une triangulation possible est

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

Cube : Ce cube est convexe et a χ = 2. Une triangulation possible est

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

Beignet : Cette forme de beignet / toroïde a χ = 0. Une triangulation possible est

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

Double beignet : Ce double beignet devrait avoir χ = -2. Il est construit en utilisant deux copies du beignet ci-dessus et en identifiant les côtés [1,2,5,4]du premier avec le côté [1,3,6,4]du second.

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

(Exemples vérifiés à l'aide de ce programme Haskell .)


2
Différentes faces peuvent-elles avoir différents nombres de sommets?
xnor

1
Oui, ils peuvent avoir n'importe quel nombre de sommets.
flawr

Réponses:


5

Haskell , 49 46 octets

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

Essayez-le en ligne!

J'obtiens le nombre de sommets en concaténant les faces et en trouvant le maximum. Je trouve le nombre de visages en prenant la longueur. Je trouve le nombre d'arêtes en additionnant les longueurs des faces et en divisant par 2.


5

Haskell , 42 octets

f m=maximum(id=<<m)-sum[0.5|_:_:l<-m,x<-l]

Essayez-le en ligne!

Combine les termes face et arête en soustrayant 0,5 pour chaque arête sur une face au-delà des deux premiers.

Alt 42 octets:

f m=maximum(id=<<m)-sum(0.5<$(drop 2=<<m))

Essayez-le en ligne!


C'est très intelligent :)
flawr


4

Gelée , 18 17 11 10 9 octets

1 octet merci à Erik l'Outgolfer, et 1 de plus pour m'avoir parlé Ɗ.

FṀ_FLHƊ+L

Essayez-le en ligne!

Utilise la solution réellement intelligente non piratée que tout le monde utilise probablement. ( Nous remercions @totallyhuman pour la seule autre solution que je pourrais comprendre suffisamment pour la réimplémenter.)

Ancienne solution (17 octets)

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

Essayez-le en ligne!

J'espère avoir tout bien. Suppose que toutes les faces contiennent au moins 3 sommets et que deux faces n'ont pas les mêmes sommets; Je ne suis pas assez bon en topologie pour trouver quelque chose qui casse le code.

Solution alternative à 17 octets:

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

Explication

;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

Vous ne pouvez pas remplacer ;/par F? ;-)
Erik the Outgolfer

@EriktheOutgolfer Lol, qui a apparemment été laissé là comme une sorte de brainfart d'une version de développement
PurkkaKoodari

En fait, il a fait l'erreur de code en cas de tableaux vides.
Erik l'Outgolfer

Y aura-t-il jamais des tableaux vides?
PurkkaKoodari

Oh, et 1) votre lien TIO a un code différent et 2) il y a de nouveaux quicks!
Erik the Outgolfer






1

05AB1E , 10 9 octets

ZsgI˜g;-+

Essayez-le en ligne!

Explication

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 octets

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

Explication: Boucles sur chaque face, en gardant une trace du plus grand sommet vu vet en suivant le nombre d'arêtes moins le nombre de faces ddedans selon la réponse de @ xnor.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.