Euler-Poincaré-Charakterystyka Wielościanów


15

Biorąc pod uwagę triangulację powierzchni wielościanu p, oblicz jego Euler-Poincaré-Charakterystykę χ(p) = V-E+F, gdzie Vjest liczba wierzchołków, Eliczba krawędzi i Fliczba ścian.

Detale

Wierzchołki są wyliczone jako 1,2,...,V. Triangulacja jest podana jako lista, gdzie każdy wpis jest listą wierzchołków jednej powierzchni, podanych w kolejności zgodnej z ruchem wskazówek zegara lub przeciwnie do ruchu wskazówek zegara.

Pomimo nazwy triangulacja może również zawierać twarze o więcej niż 3 bokach. Można założyć, że ściany są po prostu połączone, co oznacza, że ​​granice każdej powierzchni można narysować za pomocą jednej zamkniętej nie przecinającej się pętli.

Przykłady

Czworościan : czworościan jest wypukły i ma χ = 2. Możliwa triangulacja to

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

Kostka : Ta kostka jest wypukła i ma χ = 2. Możliwa triangulacja to

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

Pączek : ma ten kształt pączka / toroidu χ = 0. Możliwa triangulacja to

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

Podwójny pączek : Ten podwójny pączek powinien mieć χ = -2. Konstruuje się go za pomocą dwóch kopii pączka powyżej i identyfikując boki [1,2,5,4]pierwszego z bokiem [1,3,6,4]drugiego.

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

(Przykłady zweryfikowane przy użyciu tego programu Haskell ).


2
Czy różne twarze mogą mieć różną liczbę wierzchołków?
xnor

1
Tak, mogą mieć dowolną liczbę wierzchołków.
flawr

Odpowiedzi:


5

Haskell , 49 46 bajtów

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

Wypróbuj online!

Liczbę wierzchołków uzyskuję, sumując twarze i znajdując maksimum. Liczbę twarzy znajduję na podstawie długości. Liczbę krawędzi znajduję, sumując długości twarzy i dzieląc przez 2.




4

Galaretka , 18 17 11 10 9 bajtów

1 bajt dzięki Erik the Outgolfer i 1 dodatkowy za powiedzenie mi o Ɗ.

FṀ_FLHƊ+L

Wypróbuj online!

Korzysta z inteligentnego rozwiązania, które nie jest zhakowane razem, z którego wszyscy inni prawdopodobnie korzystają. ( Podziękowania dla @totallyhuman dla za jedyne inne rozwiązanie, które mogłem zrozumieć na tyle, aby je ponownie ).

Stare rozwiązanie (17 bajtów)

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

Wypróbuj online!

Mam nadzieję, że wszystko dobrze. Zakłada, że ​​wszystkie ściany zawierają co najmniej 3 wierzchołki i że żadna z dwóch ścian nie ma takich samych wierzchołków; Nie jestem wystarczająco dobry w topologii, aby wymyślić coś, co łamie kod.

Alternatywne 17 bajtowe rozwiązanie:

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

Wyjaśnienie

;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

Nie można zastąpić ;/z F? ;-)
Erik the Outgolfer

@EriktheOutgolfer Lol, który najwyraźniej został tam jako pewien rodzaj mózgu z wersji
deweloperskiej

W rzeczywistości popełnił błąd kodu w przypadku pustych tablic.
Erik the Outgolfer

Czy będą kiedyś puste tablice?
PurkkaKoodari

Aha, i 1) twój link TIO ma inny kod i 2) są nowe szybkie!
Erik the Outgolfer






1

05AB1E , 10 9 bajtów

ZsgI˜g;-+

Wypróbuj online!

Wyjaśnienie

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 bajtów

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

Objaśnienie: Pętle nad każdą twarzą, śledząc największy wierzchołek widziany vi śledząc liczbę krawędzi minus liczba ścian dzgodnie z odpowiedzią @ xnor.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.