ননোগ্রাম লাইন ব্রুট ফোর্স সমাধান


25

পটভূমি

ননোগ্রাম , পিক্রস বা গ্রিডার্স নামেও পরিচিত একটি ধাঁধা যেখানে লক্ষ্য করা যায় যে প্রতিটি লাইনে পরপর রঙিন কোষের সংখ্যা ব্যবহার করে 2 ডি গ্রিডের প্রতিটি ঘরটি রঙিন বা ফাঁকা রেখে দেওয়া উচিত কিনা the

নীচে সমাধান সহ ননোগ্রাম ধাঁধাটির একটি উদাহরণ।

সমস্যাটি হ'ল, কিছু বাণিজ্যিক ননোগ্রাম গেমস / মোবাইল অ্যাপ্লিকেশনগুলিতে এমন ধাঁধা রয়েছে যা হাত দিয়ে দ্রবণযোগ্য হয় না (যেমন একাধিক সমাধান থাকে, বা গভীর ব্যাকট্র্যাকিংয়ের প্রয়োজন হয়)। যাইহোক, তারা প্লেয়ার, যেখানে কিছু জীবন অফার এক জীবন হারিয়ে গেছে যখন আপনি একটি কক্ষটির সঠিক উত্তর ফাঁকা রঙ চেষ্টা । সুতরাং এখন সময় those দুষ্টু "ধাঁধা" গুরুতর জোর করার!

কাজটি সহজ করার জন্য, কেবল একটি লাইনটির ক্লু এবং অন্য কিছু দিয়ে কল্পনা করুন:

3 7 | _ _ _ _ _  _ _ _ _ _  _ _ _ _ _

[3,7]সংকেত সনাক্ত করুন, এবং লাইন দৈর্ঘ্য 15 কোষ হয়। যেহেতু এটির একাধিক সম্ভাব্য সমাধান রয়েছে, তাই এই লাইনটি পুরোপুরি সমাধান করার জন্য আমাদের কিছু জীবন ঝুঁকিপূর্ণ করা উচিত (অর্থাত্ সমস্ত রঙিন কোষ নির্ধারণ করুন)।

চ্যালেঞ্জ

সূত্রের (একটি ইতিবাচক পূর্ণসংখ্যার একটি তালিকা) একটি রেখা দেওয়া এবং রেখার দৈর্ঘ্য, সর্বাধিক সংখ্যক জীবন আপনি হারাবেন তা ধরে নিবেন, ধরে নিবেন যে আপনি অনুকূল কৌশলটির সাথে লাইনটিকে নিষ্ঠুরূপে চাপিয়েছেন।

মনে রাখবেন আপনি রঙিন কক্ষগুলি সর্বদা অনুমান করেন । প্রকৃত গেমগুলিতে, খালি কোষগুলি অনুমান করা (সঠিক বা ভুল) আপনার জীবনে কোনও প্রভাব ফেলবে না, সুতরাং আপনি ধাঁধাটি "সমাধান" করতে পারবেন না।

এছাড়াও, আপনি ধরে নিতে পারেন ইনপুটটি সর্বদা একটি বৈধ ননোগ্রাম লাইনের প্রতিনিধিত্ব করে, তাই এর মতো কোনও কিছুর বিষয়ে আপনার চিন্তা করার দরকার নেই [6], 5

ব্যাখ্যা

প্রথমে কিছু সহজ উদাহরণ তাকান।

[1,2], 5

এই লাইনের জন্য ঠিক তিনটি সম্ভাবনা রয়েছে ( Oএটি একটি রঙিন ঘর, .একটি খালি):

O . O O .
O . . O O
. O . O O

আমরা যদি সেল 0 টি রঙ করার চেষ্টা করি (বাম থেকে 0-ভিত্তিক সূচক), নিম্নলিখিতগুলির মধ্যে একটি ঘটে:

  • ঘরটি সঠিকভাবে বর্ণযুক্ত। এখন আমাদের দুটি সম্ভাবনা রয়েছে এবং লাইনটি পুরোপুরি সমাধানের জন্য আমরা সেল 2 এবং সেল 4 এর মধ্যে চয়ন করতে পারি। যে কোনও ক্ষেত্রে, আমরা সবচেয়ে খারাপ ক্ষেত্রে একটি জীবন হারাব।
  • ঘরটি খালি, এবং আমরা একটি জীবন হারাব। এই ক্ষেত্রে, আমরা ইতিমধ্যে এই লাইনের অনন্য সমাধানটি সনাক্ত করেছি, সুতরাং আমরা 1 প্রাণ হারিয়ে শেষ করেছি।

সুতরাং, জন্য উত্তর [1,2], 51।

[5], 10

বাইনারি অনুসন্ধান? নাঃ।

সর্বাধিক সুস্পষ্ট প্রথম পছন্দটি 4 বা 5, যা খালি থাকলে (1 জীবনের দামে) এক সম্ভাবনা প্রকাশ করে। ধরা যাক আমরা প্রথম 4 টি বেছে নিয়েছি। যদি 4 নম্বর ঘরটি প্রকৃতপক্ষে রঙিন হয়, তবে আমরা এটিকে বাম দিকে প্রসারিত করব, অর্থাৎ একটি প্রাণ হারিয়ে না আসা পর্যন্ত 3, 2, 1 এবং 0 চেষ্টা করুন (বা ঘর 0 টি রঙিন হয়ে গেছে, তবে আমরা কোনওরকম জীবন ব্যয় করব না)। যখনই কোনও জীবন হারিয়ে যায়, আমরা সমাধানটি অনন্যভাবে নির্ধারণ করতে পারি, উদাহরণস্বরূপ যদি আমরা এরকম কিছু দেখি:

_ _ X O O _ _ _ _ _

তাহলে আমরা ইতিমধ্যে জানি উত্তরটি হ'ল:

. . . O O O O O . .

সুতরাং, জন্য উত্তরও [5], 101।

[3,7], 15

সেল 11 দিয়ে শুরু করুন, যা খালি থাকলে নীচের সমাধানটি এখনই প্রকাশ করবে।

O O O . O O O O O O O X . . .

তারপরে 12 চেষ্টা করুন, যা খালি থাকলে দুটি সম্ভাবনা দেয় যা 1 অতিরিক্ত জীবনের ব্যয়ে সমাধান করা যায়।

O O O . . O O O O O O O X . .
. O O O . O O O O O O O X . .

এখন চেষ্টা করুন ২. খালি থাকলে, এটি তিনটি সম্ভাবনার দিকে নিয়ে যায় যা [1,2], 5উদাহরণের মতো একইভাবে সমাধান করা যায় ।

. . X O O O . O O O O O O O .
. . X O O O . . O O O O O O O
. . X . O O O . O O O O O O O

আপনি যদি এই পদ্ধতিতে ঝুঁকি হ্রাস করতে থাকেন তবে আপনি সর্বোচ্চ দিয়ে যে কোনও সমাধানে পৌঁছাতে পারবেন। 2 জীবন ব্যয়।

পরীক্ষার মামলা

[1,2] 5 => 1
[2] 5 => 2
[1] 5 => 4
[] 5 => 0
[5] 10 => 1
[2,1,5] 10 => 0
[2,4] 10 => 2
[6] 15 => 2
[5] 15 => 2
[4] 15 => 3
[3,7] 15 => 2
[3,4] 15 => 3
[2,2,4] 15 => 4
[1,1,1,1,1,1,1] 15 => 2

[2,1,1,3,1] 15 => 3
[1,1,1,2,1] 15 => 5

শেষ দুটি ক্ষেত্রে, সর্বোত্তম কৌশলটি সর্বনিম্ন ফাঁকাগুলির মধ্য দিয়ে যাচ্ছে না , তবে কেবল বাম থেকে ডানে (বা ডান থেকে বাম)। এটি প্রকাশ করার জন্য @ ক্র্যাশোজকে ধন্যবাদ।

বিধি

স্ট্যান্ডার্ড বিধি প্রযোজ্য। বাইটের মধ্যে স্বল্পতম বৈধ জমা

খয়রাত

যদি কেউ বহু-কালীন অ্যালগরিদম (নির্ভুলতার প্রমাণ সহ) নিয়ে আসে তবে আমি এই জাতীয় সমাধানের জন্য +100 অনুগ্রহ প্রদান করব।


কিসের জন্য উদ্দেশ্যে আউটপুট [6], 5?
ফাঁস নুন

আপনি যখন অনুমান করেন তখন আপনার কি অনুমান করতে হবে যে ঘরটি কালো, অথবা আপনি কী কালো বা সাদা অনুমান করতে পারেন?
ফেডারস

@ লাকিউন এটি একটি অবৈধ লাইন। আপনি ধরে নিতে পারেন ইনপুটটি সর্বদা একটি বৈধ ননোগ্রাম লাইন।
বুদ্বুদ

@ ফেয়ারসাম আপনি সবসময় রঙিন কোষগুলি অনুমান করেন। প্রকৃত গেমগুলিতে, একটি ফাঁকা ঘর (সঠিক বা ভুল) অনুমান করার ফলে আপনার জীবনে কোনও প্রভাব নেই, তাই আপনি এটির সাথে কোনও প্রতিক্রিয়া পেতে পারেন না।
বুদ্বুদ

কল্পনাপ্রসূত চ্যালেঞ্জ
এনারিকো বোর্বা

উত্তর:


19

রুবি , 85 বাইট

f=->l,n,s=n-l.sum-l.size+1{*a,b=l;b&&s>0?(a[0]?1+f[a,n-b-2,s-1]:(n.to_f/b).ceil-1):0}

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

l=[l1,l2,...,lx]xn

lx
nlx
nlx1+f(l,nlx)
1+f(l~,nlx2)l~l

f(l,n)={0,if 1xli+x1nnlx1if x=11+max{f(l,nlx)f(l~,nlx2),otherwise

এখানে একটি উদাহরণ _অজানা, Xএকটি পরিচিত স্থান, Oএকটি পরিচিত রঙিন ঘর এবং Lজীবন হারিয়ে গেছে

[2,2,4] 15                  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
(1) -> [2,2,4] 11           _ _ _ _ _ _ _ _ _ _ _ L X X X
    (1) -> [2,2,4] 7        _ _ _ _ _ _ _ L X X X L X X X
        0                   X X X L X X X L X X X L X X X
    (2) -> [2,2] 5          _ _ _ _ _ X O O O O L L X X X
        0                   O O X O O X O O O O L L X X X 
(2) -> [2,2] 9              _ _ _ _ _ _ _ _ _ X O O O O L
    (1) -> [2,2] 7          _ _ _ _ _ _ _ L X X O O O O L
        (1) -> [2,2] 5      _ _ _ _ _ L X L X X O O O O L
            0               O O X O O L X L X X O O O O L
        (2) -> [2] 3        _ _ _ X O O L L X X O O O O L
            1               O O L X O O L L X X O O O O L               
    (2) -> [2] 5            _ _ _ _ _ X O O L X O O O O L
        2                   O O L L X X O O L X O O O O L

এটি একটি বাইনারি গাছ তৈরি করে, প্রাণ হারানোর সংখ্যা পেতে আমাদের কেবল গাছের সর্বোচ্চ উচ্চতা গণনা করতে হবে। তবে এটি এটিকে তোলে কারণ আমরা সমস্ত শাখাকে মূল্যায়ন করি। আমরা আরও ভাল করতে পারিO(2n)

আসুন একটি ব্যয় ফাংশন যা আমাদের প্রতিটি পদক্ষেপে ডান শাখা "চয়ন" করতে সহায়তা করবে।h

h(l,n)=n1xlix+1

h superfuous শূণ্যস্থান আমরা আছে যদি আমরা মাঝে এক স্থান সঙ্গে সব সংকেত সনাক্ত প্যাক সংখ্যা গণনা করে। সুতরাং এটি মূলত একটি সূচক যা আমরা উদাহরণস্বরূপ সমাধান করতে কতটা জীবন যাপন করতে চাই, তত বেশি, তত বেশি জীবন প্রয়োজন। ধারণাটি হ'ল আমাদের পুনরাবৃত্ত সূত্রে এই সূচকটি প্রয়োগ করা।

সংজ্ঞা অনুসারে আমাদের h

h(l,nlx)=nlx1xlix+1=(n1xlix+1)lx=h(l,n)lx

এবং,

h(l~,nlx2)=nlx21x1li(x1)+1=(n1xlix+1)1=h(l,n)1

তারপরে,

h(l,n)={0,if 1xli+x1nnlx,if x=1max{h(l,nlx)+lxh(l~,nlx2)+1,otherwise

আমরা চাই পূর্ণবিস্তার প্রতিটি পদে পদে সবচেয়ে খারাপ ক্ষেত্রে পেতে তাই পুনরাবৃত্তি দুই এক্সপ্রেশন মধ্যে পার্থক্য পরীক্ষা করা যাকh

[h(l,nlx)+lx][h(l~,nlx2)+1]=nlxn1xlix+1+lx[nlx21x1li(x1)+1+1]=2

[h(l,nlx)+lx][h(l~,nlx2)+1]=2[h(l,nlx)+lx][h(l~,nlx2)+1]<0[h(l,nlx)+lx]<[h(l~,nlx2)+1]
সুতরাং 2 য় এক্সপ্রেশনটি সর্বদা সর্বোচ্চ, আমরা প্রথমটি সরিয়ে ফেলতে পারি

h(l,n)={0,if 1xli+x1nnlx,if x=1h(l~,nlx2)+1otherwise

অবশেষে পুনরাবৃত্ত সংজ্ঞা আমাদের দেখায় যে ফাংশন বিকল্প (2) সর্বদা সবচেয়ে খারাপ পরিস্থিতি (সম্ভাব্যতার সর্বাধিক সংখ্যার অর্থাত্ সর্বাধিক )hfh

f(l,n)={0,if 1xli+x1nnlx1if x=11+f(l~,nlx2),otherwise

প্রতিটি পদক্ষেপে আমরা কমপক্ষে 3 দ্বারা হ্রাস করি এবং এখন একটি একক পুনরাবৃত্ত কল রয়েছে, জটিলতা হ'লnO(n)


2
অবিশ্বাস্য প্রথম পোস্টে পিপিসিজিতে স্বাগতম!
কোলে

1
@ কোল এটি তাদের প্রথম পোস্ট নয়, তবে এটি অবশ্যই অবিশ্বাস্য! খুব চতুর পন্থা +1
মিঃ এক্সকোডার

1
দুর্দান্ত কাজ. ততক্ষণ যদি কেউ কোনও গুরুতর যৌক্তিক ত্রুটি না খুঁজে পায় তবে আমি এই অনুদানটি 2 দিন পরে দেব।
বুবলার

2

পাইথন, 303 289 বাইট

একটি দীর্ঘ সময় প্রথম গল্ফ, তাই অতিরিক্ত চর্বি অনেক হতে পারে। ( 14 বাইট মূল্য সন্ধানের জন্য জো কিং ধন্যবাদ ।)

ফাংশন এফ সমস্ত সম্ভাব্য ব্যবস্থা জেনারেট করে (যদিও সর্বদা প্রথম অক্ষর হিসাবে খালি থাকে তবে এটি কল করার আগে আমরা দৈর্ঘ্য 1 দ্বারা বাড়িয়ে দেই যতক্ষণ না ঠিক আছে)। ফাংশন জি কয়েকটি সংখ্যা ফাঁকা করে এবং পুনরাবৃত্তি করে পজিশনটি ছাঁটাই করে। ফাংশন এইচ তাদের একসাথে রাখে।

f=lambda l,n:["."*i+"X"*l[0]+c for i in range(1,n-l[0]+1)for c in f(l[1:],n-i-l[0])]if l else["."*n]
def g(q,n):O,X=min([[[p[:i]+p[i+1:]for p in q if p[i]==u]for u in".X"]for i in range(n)],key=lambda x:len(x[0]));return(len(q)>1)*1and max(1+g(O,n-1),g(X,n-1))
h=lambda l,n:g(f(l,n+1),n+1)

উদাহরণগুলি সমস্ত ঠিক আছে:

>>> h([3,7],15)
2
>>> h([3,4],15)
3
>>> h([1,1,1,2,1],15)
6


1
তুমি ফিরে অনুমতি আছে Falseজন্য 0? যদি তাই হয়, আপনি পরিবর্তন করতে পারেন (len(q)>1)*1andথেকে len(q)>1and। তুমি ফিরে করার অনুমতি দেওয়া যদি না Falseজন্য 0, তাহলে সেই না, কিন্তু পরিবর্তন g(f(l,n+1),n+1)করতে 1*g(f(l,n+1),n+1)এবং এটা করবে না এখনও এক বাইট সংরক্ষণ
Zachary

1
আরও ভাল করে: ক্ষেত্রে Falseজন্য অনুমোদিত নয় 0, পরিবর্তে পরিবর্তন g(f(l,n+1),n+1)করতে 1*g(f(l,n+1),n+1), এর এটি পরিবর্তন+g(f(l,n+1),n+1)
Zachary

2
এছাড়াও, h=আপনার বাইট গণনাতে আপনাকে গণনা করতে হবে না
জাচারা

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