다면체의 Euler-Poincaré- 특성


15

다면체의 표면을 삼각 측량 하면 pEuler-Poincaré-Characteristic을 계산하십시오 χ(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

답변:





4

젤리 , 18 17 11 10 9 바이트

Outgolfer Erik에게 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? ;-)
아웃 골퍼 Erik 14'18

분명히 dev에 버전에서 brainfart의 일종으로이 남아 있었다 @EriktheOutgolfer 롤,
PurkkaKoodari

실제로 빈 배열의 경우 코드 오류가 발생했습니다.
아웃 골퍼 Erik

빈 배열이 있습니까?
PurkkaKoodari

아, 그리고 1) TIO 링크에는 다른 코드가 있으며 2) 새로운 빠른 정보가 있습니다!
아웃 골퍼 Erik


2

파이썬 2 , 47 바이트

-1 바이트 덕분에 ... user56656 (원래는 밀 마법사였습니다).

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

온라인으로 사용해보십시오!


1
나는 sum(l,[])두 번 사용되도록 저축 하여 원래의 haskell 답변을 개선 했습니다. 이것이 파이썬에서도 사용될 수 있는지 모르겠습니다.
Post Rock Garf Hunter

@ user56656 정말 바이트를 절약 할 수 있습니다. 감사합니다!
완전히 인간적인








0

자바 스크립트 (ES6), 60 바이트

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

설명 : @xnor의 답변 에 따라 가장 큰 정점 v을 추적하고 가장자리 수에서 얼굴 수를 뺀 가장자리를 추적하여 d각면을 반복합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.