Eulero-Poincaré-Caratteristico di poliedri


15

Data una triangolazione della superficie di un poliedro p, calcola il suo Euler-Poincaré-Characteristic χ(p) = V-E+F, dove Vsono il numero di vertici, Eil numero di spigoli e Fil numero di facce.

Dettagli

I vertici sono elencati come 1,2,...,V. La triangolazione è data come un elenco, in cui ogni voce è un elenco dei vertici di una faccia, dato in senso orario o antiorario.

Nonostante il nome, la triangolazione può contenere anche facce con più di 3 lati. Si può presumere che le facce siano semplicemente connesse, il che significa che il confine di ciascuna faccia può essere disegnato usando un anello chiuso non autointersecante.

Esempi

Tetraedro : questo tetraedro è convesso e presenta χ = 2. Una possibile triangolazione è

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

Cubo : questo cubo è convesso e presenta χ = 2. Una possibile triangolazione è

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

Ciambella : questa forma di ciambella / toroide ha χ = 0. Una possibile triangolazione è

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

Doppia ciambella : questa doppia ciambella dovrebbe avere χ = -2. È costruito usando due copie della ciambella sopra e identificando i lati [1,2,5,4]del primo con il lato [1,3,6,4]del secondo.

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

(Esempi verificati utilizzando questo programma Haskell .)


2
Le facce diverse possono avere un numero diverso di vertici?
xnor

1
Sì, possono avere un numero qualsiasi di vertici.
flawr

Risposte:


5

Haskell , 49 46 byte

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

Provalo online!

Ottengo il numero di vertici concedendo le facce e trovando il massimo. Trovo il numero di facce prendendo la lunghezza. Trovo il numero di spigoli sommando le lunghezze delle facce e dividendo per 2.


5

Haskell , 42 byte

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

Provalo online!

Combina i termini faccia e bordo sottraendo 0,5 per ogni bordo di una faccia oltre i primi due.

Alt 42 byte:

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

Provalo online!


Questo è molto intelligente :)
flawr


4

Gelatina , 18 17 11 10 9 byte

1 byte grazie a Erik the Outgolfer e 1 altro per avermene parlato Ɗ.

FṀ_FLHƊ+L

Provalo online!

Utilizza la soluzione intelligente e non compromessa che tutti probabilmente usano. (Ringrazio @totallyhuman per l'unica altra soluzione che ho potuto capire abbastanza per reimplementarla.)

Vecchia soluzione (17 byte)

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

Provalo online!

Spero di aver fatto tutto bene. Suppone che tutte le facce contengano almeno 3 vertici e che non vi siano due facce con gli stessi vertici; Non sono abbastanza bravo in topologia per trovare qualcosa che rompa il codice.

Soluzione alternativa a 17 byte:

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

Spiegazione

;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

Non puoi sostituirlo ;/con F? ;-)
Erik the Outgolfer

@EriktheOutgolfer Lol, che apparentemente è stato lasciato lì come una sorta di brainfart da una versione di sviluppo
PurkkaKoodari

In effetti, ha commesso l'errore di codice in caso di array vuoti.
Erik the Outgolfer

Ci saranno mai array vuoti?
PurkkaKoodari,

Oh, e 1) il tuo link TIO ha un codice diverso e 2) ci sono nuovi rapidi!
Erik the Outgolfer

2

Perl 5 -a , 29 byte

Questo è fatto su misura per l' -aopzione perl che fa già quasi tutto il lavoro

#!/usr/bin/perl -a
@V[@F]=$e+=@F}{say$#V+$.-$e/2

Provalo online!


2

Python 2 , 47 byte

-1 byte grazie a ... user56656 (originariamente era Wizard del grano).

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

Provalo online!


1
Ho migliorato la mia risposta haskell originale salvandola sum(l,[])per essere utilizzata due volte. Non so se questo potrebbe essere usato anche in Python.
Post Rock Garf Hunter,

@ user56656 In effetti salva un byte, grazie!
totalmente umano il




1

05AB1E , 10 9 byte

ZsgI˜g;-+

Provalo online!

Spiegazione

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

Spiegazione: Passa sopra ogni faccia, tenendo traccia del vertice più grande visto ve monitorando il numero di bordi meno il numero di facce dcome nella risposta di @ xnor.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.