Euler-Poincaré-Çokyüzlünün Özellikleri


15

Verilen Bir nirengi çok yüzeyli bir yüzeyin p, bunun Euler-Poincare-Karakteristik hesaplamak χ(p) = V-E+Fburada, Vköşelerin sayısı olup, özelliği Ekenarların sayısı ve Fyüz sayısı.

ayrıntılar

Köşeler olarak numaralandırılır 1,2,...,V. Üçgenleştirme, her girişin saat yönünde veya saat yönünün tersine verilen bir yüzün köşelerinin bir listesi olduğu bir liste olarak verilir.

İsme rağmen, üçgenleme ayrıca 3'den fazla yüzü olan yüzler içerebilir. Yüzlerin basit bir şekilde bağlandığı varsayılabilir, bu da her yüzün sınırının, kendi kendine kesişmeyen bir kapalı döngü kullanılarak çizilebileceği anlamına gelir.

Örnekler

Tetrahedron : Bu tetrahedron dışbükey ve sahiptir χ = 2. Olası bir üçgenleme

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

Küp : Bu küp dışbükey ve sahiptir χ = 2. Olası bir üçgenleme

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

Halka : Bu halka / toroid şekli vardır χ = 0. Olası bir üçgenleme

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

Çift Çörek : Bu çift çörek olmalıdır χ = -2. Yukarıdaki çöreklerin iki kopyası kullanılarak [1,2,5,4]ve birincisinin yanlarını [1,3,6,4]ikincisinin yanıyla tanımlayarak inşa edilmiştir .

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

(Örnekler bu Haskell programı kullanılarak doğrulanmıştır .)


2
Farklı yüzlerin farklı köşeleri olabilir mi?
xnor

1
Evet, herhangi bir sayıda köşe noktası olabilir.
flawr

Yanıtlar:


5

Haskell , 49 46 bayt

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

Çevrimiçi deneyin!

Yüzleri sonlandırarak ve maksimumu bularak köşe sayısını elde ediyorum. Uzunluğu alarak yüzlerin sayısını buluyorum. Yüzlerin uzunluklarını toplayıp 2'ye bölerek kenar sayısını buluyorum.




4

Jöle , 18 17 11 10 9 bayt

Outgolfer Erik'e 1 bayt, bana anlattığın için 1 bayt daha Ɗ.

FṀ_FLHƊ+L

Çevrimiçi deneyin!

Herkesin muhtemelen kullandığı akıllıca ele geçirilmemiş birlikte çözümü kullanır. (Kredi Yeniden uygulamak için yeterince anlayabildiğim diğer tek çözüm @ totallyhuman'a teşekkür ederiz.)

Eski çözüm (17 bayt)

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

Çevrimiçi deneyin!

Umarım her şey yolunda gider. Tüm yüzlerin en az 3 köşe içerdiğini ve iki yüzün aynı köşelere sahip olmadığını varsayar; Topolojide kodu kıran bir şey bulmak için yeterince iyi değilim.

Alternatif 17 bayt çözümü:

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

açıklama

;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

Eğer yerini alamaz ;/ile F? ;-)
Outgolfer Erik

@EriktheOutgolfer Lol, görünüşe göre bir dev sürümünden bir çeşit beyin filmi olarak kaldı
PurkkaKoodari

Aslında, boş diziler durumunda kod hatası yaptı.
Outgolfer Erik

Hiç boş diziler olacak mı?
PurkkaKoodari

Oh, ve 1) TIO bağlantınızın farklı bir kodu var ve 2) yeni hızlı bağlantılar var!
Outgolfer Erik


2

Python 2 , 47 bayt

-1 bayt sayesinde ... user56656 (başlangıçta Buğday Sihirbazı idi).

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

Çevrimiçi deneyin!


1
Orijinal haskell cevabımı sum(l,[])iki kez kullanılmak üzere kaydederek geliştirdim . Bunun Python'da da kullanılıp kullanılamayacağını bilmiyorum.
Rock Garf Hunter Post

@ user56656 Gerçekten bir bayt kaydeder, teşekkürler!
totallyhuman




1

05AB1E , 10 9 bayt

ZsgI˜g;-+

Çevrimiçi deneyin!

açıklama

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 bayt

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

Açıklama: @ xnor'un cevabına göre görülen en büyük tepe noktasını vtakip ederek ve kenar sayısını eksi yüz sayısını izleyerek her bir yüzün üzerinden ddöner.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.