Эйлер-Пуанкаре-Характеристика многогранников


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
Да, они могут иметь любое количество вершин.
flawr

Ответы:


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? ;-)
Эрик Outgolfer

@EriktheOutgolfer Lol, который, по-видимому, был оставлен там как своего рода мозговая штука из версии для разработчиков
PurkkaKoodari

Фактически, он допустил ошибку кода в случае пустых массивов.
Эрик Outgolfer

Будут ли когда-нибудь пустые массивы?
PurkkaKoodari

О, и 1) у вашей ссылки TIO
Эрик Outgolfer


2

Python 2 , 47 байт

-1 байт благодаря ... user56656 (изначально был Wheat Wizard).

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

Попробуйте онлайн!


1
Я улучшил свой исходный ответ на Haskell, сохранив его sum(l,[])для повторного использования. Я не знаю, можно ли это использовать и в Python.
Пост Рок Гарф Хантер

@ 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.