6 বা তার চেয়ে কম চালগুলিতে মাস্টারমাইন্ড সমাধান করা


24

আপনার লক্ষ্য হ'ল এমন একটি প্রোগ্রাম লিখুন যা কোনও মাস্টারমাইন্ড ধাঁধা 6 বা তার চেয়ে কম চালের সমাধান করবে solve

পটভূমি

মাস্টারমাইন্ড একটি বোর্ড গেম। গেমের লক্ষ্যটি হ'ল অন্য খেলোয়াড়ের দ্বারা লুকানো 4 টি রঙিন পেগের সংমিশ্রণের (রঙ এবং ক্রম) ঠিক অনুমান করা। যখন কোনও অনুমান করা হয়, অন্য খেলোয়াড় 0 থেকে 4 এর মধ্যে সাদা এবং বা লাল রঙের পেগসের সাথে সাড়া দেয়। একটি লাল পেগ যেখানে রঙ এবং অবস্থান সঠিক। একটি সাদা পেগ যেখানে রঙটি বাকী টুকরোতে উপস্থাপন করা হয় তবে এটি ভুল জায়গায় রয়েছে। যদি অনুমানের মধ্যে সদৃশ রঙ থাকে তবে গোপনে কেবল বর্ণের সাথে প্রতি রঙ দেওয়া হবে। (সুতরাং - যদি গোপনে 1 টি নীল থাকে, এবং অনুমানটি সঠিক স্থানে একটির সাথে 2 টি ব্লুজ থাকে, সেখানে একটি লাল পেগ দেওয়া হত)। এখানে 6 টি বিভিন্ন রঙ রয়েছে এবং সদৃশগুলি ব্যবহার করা যেতে পারে।

উদাহরণস্বরূপ, কোনও গেম নিম্নলিখিত হিসাবে যেতে পারে: (সমাধানটি রেড গ্রিন গ্রিন ব্লু বলে ধরে নেওয়া হচ্ছে)

1:  Blue Purple Black Green - 2 white pegs
2:  Green Red Black Blue    - 2 white pegs, 1 red peg
3:  Green Green Green Blue  - 3 red pegs
4:  Red Green Green Blue    - 4 red pegs

বিধিগুলি উইকিপিডিয়ায় প্রসারিত

আবশ্যকতা

  • প্রোগ্রামটি অবশ্যই স্টিডিনের কাছ থেকে পড়তে হবে এবং স্টাডআউটে লিখতে হবে
  • আমি রংগুলির পরিবর্তে সরলতার জন্য নম্বরগুলি ব্যবহার করব। অনুমানের সংমিশ্রণটি 1 থেকে 6 এর মধ্যে 4 নম্বর হবে
  • একটি নিউলাইন দিয়ে শেষ হতে তাদের 1 টি 6 থেকে 4 টি পৃথক সংখ্যার সিরিজ হিসাবে তাদের অনুমানগুলি আউটপুট করতে হবে। এই ক্ষেত্রে:

    1 5 2 2 \ n

  • প্রোগ্রামটি পরবর্তীকালে 0 এবং 4 এর মধ্যে 2 পূর্ণসংখ্যাটি একটি স্পেস দ্বারা বিচ্ছিন্ন করে এবং একটি নতুন লাইন দিয়ে শেষ করার পরে ইনপুট হিসাবে গ্রহণ করবে। প্রথমটি হ'ল সাদা পেগের পরিমাণ, দ্বিতীয়টি লাল পগের পরিমাণ।

  • "0 4" (4 টি লাল পেগ) এর ইনপুটটিতে প্রোগ্রামটি অবশ্যই শেষ করতে হবে
  • প্রোগ্রামটি অবশ্যই 6 টি টার্নের মধ্যে কোনও ধাঁধা সমাধান করতে সক্ষম হবে (আপনার প্রোগ্রাম আউটপুট দিচ্ছে, প্রতিক্রিয়া ইনপুটটি 1 টার্নের পরে) এটির কম সমাধান করতে সক্ষম হওয়ার জন্য কোনও বোনাস নেই (প্রমাণ জটিলতার কারণে)।
  • সমাধানটি অবশ্যই সম্পূর্ণ অভ্যন্তরীণ এবং উত্সটিতে অন্তর্ভুক্ত থাকতে হবে। স্ট্যান্ডার্ড লাইব্রেরি শুধুমাত্র অনুমোদিত। সমাধান তাই অন্য কোনও ফাইল (যেমন অভিধান) বা ইন্টারনেটের উপর নির্ভর করতে পারে না।

উদাহরণ ইনপুট / আউটপুট

> is your programs output
< is the responding input
Solution is 1 5 6 6

> 1 2 3 4
< 0 1
> 4 1 6 6
< 1 2
> 1 6 5 6
< 2 2
> 1 5 6 6
< 0 4 

স্কোরিং

  • এটি খাঁটি এবং সাধারণ কোড গল্ফবাইটস মধ্যে সংক্ষিপ্ত সমাধান ।

এটি আমার প্রথম কোড গল্ফ প্রশ্ন। যদি আমি কিছু ভুল করে ফেলেছি তবে আমার ক্ষমা চাই, তবে আমি যথাসাধ্য চেষ্টা করেছি যে কোনও দ্বিধাগ্রস্থতা নেই এবং যতটা সম্ভব আইনশৃঙ্খলা রোধ করা সম্ভব নয় rules যদি আমি অস্পষ্ট বা অস্পষ্ট হয়ে থাকে তবে দয়া করে বিনা দ্বিধায় প্রশ্ন জিজ্ঞাসা করুন।


1
আপনার উদাহরণ ইনপুটে / আউটপুট করা উচিত নয় 1 2 3 4আসতে 0 1?
গাফি

1
এবং উদাহরণ লেখায়, "সবুজ সবুজ সবুজ নীল" পাশাপাশি একটি সাদা খোঁচা দেওয়া উচিত নয় (প্রথম সবুজ জন্য)? সম্পাদনা - উইকিপিডিয়া স্পষ্ট করে যে কোনও সাদা দেওয়া উচিত নয়, যেমনটি আপনি লিখেছেন। তবে আমি মনে করি সাদা / কালো নিয়মগুলি প্রশ্নে স্পষ্ট করে বলা উচিত।
ugoren

এটি কত ধীরে কাজ করার অনুমতি দেওয়া হবে?
21-28

@ গাফি - একেবারে ঠিক - স্থির
লুচক

1
সাদা খোঁচার জন্য বিধি এখানে বর্ণিত হয় না। ধরুন আপনি 1234 বেছে নিয়েছেন এবং আমি অনুমান করি 5611। আমার 1 টি উভয়ই সঠিক জায়গায় সঠিক রঙ, সুতরাং আপনি যে নিয়মটি বর্ণনা করেছেন সেভাবেই আমি বলব যে আমি 2 সাদা পাব। তবে না - উইকিপিডিয়া বলে যে এটি 1 সাদা। ভুল পদ্ধতিটি প্রোগ্রাম করাও সহজ (তবে স্টিভেন রাম্বালস্কি উইকিপিডিয়া নিয়মকে সঠিকভাবে প্রয়োগ করেছেন)।
ugoren

উত্তর:


8

পাইথন 2 পাইথন 3, 359 365 338 অক্ষর

from itertools import*
from collections import*
m=h=set(product(*['123456']*4))
def f(g,k):b=sum(x==y for x,y in zip(g,k));return'%s %s'%(sum(min(g.count(c),k.count(c))for c in set(g))-b,b)
while len(m)>1:g=min(h,key=lambda g:max(Counter(f(g,k)for k in m).values()));print(*g);s=input();m=set(x for x in m if s==f(g,x))
print(*(m.pop()))

মজার বিষয় হল, আমার পাঁচটি চরিত্রের পরিবর্তনশীল নামটি উপলব্ধি করতে এটি আমাকে অনেকগুলি সম্পাদনা করেছে।

আমি দীর্ঘ আমদানি পছন্দ করি না। দেখে মনে হচ্ছে collections.Counterযে আমদানিটি সাশ্রয় করবে এর জন্য আমার কোনও প্রতিস্থাপন কার্যকর করতে সক্ষম হওয়া উচিত ।

আমিও শেষটি পছন্দ করি না print(*(m.pop()))। মনে হচ্ছে এটি লুপের মধ্যে অদৃশ্য হয়ে যাওয়ার উচিত, তবে আমি এটি আর দীর্ঘ না করে এটি করার কোনও উপায় খুঁজে পাচ্ছি না।


TypeError: join() takes exactly one argument (2 given)উপর return j(sum(min(g.count(c),k.count(c))for c in set(g))-b,b)। এছাড়াও, যোগফল () একটি পূর্বাবস্থায় ফিরে আসে, যখন জে (স্ট্রিয়র জোইন) একটি পুনরাবৃত্ত হওয়া উচিত
ব্লেজার

আমার লুপ কাঠামোটি চূড়ান্ত থেকে মুক্তি পেয়েছে printএবং আমি মনে করি এটি কিছুটা খাটো। এটি অনুরোধ করা আচরণের সাথে আরও ভাল মেলে (উত্তরটি জানার পরিবর্তে "4 0" এ থামানো)। এবং len(m)>1== m[1:]। আমদানি আসলে বিরক্তিকর - দুর্দান্ত from a,b import *হত।
ugoren

যখনই এটি সঠিক মনে হয় এই প্রোগ্রামটি প্রস্থান করে। একসময় আমি এটি চালিয়েছিলাম এবং এটি 5 টি অনুমানে থামে, এটি সঠিক ছিল না। পরের বার এটি 4 টি অনুমানের দিকে থেমেছিল এবং এটি সঠিক ছিল, তবে আমি 4 0এখনও ইনপুটটিও পাইনি , যা উদ্দেশ্যগত মানদণ্ডে রয়েছে এবং অন্যান্য সময় এটি ব্যতিক্রম সহ প্রস্থান করবে:print(*(m.pop())) KeyError: 'pop from an empty set'
ব্লেজার

@Blazer। এই আউটপুটটির কারণ হিসাবে পরীক্ষার কেসগুলি কী কী?
স্টিভেন রাম্বালস্কি

@ ব্লাজার: 4 0চারটি সাদা পেগ। আমার মনে হয় আপনার স্কোরিংটি বিপরীত হয়েছে।
স্টিভেন রাম্বালস্কি

7

হাস্কেল, 317 304

q[0,4]_=error""
q[n,m]l=(\s->all(==4-m)[g s,n+g(u(foldr((u((.drop 1).(++)).).break.(==)))$unzip s)]).c(u(/=)).zip l
u=uncurry;m=map;g=length;c=filter
f a=[head.c(($(zipWith q(take n a)$f a)).all.flip($)).sequence$replicate 4[1..6]|n<-[0..]]
main=interact$unlines.m(unwords.m show).f.m(m read.words).lines

আমি নিখুঁত ক্রিয়ামূলক ইন্টারেক্টিভ প্রোগ্রাম লিখতে ভালবাসি! তবে অবশ্যই এই স্টাইলটির কিছু নির্দিষ্ট সীমাবদ্ধতা রয়েছে: এটি এখন একটি ত্রুটি দিয়ে শেষ করে তবে আপনি এটি নির্দিষ্ট করেন নি যে এটি ঠিক নয়। IOএকটি অ-ত্রুটিযুক্ত প্রস্থান পেতে আমাকে মোনাডে পুরো জিনিসটি রিফ্যাক্টর করতে হবে।


এটি 6 টি চালনায় একটি সঠিক অনুমানের নিশ্চয়তা দেয়?
উগোরেন

উহ। আমি ভেবেছিলাম এটি ছিল (ওপির উদাহরণ এবং অন্যান্য সমাধানগুলির জন্য কাজ করে) তবে পরিপূর্ণ পরীক্ষার মাধ্যমে দেখা যায় যে এর জন্য মাঝে মাঝে 7 টি অনুমানের প্রয়োজন হয়। আমি এখনও এই কাজ করতে হবে!
পাল্টা

5

পাইথন, 385 357 অক্ষর, 5 পদক্ষেপে সমাধান হয়

যতই আমি এটিকে পরিবর্তন করি, তা আরও অনেক বেশি স্টিভেন রুম্বালস্কির মতো বেড়ে যায় ... মূল পার্থক্য হ'ল তিনি পূর্ণসংখ্যার চেয়ে স্ট্রিং দিয়ে কাজ করেন।
বাস্তবায়িত নুথের অ্যালগরিদম (সঠিকভাবে এখন, আমি আশা করি)।
স্টিভেন রাম্বালস্কির কাছ থেকে স্কোরিং ফাংশন ধার নিয়েছে।
প্রথম অনুমানটি তৈরি করতে এটি অনেক সময় নেয়, পরে আরও ভাল হয়।
এটি হার্ড-কোডিং ( g=len(A)==1296 and [1,1,2,2] or ...) আপনি এটি পরীক্ষা করতে চাইলে জীবন আরও সহজ করে তোলে।
আমি 4 টি নতুন লাইনগুলি + ট্যাব জোড়া গণনা করি না, যা সেমিকোলন দ্বারা প্রতিস্থাপন করা যেতে পারে।

from collections import*
from itertools import*
a=B=A=list(product(*[range(1,7)]*4))
r=lambda g,k:(sum(x==y for x,y in zip(g,k)),sum(min(g.count(c),k.count(c))for c in set(g)))
while a!=4:
    g=A[1:]and min(B,key=lambda x:max(Counter(r(x,i)for i in A).values()))or A[0]
    print"%d "*4%tuple(g)
    b,a=map(int,raw_input().split())
    A=[x for x in A if r(g,x)==(a,a+b)]

"%d "*4%tuple(g)
gnibbler

from collections import*
gnibbler

a,b=map(int,raw_input())
gnibbler

product(*[range(1,7)]*4)
gnibbler

Counter(r(x,i)for i in A).values()
gnibbler
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.