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.