Euler-Poincaré-Karakteristik Polyhedra


15

Dengan adanya triangulasi permukaan polihedron p, hitung Euler-Poincaré-Characteristic-nya χ(p) = V-E+F, di mana Vjumlah simpul, Ejumlah tepi dan Fjumlah wajah.

Detail

Simpul dihitung sebagai 1,2,...,V. Triangulasi diberikan sebagai daftar, di mana setiap entri adalah daftar simpul dari satu wajah, diberikan secara searah atau berlawanan arah jarum jam.

Meskipun namanya, triangulasi juga dapat berisi wajah dengan lebih dari 3 sisi. Wajah dapat diasumsikan hanya terhubung yang berarti bahwa batas setiap wajah dapat ditarik menggunakan satu loop non-self-berpotongan tertutup.

Contohnya

Tetrahedron : Tetrahedron ini cembung dan memiliki χ = 2. Triangulasi yang mungkin adalah

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

Kubus : Kubus ini cembung dan memiliki χ = 2. Triangulasi yang mungkin adalah

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

Donat : Bentuk donat / toroid ini χ = 0. Triangulasi yang mungkin adalah

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

Double Donut : Donat ganda ini seharusnya χ = -2. Itu dibangun dengan menggunakan dua salinan donat di atas dan mengidentifikasi sisi [1,2,5,4]yang pertama dengan sisi [1,3,6,4]yang kedua.

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

(Contoh diverifikasi menggunakan program Haskell ini .)


2
Bisakah wajah yang berbeda memiliki jumlah simpul yang berbeda?
xnor

1
Ya, mereka dapat memiliki sejumlah simpul.
flawr

Jawaban:


5

Haskell , 49 46 byte

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

Cobalah online!

Saya mendapatkan jumlah simpul dengan menyimpulkan wajah dan menemukan maksimum. Saya menemukan jumlah wajah dengan mengambil panjangnya. Saya menemukan jumlah tepi dengan menjumlahkan panjang wajah dan membaginya dengan 2.


5

Haskell , 42 byte

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

Cobalah online!

Gabungkan istilah wajah dan tepi dengan mengurangi 0,5 untuk setiap tepi pada wajah di luar dua yang pertama.

Alt 42 byte:

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

Cobalah online!


Ini sangat pintar :)
flawr


4

Jelly , 18 17 11 10 9 byte

1 byte terima kasih kepada Erik the Outgolfer, dan 1 lagi untuk menceritakan tentang Ɗ.

FṀ_FLHƊ+L

Cobalah online!

Menggunakan solusi tidak-diretas-bersama yang sebenarnya cerdas yang mungkin digunakan orang lain. (Kredit untuk @totallyhuman untuk satu-satunya solusi lain yang saya cukup mengerti untuk mengimplementasikannya.)

Solusi lama (17 byte)

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

Cobalah online!

Saya harap semuanya beres. Asumsikan bahwa semua wajah mengandung setidaknya 3 simpul dan bahwa tidak ada dua wajah memiliki simpul yang sama; Saya tidak cukup baik dalam topologi untuk menghasilkan sesuatu yang memecahkan kode.

Alternatif solusi 17 byte:

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

Penjelasan

;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

Tidak bisakah Anda ganti ;/dengan F? ;-)
Erik the Outgolfer

@EriktheOutgolfer Lol, yang tampaknya ditinggalkan di sana sebagai semacam pemikiran dari versi dev
PurkkaKoodari

Bahkan, itu membuat kesalahan kode jika array kosong.
Erik the Outgolfer

Apakah akan ada array kosong?
PurkkaKoodari

Oh, dan 1) tautan TIO Anda memiliki kode yang berbeda dan 2) ada quick baru!
Erik the Outgolfer

2

Perl 5 -a , 29 byte

Yang ini dibuat khusus untuk -aopsi perl yang sudah melakukan hampir semua pekerjaan

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

Cobalah online!






1

05AB1E , 10 9 byte

ZsgI˜g;-+

Cobalah online!

Penjelasan

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

Penjelasan: Simpul pada setiap wajah, catat verteks terbesar yang terlihat vdan lacak jumlah sisi dikurangi jumlah wajah dsesuai jawaban @nor.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.