Euler-Poincaré-Característica de los poliedros


15

Dada una triangulación de la superficie de un poliedro p, calcule su Característica de Euler-Poincaré χ(p) = V-E+F, donde Vestá el número de vértices, Eel número de aristas y Fel número de caras.

Detalles

Los vértices se enumeran como 1,2,...,V. La triangulación se da como una lista, donde cada entrada es una lista de los vértices de una cara, dada en el sentido horario o antihorario.

A pesar del nombre, la triangulación también puede contener caras con más de 3 lados. Se puede suponer que las caras están simplemente conectadas, lo que significa que el límite de cada cara se puede dibujar utilizando un bucle cerrado que no se cruza automáticamente.

Ejemplos

Tetraedro : este tetraedro es convexo y tiene χ = 2. Una posible triangulación es

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

Cubo : Este cubo es convexo y tiene χ = 2. Una posible triangulación es

[[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 : Esta forma de rosquilla / toroide tiene χ = 0. Una posible triangulación es

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

Doble Donut : Este doble donut debería tener χ = -2. Se construye usando dos copias del donut de arriba e identificando los lados [1,2,5,4]del primero con el lado [1,3,6,4]del segundo.

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

(Ejemplos verificados usando este programa Haskell ).


2
¿Pueden diferentes caras tener diferentes números de vértices?
xnor

1
Sí, pueden tener cualquier número de vértices.
flawr

Respuestas:


5

Haskell , 49 46 bytes

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

Pruébalo en línea!

Obtengo el número de vértices al concatenar las caras y encontrar el máximo. Encuentro el número de caras tomando la longitud. Encuentro el número de aristas sumando las longitudes de las caras y dividiendo por 2.




4

Gelatina , 18 17 11 10 9 bytes

1 byte gracias a Erik the Outgolfer, y 1 más por contarme Ɗ.

FṀ_FLHƊ+L

Pruébalo en línea!

Utiliza la solución realmente inteligente no pirateada que probablemente todos los demás estén usando. (Crédito a @totallyhuman por la única otra solución que pude entender lo suficiente como para volver a implementarla).

Solución anterior (17 bytes)

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

Pruébalo en línea!

Espero tener todo bien. Asume que todas las caras contienen al menos 3 vértices y que no hay dos caras que tengan los mismos vértices; No soy lo suficientemente bueno en topología como para encontrar algo que rompa el código.

Solución alternativa de 17 bytes:

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

Explicación

;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

¿No puedes reemplazar ;/con F? ;-)
Erik the Outgolfer

@EriktheOutgolfer Lol, que aparentemente se dejó allí como una especie de pelea mental de una versión de desarrollo
PurkkaKoodari

De hecho, cometió el error de código en caso de matrices vacías.
Erik the Outgolfer

¿Habrá alguna vez matrices vacías?
PurkkaKoodari

Ah, y 1) su enlace TIO tiene un código diferente y 2) ¡ hay nuevos rápidos!
Erik the Outgolfer






1

05AB1E , 10 9 bytes

ZsgI˜g;-+

Pruébalo en línea!

Explicación

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 bytes

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

Explicación: recorre cada cara, realiza un seguimiento del vértice más grande que se ve vy rastrea el número de bordes menos el número de caras dsegún la respuesta de @ xnor.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.