{1,2,…, n} पर टोपोलॉजी की संख्या की गणना करें


9

कार्य

एक फ़ंक्शन / प्रोग्राम लिखें जो nएक पैरामीटर / इनपुट के रूप में लेता है और सेट पर टोपोलॉजी (जो नीचे प्रदर्शित होता है) की संख्या को वापस करता है {1,2,...,n}

टोपोलॉजी की परिभाषा

X को किसी भी परिमित सेट होने दें, और मान लें कि T, जो कि X के पावर सेट का सबसेट है (यानी X का सबसेट वाला सेट), इन शर्तों को पूरा करें :

  1. X और खाली सेट T में हैं।

  2. यदि दो सेट U और V T में हैं, तो उन दो सेटों का मिलन T में है।

  3. यदि दो सेट यू और वी टी में हैं, तो उन दो सेटों का प्रतिच्छेदन टी में है।

... तो T को X पर टोपोलॉजी कहा जाता है।

विशेष विवरण

  1. आपका कार्यक्रम या तो है:

    • एक फ़ंक्शन जो nएक पैरामीटर के रूप में लेता है
    • या एक प्रोग्राम जो इनपुट करता है n

    और सेट पर (अलग) टोपोलॉजी की संख्या प्रिंट या देता है {1,2,...,n}

  2. n कोई भी गैर-नकारात्मक पूर्णांक है जो 11 से कम है (निश्चित रूप से कोई समस्या नहीं है यदि आपका प्रोग्राम 11 से अधिक बड़ा है), और आउटपुट एक सकारात्मक पूर्णांक है।

  3. आपके कार्यक्रम में किसी भी प्रकार के पुस्तकालय कार्यों या मूल कार्यों का उपयोग नहीं किया जाना चाहिए जो सीधे टोपोलॉजी की संख्या की गणना करता है।

उदाहरण इनपुट (n का मान): 7

उदाहरण आउटपुट / वापसी: 9535241

आप यहां या यहां अपना रिटर्न वैल्यू चेक कर सकते हैं

बेशक, सबसे छोटा कोड जीतता है।


विजेता का फैसला किया जाता है, हालांकि, अगर छोटा कोड दिखाई देता है तो मैं विजेता को बदल सकता हूं।


क्या यह इस सदी के परिणाम देने के लिए है, या पर्याप्त रूप से शुद्धता का प्रमाण है?
पीटर टेलर

@Peter वास्तव में, मुझे नहीं पता कि इसमें कितना समय लगेगा। इसलिए कार्यक्रम की शुद्धता का प्रमाण काफी अच्छा है, लेकिन फिर भी कार्यक्रम को उचित समय में परिणाम देना चाहिए यदि n छोटा है, जैसे 4/5।
जमिनपी

@JiminP, ऐसा लगता है कि इसे n = 12 के लिए गणना करना दिन में एक पेपर के लायक था, और इसका कोई ज्ञात सूत्र नहीं है। 4 या 5 के लिए मुझे संदेह है कि यह कुछ ही मिनटों में क्रूर बल द्वारा संभव है।
पीटर टेलर

क्या 2 ^ X का अनुचित उपसमूह भी एक टोपोलॉजी है?
21

@FUZxxl: हाँ। मुझे लगता है कि इसे असतत टोपोलॉजी कहा जाता है
जमिनपी

जवाबों:


4

हास्केल, 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]

विनिर्देशन का लगभग सीधा कार्यान्वयन, कुछ मोनड जादू को मोडुलो।

के लिए बेहद धीमी गति से n > 4


5

पायथन, 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 कभी पूरा नहीं होगा।

अलग-अलग सेटों को पूर्णांक बिटमास्क द्वारा दर्शाया जाता है, और बिटकॉम्स के सेट द्वारा टोपोलॉजी। S(i,K)विभिन्न टोपोलॉजी की संख्या की गणना करता है जिसे आप Kबिटमास्क> = के साथ सेट और जोड़कर बना सकते हैं i


0

Zsh, 83 वर्ण

यह समाधान आपकी आवश्यकताओं के पत्र (लेकिन निश्चित रूप से, आत्मा) से मेल नहीं खाता है। निस्संदेह संख्याओं को और अधिक संपीड़ित करने का एक तरीका है।

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

-1

पायथन, 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} हैं।


क्या आप बता सकते हैं कि यह कैसे काम करता है?
तदर्थ गार्फ हंटर

@AdHocGarfHunter एक विस्तारित संस्करण जोड़ा गया।
user76284
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.