উইথফের নিম পুরোপুরি খেলুন


16

আপনার লক্ষ্য উইথফের নিম এর গেমের জন্য নিখুঁত খেলোয়াড় লিখুন ।

উইথফের নিমের নিয়ম

উইথফের নিম একটি ডিটারমিনিস্টিক দুই খেলোয়াড়ের খেলা যা দুটি গাদা দুটি অভিন্ন কাউন্টারের সাথে খেলে। খেলোয়াড়রা বিকল্প মোড়, যাতে তারা এর মধ্যে একটি করে:

  1. প্রথম স্তূপ থেকে এক বা একাধিক কাউন্টার সরান
  2. দ্বিতীয় স্তূপ থেকে এক বা একাধিক কাউন্টার সরান
  3. প্রথম স্তূপ এবং দ্বিতীয় স্তূপ উভয় থেকে সমান সংখ্যক কাউন্টার (এক বা একাধিক) সরান।

অবশ্যই, পাইলস নেতিবাচক যেতে পারে না, তবে তারা 0 এ যেতে পারে যে কোনও খেলোয়াড় সামগ্রিকভাবে শেষ কাউন্টারটিকে মুছে ফেললে গেমটি জিতবে।

আরও জ্যামিতিক বিবেচনার জন্য, আপনি এই অ্যাপলেটটিতে খেলতে পারেন এমন একটি গেমের সমতুল্য সূচনা এখানে । একক রানী কোয়ার্টার-অসীম দাবা বোর্ডের কিছু স্কোয়ারে শুরু হয় যার কোণটি নীচে-বামে রয়েছে। খেলোয়াড়রা বিকল্পভাবে রানিকে রানী করে, যা দাবা রানির মতো চলে তবে তিন দিকে সীমাবদ্ধ:

  1. নিচে
  2. বাম
  3. ত্রিভুজ নীচে এবং বাম

যে রানিকে কোণে সরিয়ে দেয় সে জিতল।

রানির স্থানাঙ্কগুলি (কোণার সাথে (0,0)) সম্পর্কিত পাইলগুলির মাপের সাথে সংযুক্ত করে, উভয় গেম একই রকম দেখতে সহজ easy

নিখুঁত খেলা

(নিখুঁত খেলা এবং বিজয়ী পদক্ষেপের ধারণার সাথে পরিচিত হলে আপনি এড়িয়ে যেতে পারেন))

যেহেতু উইথফের নিম একটি সীমাবদ্ধ এবং নির্বিচারবাদী খেলা, তাই এটি নিখুঁত খেলার ধারণা রয়েছে । একটি নিখুঁত খেলোয়াড় একটি কৌশল যা সর্বদা তাত্ত্বিকভাবে জেতা অবস্থান থেকে জয়ী হবে, যার অর্থ এমন একটি অবস্থান যেখানে একটি কৌশল রয়েছে যা একটি জয় নিশ্চিত করে।

একটি বিজয়ী কৌশল হিসাবে, খেলোয়াড়ের সবেমাত্র সরানো জন্য তাত্ত্বিক বিজয়ী অবস্থানে সর্বদা স্থানান্তরিত হওয়ার পক্ষে যথেষ্ট, এবং এইভাবে প্লেয়ারটি আর না চলে। এই বিজয়ী অবস্থানগুলির মধ্যে প্রথমটি (একে শীতল অবস্থানগুলিও বলা হয় ) (0,0), (1,2), (2,1), (3,5), (5,3)। উইথফের নিমের জন্য একটি বিজয়ী কৌশল এবং উইন পজিশনগুলি তৈরি করার সূত্রের জন্য অ্যালগরিদমের ব্যাখ্যার জন্য উইকিপিডিয়া নিবন্ধটি দেখুন ।

প্রোগ্রাম প্রয়োজনীয়তা

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

যদি বিজয়ী পদক্ষেপের অস্তিত্ব থাকে না, অর্থ্যাৎ অবস্থানটি একটি তাত্ত্বিক ক্ষতি, আপনার প্রোগ্রামটি তাই এবং জব্দ করা উচিত।

আপনার প্রোগ্রাম অবশ্যই একটি যুক্তিসঙ্গত সময়ের মধ্যে চলতে হবে। সুতরাং, একটি ক্ষতিকারক পুনরাবৃত্তি গেম ট্রি অনুসন্ধান যথেষ্ট হবে না। আপনি যদি কোনও কৌশল পূর্বনির্ধারিত এবং হার্ড-কোড করতে চান তবে তা ঠিক।

ইনপুট

(i,j)গাদা আকারের প্রতিনিধিত্বকারী অ-নেতিবাচক সংখ্যার একটি জুড়ি , প্রতিটি সর্বাধিক 99। এটি দুটি সংখ্যা, একটি টুপল, একটি তালিকা বা আপনার পছন্দসই ধারক হতে পারে।

আউটপুট

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

যদি বিজয়ী পদক্ষেপ না থাকে তবে আপনাকে অবশ্যই আউটপুটে এটি নির্দেশ করতে হবে। কোন আউটপুট মত False, None, 0, অথবা (-1,-1)কি করতে হবে, যতদিন এটি একটি আইনগত অবস্থান নয়, এবং প্রতি হারানো ইনপুট জন্য একই।

উদাহরণ রান

f(5,0)   = (0,0)
f(2,2)   = (1,2)   # Or (2,1) or (0,0) 
f(1,2)   = False
f(13,9)  = (13,8)  # Or (10,6)
f(10,6)  = False
f(5,10)  = (5,3)
f(25,30) = (8,13)    

2
+1, আংশিক কারণ আমি অনন্তের এক চতুর্থাংশের ধারণা পছন্দ করি।
স্তরের নদী সেন্ট

"যুক্তিসঙ্গত পরিমাণ" সংজ্ঞা দিন। (100,50) এর জন্য বেশ কয়েকটি সেকেন্ড সময় কি যুক্তিসঙ্গত পরিমাণ?
জন ডিভোরাক

উহু. অপেক্ষা করুন। ইনপুট দ্বারা আবদ্ধ ... 30 ??? কিছুটা কম, তাই না?
জন ডিভোরাক

@ জনডভোরাক আপনি ঠিক বলেছেন, এটি সস্তার শর্টকাটের অনুমতি দিতে পারে। 99 এ পরিবর্তিত হয়েছে - আমি মনে করি এটি যথেষ্ট? পোস্ট করার পরে চশমা সম্পাদনা করার জন্য ক্ষমা চাইছি।
xnor

@ পিটারটেলর ধন্যবাদ, স্থির।
xnor

উত্তর:


6

হাস্কেল, 167 অক্ষর

c p=o p:c(o p:p)
o p=[(a,b)|a<-[0..],b<-[0..a],(a,b)?p==[]]!!0
(a,b)?p=[y|y@(c,d)<-p,c==a||c==b||d==b||a+d==b+c]
f x@(a,b)|a<b=f(b,a)|x?c[]!!0==x=(0,-1)|1>0=x?c[]!!0

অ্যালগরিদম অদক্ষতাযুক্ত, তবে এটি ইনপুট <100 এর জন্য একটি সেকেন্ডের মধ্যে (যদিও ইন্টারেক্টিভ কনসোলে নেই) চলে।

ব্যাখ্যা:

c p=o p:c(o p:p)

পূর্ববর্তী শীতল অবস্থানগুলির একটি সেট দেওয়া শীতল অবস্থানের তালিকাটি হ'ল একটি শীতল অবস্থান এবং এরপরে ঠান্ডা অবস্থানগুলির তালিকা এবং পূর্ববর্তী অবস্থানগুলি দেওয়া হয়েছে (অপারগতা: এই অবস্থানটি দুবার উত্পন্ন হয়)

o p=[(a,b)|a<-[0..],b<-[0..a],(a,b)?p==[]]!!0

একটি শীতল অবস্থান হ'ল প্রথম জোড় যা এমন কোনও ঠান্ডা অবস্থান নেই যা থেকে সেই জুটিটি পৌঁছানো যায় না (অপারগতা: এর পরিবর্তে আমাদের আগের জোড় থেকে অনুসন্ধান করা উচিত)

(a,b)?p=[y|y@(c,d)<-p,c==a||c==b||d==b||a+d==b+c]

একটি জুড়ি থেকে পৌঁছনযোগ্য পজিশনগুলি হ'ল সেগুলি যা তাদের প্রথম উপাদানগুলির সাথে মেলে, তাদের দ্বিতীয় উপাদানগুলির সাথে মেলে, তাদের পার্থক্যের সাথে মেলে বা অপসারণের আগে ছোট ছোট গাদা অপসারণের পরে বৃহত্তর স্তূপ হয়।

f x@(a,b)|a<b=f(b,a)
         |x?c[]!!0==x=(0,-1)
         |1>0=x?c[]!!0

(প্রধান পদ্ধতি) গাদা যদি ভুল ক্রমে থাকে তবে সেগুলি স্যুপ করুন। অন্যথায়, যদি কোনও অবস্থান থেকে পৌঁছনোর প্রথম ঠান্ডা অবস্থানটি পজিশন হয় তবে ব্যর্থতা নির্দেশ করুন (আদর্শভাবে, এর Maybe (Int,Int)পরিবর্তে একজন ফিরে আসবে )। অন্যথায় সেই শীতল অবস্থানটি ফিরে আসুন (অপারগতা: বলেছেন জোড়াকে দু'বার দেখা হয়েছে W আরও খারাপ, ঠান্ডা অবস্থানের তালিকাটি দু'বার উত্পন্ন হয়েছে)


মনে হয় যে " সুতরাং, একটি ক্ষতিকারক পুনরাবৃত্ত গেম গাছের অনুসন্ধান যথেষ্ট হবে না " আশাবাদী ছিল, কারণ আপনি যা বর্ণনা করেছেন ঠিক তেমন শোনায়।
পিটার টেলর

@ পিটারটেলর এটি ও (এন ^ 4)। প্রতিটি ঠান্ডা জুটি সন্ধান করতে ও (এন ^ 3) সময় নেয় এবং সেগুলির মধ্যে ও (এন) রয়েছে। প্রজন্মের অনুকূলকরণ এটিকে O (n ^ 2) এ নিয়ে আসবে (যদি আমি ক্রমটি সঠিকভাবে পড়ি)। একটি ক্ষতিকারক-সময় অ্যালগরিদম অনেক ধীর হতে হবে। আমার কিছু পরীক্ষা চালানো উচিত?
জন ডিভোরাক

ঠিক আছে, আমি তোমাকে বিশ্বাস করি
পিটার টেলর

আপনি অপসারণ করতে পারেন x@থেকেx@(a,b)?p=...
গর্বিত haskeller

কীভাবে এটি সেখানে পেল তা নিশ্চিত নয়। ফিক্সিং, ধন্যবাদ
জন ডিভোরাক

5

GolfScript ( 63 57 বাইটস)

{\]zip{~-}%0|$(!*,1=}+1,4*{..,,^[(.@,2/+.2$]+}38*2/?0]0=`

ফর্মের স্টিডিনের কাছ থেকে ইনপুট প্রত্যাশা করে এবং সেই ফর্মের [a b]স্টাডআউটে আউটপুট ছেড়ে দেয় বা 0যদি এটি হেরে যায়। অনলাইন ডেমো

সংক্ষিপ্ত বিবরণ

,4*{..,,^[(.@,2/+.2$]+}38*2/

বিটি সিকোয়েন্স সম্পত্তি ব্যবহার করে শীত অবস্থানের ( [b a]প্রতিটি শীতল অবস্থানের জন্য উল্টানো সংস্করণ সহ) একটি তালিকার গণনা [a b]করে ।

তারপরে ?তৈরি করা ব্লকটি সন্তুষ্ট করে প্রথম ঠান্ডা অবস্থান অনুসন্ধান করে

{\]zip{~-}%0|$(!*,1=}+

যা মূলত চেক অবস্থান ভেক্টর পার্থক্য কম্পিউটিং এবং তারপর যাচাই করছে যে এটা হয় এর মাধ্যমে ইনপুট অবস্থান থেকে যোগাযোগ করা যাবে যে [0 x], [x 0]অথবা [x x]কিছু জন্য x > 0। : আইএমও যে পরীক্ষা চতুর বিট 0|$বাহিনী ফর্ম মধ্যে ঐ ফরম্যাটের এক যে কোন অ্যারের [0 x]যখন ম্যাপিং [0 0]করতে [0], [a b]যেখানে তন্ন তন্ন aনা bহয় 0তিন-উপাদানের বিন্যাস, এবং [-x 0]বা [-x -x]করতে [-x 0]। তারপরে আমাদের (!*,1=যা আছে তা পরীক্ষা করে দেখুন [0 x]

অবশেষে 0]0=`ফলব্যাক কেস এবং আউটপুট জন্য ফর্ম্যাটিং করে।


4

পাইথ 57 58 61 62

K1.618Jm,s*dKs*d*KKU39M<smf|}TJ}_TJm,-Ghb-Hebt^,0hk2U99 1

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

বেশ অন্যান্য উত্তর অনুরূপ, কিন্তু যে উইকিপিডিয়া পৃষ্ঠা অনেক যেতে আর দেননি;) ম্যাজিক নম্বর 39মান <দিয়ে ঠান্ডা পজিশনের সংখ্যা 99

gআপনি পছন্দ করতে পারেন যে একটি ফাংশন সংজ্ঞায়িত g 30 25। সাফল্যে [], ব্যর্থতার জন্য ফিরে আসে [(13,8)]

ব্যাখ্যা

K1.618                            : K=phi (close enough for first 39 values)
      Jm,s*dKs*d*KKU39            : J=cold positions with the form (small,big)
M<s                              1: Define g(G,H) to return this slice: [:1] of the list below 
   mf|}TJ}_TJ                     : map(filter: T or reversed(T) in J, where T is each member of..
             m,-Ghb-Hebt^,0hk2    : [(G H) - (0 x+1),(x+1 0) and (x+1 x+1)]
                              U99 : for each x from 0 - 98

sইনট এ কাস্ট করা হয় - কয়েকটি অক্ষর সংরক্ষণ করে /____1। Unary ব্যাপ্তি ব্যবহার করে rZ39দ্বারা প্রতিস্থাপন করা যেতে পারে U39। অনুরূপভাবে, আপনি প্রতিস্থাপন করতে পারেন r99)সঙ্গে U99
isaacg

ধন্যবাদ! আমি সম্পূর্ণরূপে ভুলে গেছি U। আমার সত্যিই ব্যাখ্যাটি আপডেট করা উচিত: পি
ফ্রাইআমTheEggman

@ আইস্যাচজি পাইথ সম্পর্কে কেবল একটি চিন্তাভাবনা, আমার মনে হয় আপনি @যদি দ্বিতীয় চৌম্বকটি এখন একটি তালিকা হিসাবে সেট ছেদ করতে পারেন। aপরিবর্তিত হওয়ার পরে এটি কিছুটা বিশ্রীভাবে ছেড়ে দেওয়া হয়েছে: পি
ফ্রাইআম দ্য এজামম্যান

এটি একটি ভাল ধারণা - আমি এটি বাস্তবায়ন করেছি। তালিকার দুটি তালিকার ছেদ ছেয়ে নেওয়া সহ এমন কয়েকটি কৌশল যা আগে সম্ভব ছিল না তার অনুমতি দেওয়ার জন্য আমি ছেদ কোডটিও পরিবর্তন করেছি।
isaacg

2

জাভাস্ক্রিপ্ট ES6 - 280 বাইট

minified

r=x=>~~(x*1.618);g=(y,x)=>y(x)?g(y,x+1):x;s=A=>A?[A[1],A[0]]:A;f=(a,b)=>j([a,b])||j([a,b],1);j=(A,F)=>l(A,F)||s(l(s(A),F));l=(A,F)=>([a,b]=A,c=(F&&a+b>=r(b)&&(e=g(x=>a+b-2*x-r(b-x),0))?[a-e,b-e]:(e=g(x=>r(a+x)-2*a-x,0))+a<b?[a,a+e]:(e=r(b)-b)<a?[e,b]:0),c&&r(c[1]-c[0])==c[0]?c:0)

সম্প্রসারিত

r = x => ~~(x*1.618);
g = (y,x) => y(x) ? g(y,x+1) : x;
s = A =>A ? [A[1],A[0]] : A;
f = (a,b) => j([a,b]) || j([a,b],1);
j = (A,F) => l(A,F) || s(l(s(A),F));
l = (A,F) => (
    [a,b] = A,
    c = (
        F && a+b >= r(b) && (e = g( x => a+b - 2*x - r(b - x), 0 )) ? [a-e,b-e] :
        (e = g( x => r(a+x) - 2*a - x, 0)) + a < b ? [a,a+e] :
        (e = r(b) - b) < a ? [e,b] : 0
    ),
    c && r(c[1] - c[0]) == c[0] ? c : 0
);

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

সমস্ত পরীক্ষার ইনপুটগুলির জন্য সঠিকভাবে চালিত হয় এবং এর বাইরেও আমি পরীক্ষা করে দেখেছি dozens

অনুরোধ করা ফাংশন হয় f। এটি সাফল্যের একটি অ্যারে এবং 0হাল ছেড়ে দেওয়ার ক্ষেত্রে ফেরত দেয়।


অপেক্ষা করুন, একটি অ্যারের আউটপুট আউট করা ঠিক আছে?
জন ডিভোরাক

@ জনডভোরাক: xnor এর বৈধ আউটপুটগুলির তালিকায় তালিকাভুক্ত একটি টুপল রয়েছে, তাই আমি বুঝতে পেরেছি। সে বিষয়টি স্পষ্ট করে বলতে পারে। এটি যে কোনও হারেই তুচ্ছ ফিক্স।
কোতো

জোড়ার একটি অ্যারে বা সিঙ্গলটন অ্যারে ঠিক আছে; একাধিক বিজয়ী পদক্ষেপ নেই।
xnor

1

পার্ল 5 - 109 (2 টি পতাকা সহ)

#!perl -pl
for$a(@v=0..99){for$b(@v){$c=$a;$d=$b;${$:="$a $b"}||
map{$$_||=$:for++$c.$".++$d,"$a $d","$c $b"}@v}}$_=$$_

ব্যবহার:

$ perl wyt.pl <<<'3 5'

$ perl wyt.pl <<<'4 5'
1 2

কেবলমাত্র প্রতিটি সম্ভাব্য ইনপুটটির জন্য সমাধান গণনা করে তারপরে কেবল একক অনুসন্ধান করা।

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