ক্রোম্যাটিক নম্বরটি সন্ধান করুন


13

আশ্চর্যজনকভাবে, গ্রাফ রঙিন করার বিষয়ে আমাদের কাছে এখনও কোনও চ্যালেঞ্জ ছিল না!

একটি অপরিবর্তিত গ্রাফ দেওয়া, আমরা প্রতিটি প্রান্তকে এমন একটি রঙ দিতে পারি যে কোনও দুটি সংলগ্ন প্রান্ত একই রঙ ভাগ করে না। সবচেয়ে ছোট সংখ্যা χ স্বতন্ত্র এই অর্জন করা প্রয়োজন রঙের বলা হয় বর্ণীয় সংখ্যা গ্রাফ।

উদাহরণস্বরূপ, নীচে ন্যূনতম সংখ্যার রং ব্যবহার করে একটি বৈধ রঙ দেখায়:

(উইকিপিডিয়ায় পাওয়া গেছে)

সুতরাং এই গ্রাফের ক্রোম্যাটিক সংখ্যাটি = 3 = 3

একটি প্রোগ্রাম বা ফাংশন লিখুন যা N <16 (যা 1 থেকে N তে সংখ্যাযুক্ত ) এবং প্রান্তগুলির একটি তালিকা দেওয়া হয়েছে, একটি গ্রাফের ক্রোম্যাটিক সংখ্যা নির্ধারণ করে।

আপনি ইনপুটটি পেতে এবং কোনও সুবিধাজনক বিন্যাসে আউটপুট উত্পাদন করতে পারে, যতক্ষণ না ইনপুট প্রাক-প্রক্রিয়াজাত না হয়। এটি হল, আপনি একটি স্ট্রিং বা একটি অ্যারে ব্যবহার করতে পারেন, স্ট্রিংয়ে সুবিধাজনক ডিলিমিটার যুক্ত করতে পারেন বা নেস্টেড অ্যারে ব্যবহার করতে পারেন, তবে আপনি যা করেন না কেন সমতল কাঠামোতে নীচের উদাহরণগুলির (একই ক্রমে) একই সংখ্যার সমন্বয় থাকা উচিত।

আপনি বিল্ট-ইন গ্রাফ-তত্ত্ব সম্পর্কিত ফাংশন (ম্যাথমেটিকার মতো ChromaticNumber) ব্যবহার করতে পারবেন না ।

আপনি ধরে নিতে পারেন যে গ্রাফটির কোনও লুপ নেই (একটি প্রান্তটি নিজের সাথে একটি প্রান্তকে সংযুক্ত করে) এটি গ্রাফটিকে অস্বচ্ছল করে তুলবে।

এটি কোড গল্ফ, সংক্ষিপ্ত উত্তর (বাইটে) জিতেছে।

উদাহরণ

আপনার প্রোগ্রামটি অবশ্যই কমপক্ষে যুক্তিসঙ্গত পরিমাণে এই সমস্তগুলি সমাধান করতে হবে। (এটি অবশ্যই সমস্ত ইনপুট সঠিকভাবে সমাধান করতে পারে তবে বড় ইনপুটগুলির জন্য এটি বেশি সময় নিতে পারে))

পোস্টটি সংক্ষিপ্ত করতে, নিম্নলিখিত উদাহরণগুলিতে, আমি একক কমা-বিচ্ছিন্ন তালিকায় প্রান্তগুলি উপস্থাপন করছি। আপনি যদি পছন্দ করেন তবে পরিবর্তে লাইন ব্রেক ব্যবহার করতে পারেন বা কিছু সুবিধাজনক অ্যারে ফর্ম্যাটে ইনপুটটি আশা করতে পারেন।

ত্রিভুজ (χ = 3)

3
1 2, 2 3, 1 3

6 টি শীর্ষ কোণের "রিং" (χ = 2)

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

5 টি শীর্ষ কোণের "রিং" (χ = 3)

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

উপরে চিত্র উদাহরণ (χ = 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

Vert টি শীর্ষকে (4 = 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)

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 টি শীর্ষ কোণের সম্পূর্ণ গ্রাফ ( graph = 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?
থ্রিএফএক্স

@ থ্রিএফএক্স হ্যাঁ, 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)])

ক্রোম্যাটিক সংখ্যা (মি) বাড়িয়ে ব্রুট ফোর্স এবং সমস্ত সম্ভাব্য রঙগুলি পরীক্ষা করে দেখুন। একটি রঙ বেজ মি তে একটি সংখ্যা হিসাবে বর্ণনা করা যেতে পারে। সুতরাং সম্ভাব্য রঙগুলি 0, 1, ..., মি ^ n-1।

সম্পাদনা: 8 টির সমাপ্তির সম্পূর্ণ গ্রাফটি বেশ দীর্ঘ সময় নেয়। তবে আমার ল্যাপটপ এটি প্রায় 10 মিনিটের মধ্যে সমাধান করে। অন্যান্য পরীক্ষার ক্ষেত্রে কয়েক সেকেন্ড সময় লাগে।


সম্পাদনা 2: পড়ুন যে প্রিপ্রোসেসিংয়ের অনুমতি দেওয়া হয়েছে, তাই আমি 0 এর সাথে সূচি সূচকটি শুরু করতে দিয়েছি: t * m // m ** x% m থেকে t // m ** a% m (-2)। ল্যাম্বদা দ্রবীভূত করুন এবং ফাংশন প্যারামগুলিতে এম লাগান (-11)


3 সম্পাদনা করুন: প্রিপ্রোসেসিং অনুমোদিত নয় -> টি * এম (+4) এ ফিরে, সরলীকৃত // থেকে / (-2)।


4 সম্পাদনা করুন: যেকোন (-2) এর স্কোয়ার ব্র্যাকেটগুলি সরান, ধন্যবাদ xnor।


5 সম্পাদনা করুন: দু'বার মডিউল এম নেওয়ার পরিবর্তে কেবল তাদের বিয়োগ করুন এবং পরে মডুলো (-1) ব্যবহার করুন। এটিও বেশ পারফরম্যান্সের উন্নতি। সমস্ত টেস্টকেস একসাথে আমার ল্যাপটপে প্রায় 25 সেকেন্ড সময় নেয়।


সম্পাদনা 6: 1 এবং m + = 1 (-5) এর পরিবর্তে পুনরাবৃত্ত কল। ধন্যবাদ আবার, xnor।


দুর্দান্ত পদ্ধতি। একটি সাধারণ গল্ফ: আপনি all([...])পেরেনগুলিতে এনক্যাস করলে ব্র্যাকেটগুলি সরিয়ে ফেলতে পারেন a,b(যার ব্যবধানের কারণে এখানে কোনও অক্ষর ব্যয় হয় না) যাতে allঅতিরিক্ত যুক্তির জন্য ভুল না করে। এছাড়াও, আমি সন্দেহ করি আপনি যদি mকিছুক্ষণ লুপ ব্যবহার না করে পরবর্তী সর্বোচ্চে কোনও ফাংশন কল দিয়ে পুনরাবৃত্তি করেন তবে আপনি চরগুলি সংরক্ষণ করতে পারবেন ।
xnor

ধন্যবাদ, পুনরাবৃত্তি পদ্ধতির যদিও +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)
এক্সএনওর

2

জাভা - 241 218

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 সেকেন্ডের নীচে রয়েছে (ঠিক আছে, সর্বশেষ সম্পাদনা সহ প্রায় 100s)।

ইনপুটটি হ'ল শীর্ষে সংখ্যা 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);}

ওহ, এবং এটি অনুমান করে যে ইনপুটটি কোনও ধরণের আকর্ষণীয় গ্রাফ। যদি কোন প্রান্তটি ভি 1 থেকে ভি 1 এ লুপ করে, বা কোনও शिरোখণ্ড না থাকে, তবে এটি রঙিন হতে পারে না এবং 0 আউটপুট দেয় still এটি এখনও কোনও প্রান্ত χ=1, ইত্যাদি সহ গ্রাফের জন্য কাজ করবে etc.


2

পাইথন 3 - 162

একই ব্রুট-ফোর্স পদ্ধতির ব্যবহার করে, তবে আশাকরি দ্রুত সংমিশ্রণ প্রজন্মের জন্য এটিরটুলস লাইব্রেরি ব্যবহার করে। আমার মোটামুটি সাধারণ মেশিনে <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
@ মার্টিনবাটনার আমি মনে করি এটি মায়ানাইট বাইটের দামের জন্য স্থির। : ডি
থ্রিএফএক্স

1
আপনি কীভাবে ইনপুটটিতে উল্লম্ব সংখ্যা ছাড়াই 7 তম উদাহরণটি সমাধান করছেন?
মার্টিন এন্ডার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.