Euler-Poincaré-Đặc trưng của Polyhedra


15

Cho một hình tam giác của bề mặt của một khối đa diện p, tính Euler-Poincaré-Đặc trưng của nó χ(p) = V-E+F, trong đó Vlà số đỉnh, Esố cạnh và Fsố mặt.

Chi tiết

Các đỉnh được liệt kê là 1,2,...,V. Phép tính tam giác được đưa ra dưới dạng một danh sách, trong đó mỗi mục là một danh sách các đỉnh của một mặt, được đưa ra theo thứ tự chiều kim đồng hồ hoặc ngược chiều kim đồng hồ.

Mặc dù tên, hình tam giác cũng có thể chứa các mặt có hơn 3 mặt. Các mặt có thể được coi là được kết nối đơn giản có nghĩa là ranh giới của mỗi mặt có thể được vẽ bằng một vòng lặp không tự giao nhau.

Ví dụ

Tứ diện : tứ diện này là lồi và có χ = 2. Một tam giác có thể là

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

Khối lập phương: Khối lập phương này lồi và có χ = 2. Một tam giác có thể là

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

Donut : Hình dạng bánh rán / hình xuyến này có χ = 0. Một tam giác có thể là

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

Bánh rán đôi : Bánh rán đôi này nên có χ = -2. Nó được xây dựng bằng cách sử dụng hai bản sao của chiếc bánh rán ở trên và xác định các mặt [1,2,5,4]của cái thứ nhất với mặt [1,3,6,4]thứ hai.

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

(Ví dụ được xác minh bằng chương trình Haskell này .)


2
Những khuôn mặt khác nhau có thể có số lượng đỉnh khác nhau?
xnor

1
Vâng, họ có thể có bất kỳ số đỉnh.
flawr

Câu trả lời:


5

Haskell , 49 46 byte

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

Hãy thử trực tuyến!

Tôi nhận được số đỉnh bằng cách ghép các mặt và tìm cực đại. Tôi tìm thấy số lượng khuôn mặt bằng cách lấy chiều dài. Tôi tìm số cạnh bằng cách tính tổng độ dài của các mặt và chia cho 2.




4

Thạch , 18 17 11 10 9 byte

1 byte nhờ Erik the Outgolfer và 1 byte nữa để cho tôi biết Ɗ.

FṀ_FLHƊ+L

Hãy thử trực tuyến!

Sử dụng giải pháp thực sự thông minh không hack cùng nhau mà mọi người khác có thể đang sử dụng. (Tín dụng cho @totallyhuman cho giải pháp khác duy nhất tôi có thể hiểu đủ để thực hiện lại nó.)

Giải pháp cũ (17 byte)

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

Hãy thử trực tuyến!

Tôi hy vọng tôi đã làm mọi thứ đúng. Giả sử rằng tất cả các mặt chứa ít nhất 3 đỉnh và không có hai mặt nào có cùng một đỉnh; Tôi không đủ tốt trong cấu trúc liên kết để đưa ra một cái gì đó phá vỡ mã.

Giải pháp thay thế 17 byte:

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

Giải trình

;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

Bạn không thể thay thế ;/bằng F? ;-)
Erik the Outgolfer 14/03/18

@EriktheOutgolfer Lol, dường như bị bỏ lại ở đó như một loại trò chơi trí tuệ từ phiên bản dev
PurkkaKoodari

Trong thực tế, nó đã gây ra lỗi mã trong trường hợp mảng trống.
Erik người vượt trội

Sẽ có những mảng trống?
PurkkaKoodari

Ồ, và 1) liên kết TIO của bạn có mã khác và 2) có những cách nhanh mới!
Erik các Outgolfer


2

Python 2 , 47 byte

-1 byte nhờ ... user56656 (ban đầu là Wheat Wizard).

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

Hãy thử trực tuyến!


1
Tôi đã cải thiện câu trả lời ban đầu của mình bằng cách lưu sum(l,[])lại để sử dụng hai lần. Tôi không biết nếu điều này cũng có thể được sử dụng trong Python.
Đăng Rock Garf Hunter

@ user56656 Nó thực sự tiết kiệm một byte, cảm ơn!
hoàn toàn là








0

JavaScript (ES6), 60 byte

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

Giải thích: Vòng lặp trên mỗi mặt, theo dõi đỉnh lớn nhất nhìn thấy vvà theo dõi số cạnh trừ đi số lượng khuôn mặt theo dcâu trả lời của mỗi @ xnor.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.