ออยเลอร์ - Poincaré-ลักษณะของ Polyhedra


15

กำหนดรูปสามเหลี่ยมของพื้นผิวของรูปทรงหลายเหลี่ยมที่pคำนวณของออยเลอร์-Poincaré-ลักษณะχ(p) = V-E+Fที่Vเป็นจำนวนของจุด, EจำนวนขอบและFจำนวนของใบหน้า

รายละเอียด

1,2,...,Vจุดที่มีการระบุว่าเป็น สมการจะได้รับเป็นรายการโดยที่แต่ละรายการเป็นรายการของจุดยอดของใบหน้าเดียวกำหนดตามลำดับตามเข็มนาฬิกาหรือทวนเข็มนาฬิกา

แม้ชื่อจะเป็นรูปสามเหลี่ยมที่มีใบหน้าที่มีมากกว่า 3 ด้าน ใบหน้าสามารถสันนิษฐานได้ว่าเป็นการเชื่อมต่ออย่างง่ายนั่นหมายความว่าขอบเขตของแต่ละใบหน้าสามารถวาดได้โดยใช้วงปิดที่ไม่ตัดตัวเองหนึ่งวง

ตัวอย่าง

จัตุรมุข : χ = 2จัตุรมุขนี้เป็นนูนและมี สมการที่เป็นไปได้คือ

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

Cube : χ = 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]]

โดนัท : โดนัท / รูปร่างแบบนี้ toroid χ = 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


5

Haskell , 42 ไบต์

f m=maximum(id=<<m)-sum[0.5|_:_:l<-m,x<-l]

ลองออนไลน์!

รวมคำศัพท์ใบหน้าและขอบโดยการลบ 0.5 สำหรับทุก ๆ ขอบบนใบหน้าที่เกินสองหน้าแรก

Alt 42 ไบต์:

f m=maximum(id=<<m)-sum(0.5<$(drop 2=<<m))

ลองออนไลน์!


นี่เป็นสิ่งที่ฉลาดมาก :)
ข้อบกพร่อง


4

เยลลี่ , 18 17 11 10 9 ไบต์

1 ไบต์ขอบคุณที่เอริก Outgolfer และอีก 1 Ɗบอกฉันเกี่ยวกับ

FṀ_FLHƊ+L

ลองออนไลน์!

ใช้วิธีแก้ปัญหาที่ไม่ได้ถูกแฮ็กร่วมกันอย่างชาญฉลาดซึ่งคนอื่นอาจใช้กัน (ให้เครดิตกับ@tallyallyhumanสำหรับโซลูชันอื่นเท่านั้นที่ฉันสามารถเข้าใจได้พอที่จะนำไปใช้ใหม่)

โซลูชันเก่า (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 the Outgolfer

@EriktheOutgolfer Lol เห็นได้ชัดว่ามันถูกทิ้งไว้ที่นั่นในขณะที่มีสมองบางส่วนจากรุ่น dev
PurkkaKoodari

ที่จริงแล้วมันทำรหัสข้อผิดพลาดในกรณีที่อาร์เรย์ที่ว่างเปล่า
Erik the Outgolfer

จะมีอาร์เรย์ว่างหรือไม่
PurkkaKoodari

โอ้และ 1) ลิงค์ TIO ของคุณมีรหัสที่แตกต่างกันและ 2) มี quicks ใหม่!
Erik the Outgolfer


2

Python 2 , 47 ไบต์

-1 ไบต์ขอบคุณ ... user56656 (เดิมเป็นตัวช่วยสร้างข้าวสาลี)

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

ลองออนไลน์!


1
ฉันปรับปรุงคำตอบฮาเซลเดิมของฉันโดยการบันทึกsum(l,[])เพื่อใช้สองครั้ง ฉันไม่รู้ว่าสามารถใช้สิ่งนี้ใน Python ได้หรือไม่
โพสต์ร็อค Garf Hunter

@ user56656 แน่นอนช่วยประหยัดไบต์ขอบคุณ!
สิ้นเชิงมนุษย์

1

Stax ขนาด 9 ไบต์

ÑF4╨Ω◙╜#├

เรียกใช้และแก้ไขข้อบกพร่องออนไลน์

มันเป็นพอร์ตตรงไปข้างหน้าของ totallyhuman ของการแก้ปัญหาหลาม

%   length of input (a)
x$Y flatten input and store in y
%h  half of flattened length (b)
-   subtract a - b (c)
y|M maximum value in y (d)
+   add c + d and output

เรียกใช้อันนี้








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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.