Chromatic नंबर का पता लगाएं


13

हैरानी की बात है, हम अभी तक ग्राफ रंग पर कोई चुनौती नहीं है!

एक अप्रत्यक्ष ग्राफ को देखते हुए, हम प्रत्येक शीर्ष को एक रंग दे सकते हैं जैसे कि कोई दो आसन्न कोने समान रंग साझा नहीं करते हैं। सबसे छोटी संख्या χ अलग इस लक्ष्य को हासिल करने के लिए आवश्यक रंग की कहा जाता है रंगीन संख्या ग्राफ की।

उदाहरण के लिए, निम्नलिखित रंगों की न्यूनतम संख्या का उपयोग करके एक वैध रंग दिखाता है:

(विकिपीडिया पर पाया गया)

तो इस ग्राफ का क्रोमैटिक नंबर 3 = 3 है

एक प्रोग्राम या फ़ंक्शन लिखें, जो कई संख्याओं को दिया गया है एन <16 (जो कि 1 से एन तक गिने जाते हैं ) और किनारों की एक सूची, एक ग्राफ के रंगीन संख्या को निर्धारित करती है।

आप इनपुट प्राप्त कर सकते हैं और किसी भी सुविधाजनक प्रारूप में आउटपुट का उत्पादन कर सकते हैं, जब तक कि इनपुट पूर्व-संसाधित न हो। यही है, आप एक स्ट्रिंग या एक सरणी का उपयोग कर सकते हैं, स्ट्रिंग में सुविधाजनक सीमांकक जोड़ सकते हैं या एक नेस्टेड सरणी का उपयोग कर सकते हैं, लेकिन आप जो कुछ भी करते हैं, समतल संरचना में नीचे दिए गए उदाहरणों के समान संख्याएं होनी चाहिए (समान क्रम में)।

आप अंतर्निहित ग्राफ़-सिद्धांत से संबंधित कार्यों (जैसे कि गणितज्ञ ChromaticNumber) का उपयोग नहीं कर सकते हैं ।

आप मान सकते हैं कि ग्राफ में कोई लूप नहीं है (एक किनारे को खुद से जोड़ने वाली एक धार) जो कि ग्राफ को अनियंत्रित कर देगा।

यह कोड गोल्फ है, सबसे छोटा उत्तर (बाइट्स में) जीतता है।

उदाहरण

आपके कार्यक्रम को कम से कम समय में इन सभी को हल करना होगा। (इसे सभी इनपुट्स को सही तरीके से हल करना होगा, लेकिन बड़े इनपुट्स में अधिक समय लग सकता है।)

पोस्ट को छोटा करने के लिए, निम्नलिखित उदाहरणों में, मैं किनारों को एक एकल अल्पविराम से अलग सूची में प्रस्तुत करता हूं। यदि आप चाहें तो आप लाइन ब्रेक का उपयोग कर सकते हैं या कुछ सुविधाजनक सरणी प्रारूप में इनपुट की अपेक्षा कर सकते हैं।

त्रिभुज (angle = 3)

3
1 2, 2 3, 1 3

६ रिंगों का "वलय" (2 = 2)

6
1 2, 2 3, 3 4, 4 5, 5 6, 6 1

5 कोने की "रिंग" (3 = 3)

5
1 2, 2 3, 3 4, 4 5, 5 1

ऊपर का उदाहरण चित्र (3 = 3)

6
1 2, 2 3, 3 4, 4 5, 5 6, 6 1, 1 3, 2 4, 3 5, 4 6, 5 1, 6 2

7 कोने के लिए उपरोक्त का सामान्यीकरण (of = 4)

7
1 2, 2 3, 3 4, 4 5, 5 6, 6 7, 7 1, 1 3, 2 4, 3 5, 4 6, 5 7, 6 1, 7 2

पीटरसन ग्राफ (3 = 3)

10
1 2, 2 3, 3 4, 4 5, 5 1, 1 6, 2 7, 3 8, 4 9, 5 10, 6 8, 7 9, 8 10, 9 6, 10 7

5 कोने का पूरा ग्राफ, प्लस डिस्कनेक्ट किया गया शीर्ष () = 5)

6
1 2, 1 3, 1 4, 1 5, 2 3, 2 4, 2 5, 3 4, 3 5, 4 5

8 कोने का पूरा ग्राफ (8 = 8)

8
1 2, 1 3, 1 4, 1 5, 1 6, 1 7, 1 8, 2 3, 2 4, 2 5, 2 6, 2 7, 2 8, 3 4, 3 5, 3 6, 3 7, 3 8, 4 5, 4 6, 4 7, 4 8, 5 6, 5 7, 5 8, 6 7, 6 8, 7 8

15 कोने () = 3) के साथ त्रिकोणीय जाली

15
1 2, 1 3, 2 3, 2 4, 2 5, 3 5, 3 6, 4 5, 5 6, 4 7, 4 8, 5 8, 5 9, 6 9, 6 10, 7 8, 8 9, 9 10, 7 11, 7 12, 8 12, 8 13, 9 13, 9 14, 10 14, 10 15, 11 12, 12 13, 13 14, 14 15

क्या आप उचित परिभाषित कर सकते हैं? 1 मिनट? 10?
16

@ThreeFx हाँ, 10 मिनट उचित है। आधा दिन नहीं है। मैं सीमा पर बहुत कठोर नहीं होना चाहता, क्योंकि तब मुझे उसी (मेरी) मशीन पर फिर से सब कुछ परखने की जरूरत है। लेकिन मान लें कि यह आपकी मशीन पर एक घंटे के भीतर पूरा होता है जो ठीक है।
मार्टिन एंडर

जवाबों:


4

पायथन 2.7 - 122 109 111 109 108 103

f=lambda n,e,m=1:any(all(t*m//m**a%m!=t*m//m**b%m for(a,b)in e)for t in range(m**n))and m or f(n,e,m+1)

उपयोग:

print f(5, [(1, 2), (2, 3), (3, 4), (4, 5), (5, 1)])

गुणसूत्र संख्या (एम) को बढ़ाकर बल को भंग करें और सभी संभावित रंग की जांच करें। एक रंग को आधार m में एक संख्या के रूप में वर्णित किया जा सकता है। तो संभावित रंग 0, 1, ..., मी ^ एन -1 हैं।

संपादित करें: 8 शीर्षकों का पूरा ग्राफ काफी लंबा होता है। लेकिन मेरा लैपटॉप लगभग 10 मिनट में हल कर देता है। अन्य परीक्षण मामलों में केवल कुछ सेकंड लगते हैं।


संपादित करें 2: पढ़ें कि प्रीप्रोसेसिंग की अनुमति है, इसलिए मैंने अनुलंबों के सूचकांक को 0 से शुरू करने दिया: t * m // m ** x% m से t // m ** a% m (-2)। लंबोदर भंग करें और m को फंक्शन परम्स में रखें (-11)


3 संपादित करें: प्रीप्रोसेसिंग की अनुमति नहीं है -> वापस t * m (+4), सरलीकृत // से / (-2)।


4 संपादित करें: किसी भी (-2) में वर्ग कोष्ठक हटा दें, धन्यवाद xnor।


5 संपादित करें: मोडुलो मीटर को दो बार लेने के बजाय, बस उन्हें घटाएं और बाद में मोडुलो (-1) का उपयोग करें। यह भी काफी बेहतर प्रदर्शन है। सभी टेस्टकेस को एक साथ मेरे लैपटॉप पर लगभग 25 सेकंड लगते हैं।


6 संपादित करें: 1 के बजाय पुनरावर्ती कॉल: और m + = 1 (-5)। धन्यवाद फिर से, xnor।


अच्छी विधि है। एक साधारण गोल्फ: आप कोष्ठकों में हटा सकते हैं all([...])यदि आप पार्न्स a,b(जो रिक्ति के कारण यहां कोई वर्ण नहीं है) में अतिक्रमण करते हैं ताकि allअतिरिक्त तर्क के लिए उन्हें गलती न करें। इसके अलावा, मुझे संदेह है कि अगर आप एक फंक्शन कॉल के साथ mथोड़ी देर के लूप का उपयोग करने के बजाय अगली बार कॉल करते हैं तो आप चार्ट को बचा सकते हैं ।
22

धन्यवाद, पुनरावर्ती दृष्टिकोण हालांकि +2 चार्ट लेता है। ए फॉर मीटर इन रेंज (एन + 1) दृष्टिकोण भी।
जकुबे

मैंने पुनरावर्ती दृष्टिकोण को थोड़ा anyऔर and/orचाल के साथ अनुकूलित किया , और फिर यह कुछ वर्णों को बचाता है f=lambda n,e,m=1:any(all(t*m//m**a%m!=t*m//m**b%m for(a,b)in e)for t in range(m**n))and m or f(n,e,m+1):।
xnor

2

जावा - २४१ २१ -

int k,j,c;int f(int n,int[]e){for(k=1;k<=n;k++)for(long p=0;p<x(n);p++){for(j=0,c=0;j<e.length;c=p%x(e[j])/x(e[j]-1)==p%x(e[j+1])/x(e[j+1]-1)?1:c,j+=2);if(c<1)return k;}return 0;}int x(int a){return(int)Math.pow(k,a);}

ऐसा करने का सबसे स्पष्ट तरीका यह है कि बाधाओं को बल दिया जाता है। प्रत्येक रंगीन संख्या के माध्यम से बस कदम रखें k, और प्रत्येक शीर्ष पर प्रत्येक रंग असाइन करें। यदि कोई पड़ोसी समान रंग नहीं है, तो आपके पास आपका नंबर है। यदि नहीं, तो साथ चलो।

इसके लिए परीक्षण के मामले में सबसे लंबा समय लगता है χ = 8(पूर्ण रेखांकन यहां चूसते हैं), लेकिन यह अभी भी 15 सेकंड (ठीक है, लगभग 100 सेकंड के साथ अन्य संपादन) में है।

इनपुट वर्टिकल की संख्या है n, और e[]ओप्स कॉमा अलग किए गए मानों के समान क्रम में दिए गए एज वर्टिस की एक सरणी ।

लाइन ब्रेक के साथ:

int k,j,c;
int f(int n,int[]e){
    for(k=1;k<=n;k++)
        for(long p=0;p<x(n);p++){
            for(j=0,c=0;
                j<e.length;
                c=p%x(e[j])/x(e[j]-1)==p%x(e[j+1])/x(e[j+1]-1)?1:c,
                j+=2);
            if(c<1)return k;
        }
    return 0;
}
int x(int a){return(int)Math.pow(k,a);}

ओह, और यह मानता है कि इनपुट कुछ प्रकार के रंगीन ग्राफ है। यदि कोई किनारा v1 से v1 तक लूप करता है, या कोई कोने नहीं हैं, तो इसे रंगीन नहीं किया जा सकता है और इसका आउटपुट 0. होगा। यह अभी भी बिना किनारों वाले ग्राफ़ के लिए काम करेगा χ=1, आदि।


2

पायथन 3 - 162

एक ही जानवर-बल दृष्टिकोण का उपयोग करता है, लेकिन उम्मीद की तेजी से संयोजन पीढ़ी के लिए itertools पुस्तकालय का उपयोग करता है। मेरी काफी साधारण मशीन पर <1 मिनट में पूरा 8-ग्राफ हल करता है।

import itertools as I
def c(n,v):
 for i in range(1,n+1):
  for p in I.product(range(i),repeat=n):
   if(0==len([x for x in v if(p[x[0]]==p[x[1]])])):return i

संपूर्ण 8-ग्राफ़ मामले के लिए उदाहरण उपयोग:

print(c(8,[x for x in I.combinations(range(8), 2)]))

1

हास्केल, 163 बाइट्स

p x=f(length x)(transpose x)1
f a[b,c]d|or$map(\x->and$g x(h b)(h c))(sequence$replicate a[1..d])=d|0<1=f a b c(d+1)
g a=zipWith(\x y->a!!x/=a!!y)
h=map(flip(-)1)

उपयोग इस तरह होगा:

p [[1, 2],[2, 3],[3, 1]]

बुनियादी जानवर बल दृष्टिकोण। यदि वे मान्य हैं, तो सभी संभव रंग संयोजनों की जांच करें। यहाँ कहने के लिए और कुछ नहीं, सिवाय इसके कि आगे भी इसे छोटा करने के लिए कोई सुझाव सुनकर मुझे खुशी हो;)


मैं कहता हूँ कि कोने को घटाना और उन्हें "प्रीप्रोसेसिंग" के रूप में गिना जाता है। "किसी भी सुविधाजनक प्रारूप" के साथ मेरे मन में जो था वह यह था कि आप फ्लैट सूची, नेस्टेड सूची, स्ट्रिंग, स्ट्रिंग के साथ सुविधाजनक सीमांकक आदि का चयन कर सकते थे ... लेकिन चपटा संरचना को चुनौती में निर्दिष्ट के समान होना चाहिए।
मार्टिन एंडर

@ मार्टिनबटनर ठीक है, मैं इसे बदल
दूंगा

@ThreeFx all idएक ही रूप में है and, any idके रूप में ही है orऔर any id$map f listबस के रूप में एक ही है any f list। भी, आप के साथ कुछ बातें कर सकता है g: आप के रूप में यह फिर से परिभाषित कर सकते हैं g a=(and.).zipWith(\x y->a!!x/=a!!y), यह इन्फ़िक्स बनाने के इनपुट से आदेश देने की बदलने (\x->g x b c)के साथ g b cया यहां तक कि यह पूरी तरह से अंक से मुक्त बनाने के लिए और यह इनलाइन। इनमें से कुछ एक साथ काम नहीं करते हैं, इसलिए उन सभी का प्रयास करें और सबसे अच्छा एक का चयन करें :)
गर्वित हेकलर

1
@ MartinBüttner मुझे लगता है कि यह तय है, Maaaaany बाइट्स की लागत के लिए। : डी
थ्री एफएक्स

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