Euler-Poincaré-Característica dos Poliedros


15

Dada uma triangulação da superfície de um poliedro p, calcule sua característica de Euler-Poincaré χ(p) = V-E+F, onde Vé o número de vértices, Eo número de arestas e Fo número de faces.

Detalhes

Os vértices são enumerados como 1,2,...,V. A triangulação é dada como uma lista, em que cada entrada é uma lista dos vértices de uma face, dada no sentido horário ou anti-horário.

Apesar do nome, a triangulação também pode conter faces com mais de 3 lados. As faces podem ser assumidas como simplesmente conectadas, o que significa que o limite de cada face pode ser desenhado usando um loop fechado sem interseção.

Exemplos

Tetraedro : Este tetraedro é convexo e possui χ = 2. Uma possível triangulação é

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

Cubo : este cubo é convexo e possui χ = 2. Uma possível triangulação é

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

Rosquinha : Essa forma de rosquinha / toróide possui χ = 0. Uma possível triangulação é

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

Rosquinha dupla : essa rosquinha dupla deve ter χ = -2. É construído usando duas cópias da rosquinha acima e identificando os lados [1,2,5,4]da primeira com a lateral [1,3,6,4]da segunda.

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

(Exemplos verificados usando este programa Haskell .)


2
As faces diferentes podem ter diferentes números de vértices?
Xnor

1
Sim, eles podem ter qualquer número de vértices.
flawr

Respostas:


5

Haskell , 49 46 bytes

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

Experimente online!

Eu recebo o número de vértices concatando as faces e encontrando o máximo. Eu acho o número de rostos, medindo o comprimento. Eu encontro o número de arestas somando os comprimentos das faces e dividindo por 2.


5

Haskell , 42 bytes

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

Experimente online!

Combina os termos de face e borda subtraindo 0,5 para cada borda de uma face além das duas primeiras.

Alt 42 bytes:

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

Experimente online!


Isto é muito inteligente :)
flawr


4

Geléia , 18 17 11 10 9 bytes

1 byte graças a Erik, o Outgolfer, e mais 1 por me falar Ɗ.

FṀ_FLHƊ+L

Experimente online!

Usa a solução realmente inteligente, não hackeada, que todo mundo provavelmente está usando. ( Agradeço a @totallyhuman pela única outra solução que consegui entender o suficiente para reimplementá-la.)

Solução antiga (17 bytes)

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

Experimente online!

Espero ter acertado tudo. Assume que todas as faces contêm pelo menos três vértices e que não existem duas faces com os mesmos vértices; Não sou bom o suficiente em topologia para criar algo que quebra o código.

Solução alternativa de 17 bytes:

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

Explicação

;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

Você não pode substituir ;/com F? ;-)
Erik the Outgolfer 14/03

@EriktheOutgolfer Lol, que aparentemente foi deixado lá como uma espécie de brainfart de uma versão dev
PurkkaKoodari

De fato, cometeu o erro de código no caso de matrizes vazias.
Erik the Outgolfer

Alguma vez haverá matrizes vazias?
PurkkaKoodari

Ah, e 1) seu link TIO tem um código diferente e 2) há novas rápidas!
Erik the Outgolfer






1

05AB1E , 10 9 bytes

ZsgI˜g;-+

Experimente online!

Explicação

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

Explicação: Loops sobre cada face, acompanhando o maior vértice visto ve acompanhando o número de arestas menos o número de faces emd conforme a resposta do @ xnor.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.