คำนวณจำนวนทอพอโลยีใน {1,2, …, n}


9

งาน

เขียนฟังก์ชั่น / โปรแกรมซึ่งจะnเป็นพารามิเตอร์ / input และพิมพ์ / ส่งกลับจำนวนของโครงสร้าง (ซึ่งจะแสดงให้เห็นด้านล่าง) {1,2,...,n}ในชุด

นิยามของโทโพโลยี

ให้ X เป็นเซต จำกัด ใด ๆ และสมมติว่า T ซึ่งเป็นเซตย่อยของชุดพลังงานของ X (เช่นชุดที่มีชุดย่อยของ X) ให้เป็นไปตามเงื่อนไขเหล่านี้ :

  1. X และเซตว่างอยู่ใน T

  2. หากทั้งสองชุด U และ V อยู่ใน T ดังนั้นการรวมกันของทั้งสองชุดนั้นจะอยู่ใน T

  3. หากทั้งสองชุด U และ V อยู่ใน T ดังนั้นจุดตัดของทั้งสองชุดนั้นเป็น T

... ดังนั้น T เรียกว่าทอพอโลยีใน X

ข้อมูลจำเพาะ

  1. โปรแกรมของคุณคือ:

    • ฟังก์ชั่นซึ่งใช้nเป็นพารามิเตอร์
    • หรือโปรแกรมที่อินพุต n

    และพิมพ์หรือผลตอบแทนจำนวน (ที่แตกต่างกัน) {1,2,...,n}โครงสร้างในตลาดหลักทรัพย์แห่งประเทศไทย

  2. n เป็นจำนวนเต็มใด ๆ ที่ไม่เป็นลบซึ่งน้อยกว่า 11 (แน่นอนว่าไม่มีปัญหาหากโปรแกรมของคุณจัดการกับ n ใหญ่กว่า 11) และผลลัพธ์เป็นจำนวนเต็มบวก

  3. โปรแกรมของคุณไม่ควรใช้ฟังก์ชั่นห้องสมุดหรือฟังก์ชั่นพื้นเมืองใด ๆ ที่คำนวณจำนวนโทโพโลยีโดยตรง

ตัวอย่างอินพุต (ค่า n): 7

ตัวอย่างผลลัพธ์ / ผลตอบแทน: 9535241

คุณสามารถตรวจสอบค่าตอบแทนของคุณได้ที่นี่หรือที่นี่

แน่นอนว่ารหัสที่สั้นที่สุดจะเป็นผู้ชนะ


ผู้ชนะจะถูกตัดสินอย่างไรก็ตามฉันอาจเปลี่ยนผู้ชนะหากรหัสที่สั้นกว่าปรากฏขึ้น ..


มันจะต้องให้ผลลัพธ์ในศตวรรษนี้หรือเป็นข้อพิสูจน์ของความถูกต้องดีพอหรือไม่?
Peter Taylor

@ Peter ในความเป็นจริงฉันไม่รู้ว่าจะใช้เวลานานเท่าใด ดังนั้นการพิสูจน์ความถูกต้องของโปรแกรมนั้นดีพอ แต่โปรแกรมควรให้ผลลัพธ์ในเวลาที่เหมาะสมถ้า n มีขนาดเล็กเช่น 4 ~ 5
JiminP

@JiminP ดูเหมือนว่าการคำนวณมันสำหรับ n = 12 นั้นคุ้มค่ากับกระดาษในตอนกลางวันและไม่มีสูตรที่รู้จัก สำหรับ 4 หรือ 5 ฉันสงสัยว่ามันทำได้ในไม่กี่นาทีโดยใช้กำลังดุร้าย
Peter Taylor

เซ็ตย่อยที่ไม่เหมาะสมของ 2 ^ X เป็นทอพอโลยีหรือไม่?
FUZxxl

@FUZxxl: ใช่ ผมคิดว่าของที่เรียกว่าโครงสร้างที่ไม่ต่อเนื่อง
JiminP

คำตอบ:


4

Haskell, 144 ตัวอักษร

import List
import Monad
p=filterM$const[True,False]
f n=sum[1|t<-p$p[1..n],let e=(`elem`t).sort,e[],e[1..n],all e$[union,intersect]`ap`t`ap`t]

เกือบจะเป็นการนำสเปคโดยตรงไปใช้ modulo เวทย์มนตร์บางส่วน

n > 4ช้ามากสำหรับ


5

Python 147 ตัวอักษร

N=input()
S=lambda i,K:1+sum(0if len(set(j&k for k in K)-K)-1 else S(j+1,K|set(j|k for k in K))for j in range(i,2**N))
print S(1,set([0,2**N-1]))

ด่วนสำหรับ N <= 6, ช้าสำหรับ N = 7, ไม่น่าจะเป็น N> = 8 จะเสร็จสมบูรณ์

ชุดของแต่ละชุดจะถูกแทนด้วย bitmasks จำนวนเต็มและทอพอโลยีโดยชุดของ bitmasks S(i,K)คำนวณจำนวนของโครงสร้างที่แตกต่างกันที่คุณสามารถสร้างได้โดยเริ่มต้นด้วยKการเพิ่มชุดกับ bitmasks> i=


0

Zsh, 83 ตัวอักษร

วิธีนี้ตรงกับตัวอักษรที่คุณต้องการ (แต่ไม่ใช่แน่นอน) มีวิธีการบีบอัดตัวเลขอย่างไม่ต้องสงสัยมากขึ้น

a=(0 3 S 9U 5CT 4HO6 5ODFS AMOZQ1 T27JJPQ 36K023FKI HW0NJPW01R);echo $[1+36#$a[$1]]

-1

Python 131 ตัวอักษร

lambda n:sum(x&(x>>2**n-1)&all((~(x>>i&x>>j)|x>>(i|j)&x>>(i&j))&1 for i in range(2**n)for j in range(2**n))for x in range(2**2**n))

รุ่นขยาย:

def f(n):
    count = 0
    for x in range(2**2**n): # for every set x of subsets of [n] = {1,...,n}
        try:
            assert x & 1 # {} is in x
            assert (x >> 2 ** n - 1) & 1 # [n] is in x
            for i in range(2**n): # for every subset i of [n]...
                if x >> i & 1: # ...in x
                    for j in range(2**n): # for every subset j of [n]...
                        if x >> j & 1: # ...in x
                            assert (x >> (i | j)) & 1 # their union is in x
                            assert (x >> (i & j)) & 1 # their intersection is in x
            count += 1
        except AssertionError:
            pass
    return count

ตัวอย่างเช่นสมมติว่า n = 3 เซตย่อยที่เป็นไปได้ของ [n] คือ

0b000
0b001
0b010
0b011
0b100
0b101
0b110
0b111

โดยที่ ith บิตระบุว่าฉันอยู่ในชุดย่อยหรือไม่ ในการเข้ารหัสชุดย่อยเราสังเกตว่าแต่ละชุดย่อยเหล่านี้เป็นของหรือไม่อยู่ในชุดของคำถาม ตัวอย่างเช่น

x = 0b10100001
0b000 # 1
0b001 # 0
0b010 # 1
0b011 # 0
0b100 # 0
0b101 # 0
0b110 # 0
0b111 # 1

บ่งชี้ว่า x มี {}, {2} และ {1,2,3}


คุณอธิบายได้ไหมว่ามันทำงานอย่างไร
Ad Hoc Garf Hunter

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