Ейлер-Пуанкаре-характерний для багатогранників


15

З огляду на триангуляцію поверхні багатогранника p, обчисліть його Хайлера-Пуанкаре-Характеристику χ(p) = V-E+F, де V- кількість вершин, Eкількість ребер та Fкількість граней.

Деталі

Вершини перераховуються як 1,2,...,V. Тріангуляція подається у вигляді списку, де кожен запис - це список вершин однієї грані, поданих за годинниковою або проти годинникової стрілки.

Незважаючи на назву, триангуляція також може містити грані з більш ніж 3 сторонами. Обличчя можна вважати просто з’єднаними, це означає, що межу кожної грані можна провести за допомогою однієї замкнутої непересічної петлі.

Приклади

Тетраедр : Цей тетраедр опуклий і має χ = 2. Можлива тріангуляція

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

Куб : Цей куб опуклий і має χ = 2. Можлива тріангуляція

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

Пончик : Ця форма пончика / тороїда має χ = 0. Можлива тріангуляція

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

Подвійний пончик : цей подвійний пончик повинен мати χ = -2. Він побудований за допомогою двох примірників пончика зверху та ототожнення сторін [1,2,5,4]першого з стороною [1,3,6,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], [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]]

(Приклади, підтверджені за допомогою цієї програми Haskell .)


2
Чи можуть різні сторони мати різну кількість вершин?
xnor

1
Так, вони можуть мати будь-яку кількість вершин.
недолік

Відповіді:


5

Haskell , 49 46 байт

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

Спробуйте в Інтернеті!

Кількість вершин я отримую шляхом стиснення граней і знаходження максимуму. Я знаходжу кількість граней, беручи довжину. Я знаходжу кількість ребер шляхом підсумовування довжин граней і ділення на 2.




4

Желе , 18 17 11 10 9 байт

1 байт подяку Еріку Погони, і ще 1 за те, що він розповів про мене Ɗ.

FṀ_FLHƊ+L

Спробуйте в Інтернеті!

Використовує власне інтелектуальне рішення, яке не зламали разом, мабуть, всі інші. ( Заслуга @totallyhuman за єдине інше рішення, яке я міг зрозуміти, щоб повторно реалізувати його.)

Старе рішення (17 байт)

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

Спробуйте в Інтернеті!

Я сподіваюся, що я все зрозумів. Припускає, що всі грані містять щонайменше 3 вершини і що жодна дві грані не мають однакових вершин; Я недостатньо хороший в топології, щоб придумати щось, що порушує код.

Альтернативне 17-байтне рішення:

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

Пояснення

;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

Ви не можете замінити ;/їх F? ;-)
Ерік Атгольфер

@EriktheOutgolfer Лол, який, мабуть, залишився там як якийсь мозковий пір з версії для розробників
PurkkaKoodari

Насправді вона зробила помилку коду у випадку порожніх масивів.
Ерік Аутгольфер

Чи будуть коли-небудь порожні масиви?
PurkkaKoodari

О, і 1) ваш TIO-посилання має інший код і 2) з’являються нові хити!
Ерік Аутгольфер


2

Python 2 , 47 байт

-1 байт завдяки ... користувачеві56656 (спочатку був пшеничним майстром).

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

Спробуйте в Інтернеті!


1
Я покращив свою оригінальну відповідь haskell, заощадивши sum(l,[])її використовувати двічі. Я не знаю, чи можна це використовувати і в Python.
Опублікувати Rock Garf Hunter

@ user56656 Це дійсно економить байт, дякую!
повністюлюдсько








0

JavaScript (ES6), 60 байт

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

Пояснення: петлі над кожним обличчям, відстежуючи найбільшу вершину, що спостерігається, vі відстежують кількість ребер мінус кількість граней dвідповідно до відповіді @ xnor.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.