ক্রস, নটস নেই


10

প্রত্যেকে বুঝতে পারে যে টিক ট্যাক টো একটি সমাধান হওয়া খেলা। তবে, কেবলমাত্র Xs এর Misère সংস্করণ একটি আকর্ষণীয় বিকল্প সরবরাহ করে।

গেমের এই সংস্করণে, উভয় খেলোয়াড় বোর্ডে Xs খেলেন এবং পর পর তিনটি তৈরি করা এড়ানোর চেষ্টা করেন। আপনি যদি এই সম্পর্কে আরও দেখতে চান তবে নম্বর কনফিলে এই ধারণাটি সম্পর্কে একটি দুর্দান্ত ভিডিও আছে।

মিসের ক্রসগুলির একটি বোর্ড দেওয়া, একটি অনুকূল পদক্ষেপ খেলুন।

একটি বোর্ড প্রতিটি তিনটি অক্ষরের তিনটি লাইন, যা হয় Xবা হয় । এভাবে:

X X
X  
 XX

একটি বৈধ বোর্ড। আপনার ইনপুট এবং আউটপুট একই ফর্ম্যাটটি যতক্ষণ ব্যবহার করবে ততক্ষণ আপনি এটি কোনও সুবিধাজনক বিন্যাসে নিতে পারেন। ফর্ম্যাটগুলির মধ্যে অন্তর্ভুক্ত রয়েছে (তবে সীমাবদ্ধ নয়): একটি মাল্টি-লাইন স্ট্রিং (;চ্ছিক ট্রেলিং নিউলাইন সহ); অক্ষরের একটি 2D অ্যারে Xবা যা ; বুলিয়ান মানগুলির একটি 1D সমতল অ্যারে প্রতিনিধিত্ব করে যদি প্রতিটি পজিশন খেলেছে তবে।

একটি অনুকূল পদক্ষেপটি এমনটি যা গ্যারান্টি দেয় যে আপনি যতক্ষণ সম্ভব খেলতে বা আপনার ক্ষতি দীর্ঘায়িত করে বিজয়ী হবেন এবং যতক্ষণ না সম্ভব নিম্নলিখিত নিয়ম দ্বারা সংজ্ঞায়িত হন:

  • একটানা তিনটি করা থেকে বিরত থাকুন।
  • আপনি যদি আগে যান তবে মাঝখানে খেলুন।
  • যদি একমাত্র দখলকৃত স্থানটি মাঝের হয় তবে অবশিষ্ট যেকোন জায়গাতেই খেলুন।
  • যদি মাঝের বর্গক্ষেত্রটি দখল করা না থাকে এবং বাইরের স্কোয়ারটি থাকে তবে আপনার প্রতিপক্ষের শেষ খেলার বিপরীতে খেলুন।
  • যদি মাঝের বর্গক্ষেত্রটি দখল করা হয় এবং একটি বাহ্যিক বর্গক্ষেত্র হয়, একটি পূর্ববর্তী পদক্ষেপ থেকে "নাইটস মুভ" (বিপরীত, এক ওভার) দূরে খেলুন যা আপনাকে হারাতে পারে না।
  • যেখানে আপনি হারাবেন না সেখানে যদি কোনও অবশিষ্ট স্কোয়ার না থাকে তবে বাকি যে কোনও স্কোয়ারে খেলুন।

[দ্রষ্টব্য: এটি এক ক্ষেত্রে অনুকূল নয় বলে প্রমাণিত হয়েছে তবে যাইহোক আপনার এই অ্যালগরিদমটি ব্যবহার করা উচিত]]

আপনি ধরে নিতে পারেন যে আপনার আগের সমস্ত পদক্ষেপটি অনুকূল ছিল। সুতরাং, প্রথম উদাহরণ বোর্ডটি কোনও বৈধ ইনপুট নয়। আপনার প্রতিপক্ষের চালগুলি সর্বোত্তম হতে পারে বা নাও হতে পারে।

গেমটি যদি শেষ হয়ে যায় (অর্থাত্ এক সারিতে তিনটি করা হয়ে থাকে), আচরণটি নির্ধারিত।

এটি , বাইটের মধ্যে সংক্ষিপ্ত উত্তর!

একটি সম্ভাব্য পথ, কেবলমাত্র অনুকূল চালগুলি ব্যবহার করে, এটি হ'ল:

[   ]  [   ]  [X  ]  [X  ]  [X  ]  [X  ]  [XX ]
[   ]->[ X ]->[ X ]->[ XX]->[ XX]->[ XX]->[ XX]
[   ]  [   ]  [   ]  [   ]  [ X ]  [XX ]  [XX ]

অপ-অনুকূল পদক্ষেপগুলি ব্যবহার করে প্রতিপক্ষের কাছ থেকে উত্পন্ন সম্ভাব্য ইনপুটগুলি এখানে রয়েছে:
(লক্ষ্য করুন যে এই তালিকার কেবল বাম পাশের বোর্ডগুলি বৈধ ইনপুট রয়েছে))

[X  ]  [X  ]
[   ]->[   ]
[   ]  [  X]

[XX ]  [XX ]
[   ]->[   ]
[  X]  [ XX]

[XX ]  [XX ]
[X  ]->[X X]
[ XX]  [ XX]


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

1
কৌশলটি "আপনার প্রতিপক্ষের শেষ নাটকের বিপরীতে খেলুন" হয় আপনার প্রতিপক্ষের চলন ইতিহাসের জ্ঞান ধরে নেয় বা আপনি আগে এই কৌশলটি অনুসরণ করেছেন, .XX\nX..\nX..উদাহরণস্বরূপ কোনও বোর্ড উত্তরাধিকার সূত্রে পান নি । আমাদের কি এই জাতীয় উত্তরাধিকার সূত্রে বিবেচনা করতে হবে?
স্তর নদী সেন্ট

@ লেভেলরিভারস্ট লিখিত হিসাবে, "আপনি ধরে নিতে পারেন যে আপনার আগের সমস্ত পদক্ষেপই অনুকূল ছিল," যাতে বোর্ডটি অবৈধ ইনপুট হয়ে যায়। আপনি নিজের পছন্দ মতো ফর্ম্যাটে ইনপুট নিতে পারেন, তবে একাধিক লাইনের স্ট্রিং যেমন আপনার উদাহরণের মধ্যে "ডিফল্ট" থাকবে: আমি কেবল কাউকে স্ট্রিংকে পার্স করার ক্ষেত্রে সীমাবদ্ধ রাখতে চাই না যখন মুভ লজিকের বিন্দু হয় চ্যালেঞ্জ.
CAD97

উত্তর:


3

রুবি, রেভ বি 121 বাইট

জমা বেনামী ফাংশন, বিয়োগ f=। ব্যবহারের চিত্রিত করতে পরীক্ষার প্রোগ্রামে দেখানো হয়েছে।

f=->n{["~mK)\7","}uYwQO"][l=n%2].bytes{|t|9.times{|i|(m=n|1<<i)==n||8.times{|j|m/2*257>>j&255==126-t&&t+j%2!=119&&l=m}}}
l}

puts g=f[gets.to_i]
puts
[7,6,5,
 8,0,4,
 1,2,3].each{|i|print g>>i&1; puts if i/3==1}

2 বাইট কেন্দ্র বর্গক্ষেত্র অন্তত গুরুত্বপূর্ণ বিট পরিবর্তে সবচেয়ে গুরুত্বপূর্ণ বিট উপার্জন দ্বারা সংরক্ষিত (দ্বারা অপসারণ /2পরিবর্তে %256।) গ্রহণযোগ্য প্যাচসমূহ সারণী একটি পুনর্গঠনের দ্বারা সঞ্চয়ী অবশিষ্ট আছে। মোট স্কোর এক্স এর পরিবর্তে কেন্দ্র বর্গক্ষেত্রে ফ্রি / অধিকৃত হিসাবে সংগঠিত করা আরও সহজ পরীক্ষার অনুমতি দেয়। এছাড়াও, এখন অ্যারেটিতে কেবল দুটি স্ট্রিং রয়েছে তাই %w{string1 string2}বাক্য বিন্যাসটি সিনট্যাক্সের পক্ষে ছেড়ে দেওয়া হয় ["string1","string2"]। এটি একটি ছাপানো অক্ষরকে \7অন্তর্ভুক্ত করতে সক্ষম করে, যার 126-tপরিবর্তে একটি সহজ এনকোডিং ব্যবহার করা যায়: পরিবর্তে (36-t)%120

রুবি, রেভ এ 143 বাইট

->n{l=r=("%b"%n).sum%8
%w{$ %5 - I+Wy Q S#}[r].bytes{|t|9.times{|i|(m=n|1<<i)==n||8.times{|j|m%256*257>>j&255==(t-36)%120&&t+j%2!=43&&l=m}}}
l}

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

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

কেন্দ্রের বর্গক্ষেত্র সম্পর্কিত তথ্য ছিনিয়ে নেওয়া হয় এবং বাকী 8 টি বিটগুলি সদৃশ করতে 257 দ্বারা গুণিত হয়। এই প্যাটার্নটি রাইটসাইফিংয়ের মাধ্যমে গ্রহণযোগ্য প্যাটার্নগুলি পেরিয়ে আবর্তিত হবে।

কোনও প্যাটার্নটি পাওয়া গেলে লুপটি বের হয় না, সুতরাং প্রত্যাবর্তিত প্যাটার্নটি পাওয়া যাবে সর্বশেষ গ্রহণযোগ্য প্যাটার্ন। এই কারণে, পছন্দসই নিদর্শনগুলি (যেখানে একটি পছন্দ রয়েছে) পরে তালিকায় আসে।

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

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

পরীক্ষা প্রোগ্রামে অসম্পূর্ণ

অসম্পূর্ণ সংস্করণটি প্রশ্নের মধ্যে প্রকাশিত যুক্তি অনুসরণ করে।

গল্ফযুক্ত সংস্করণে কেসটির [[0],[1,17],[9],[37,7,51,85],[45],[47,119]]জন্য সামান্য ভিন্ন আচরণ বাস্তবায়নের জন্য টেবিলটি কিছুটা সংশোধন করা হয়েছে r=3। এরপরে এটি মুদ্রণযোগ্য এএসসিআইআইতে সংকোচিত হয় (ডিকোডিংয়ের প্রয়োজন হয় (t-36)%120)। টেবিল এন্ট্রি 7 এর ক্ষেত্রে একটি কোণে তিনটি এক্স এবং একটি এক্সের সাথে তিনটি এক্স এর মধ্যে পার্থক্য করার জন্য অতিরিক্ত যুক্তি যুক্ত করতে হবে:&&t+j%2!=43

f=->n{l=r=("%b"%n).sum%8                                      #convert input to text, take character checksum to count 1's(ASCII 49.) 
                                                              #0 is ASCII 48, so %8 removes unwanted checksum bloat of 48 per char.
                                                              #l must be initialised here for scoping reasons.
  [[0],[1,17],[9],[11,13,37,51,85],[45],[47,119]][r].each{|t| #according to r, find the list of acceptable perimeter bitmaps, and search for a solution.
    9.times{|i|(m=n|1<<i)==n||                                #OR 1<<i with input. if result == n, existing X overwritten, no good.
                                                              #ELSE new X is in vacant square, good. So.. 
      8.times{|j|m%256*257>>j&255==t&&l=m}}                   #%256 to strip off middle square. *257 to duplicate bitmap.
                                                              #rightshift, see if pattern matches t. If so, write to l
  }
l}                                                            #return l (the last acceptable solution found) as the answer.

#call function and pretty print output (not part of submission)
puts g=f[gets.to_i]
puts
[6,7,0,
 5,8,1,
4,3,2].each{|i|print g>>i&1; puts if i<3}

পরীক্ষা প্রোগ্রাম আউটপুট

কম্পিউটার নিজে খেললে এটি ঘটে।

সি: \ ব্যবহারকারীগণ \ স্টিভ> রুবি টিকট্যাক.আরবি
0
256

000
২010
000

সি: \ ব্যবহারকারীগণ \ স্টিভ> রুবি টিকট্যাক.আরবি
256
384

২010
২010
000

সি: \ ব্যবহারকারীগণ \ স্টিভ> রুবি টিকট্যাক.আরবি
384
400

২010
২010
100

সি: \ ব্যবহারকারীগণ \ স্টিভ> রুবি টিকট্যাক.আরবি
400
404

২010
২010
101

সি: \ ব্যবহারকারীগণ \ স্টিভ> রুবি টিকট্যাক.আরবি
404
436

২010
110
101

সি: \ ব্যবহারকারীগণ \ স্টিভ> রুবি টিকট্যাক.আরবি
436
444

২010
110
111

গেম অ্যানালাইসিস প্রথম প্লে করছে

এটি আসলে খুব সাধারণ এবং রৈখিক।

প্রথম খেললে মাঝের স্কোয়ারটি সর্বদা প্রথম বর্গ দখল করা হবে।

R = 0

...  binary representation 0
.X.
...

R = 2

X..  binary representation 1001=9 
.XX
...

R = 4

X.. binary representation 101101=45
.XX
XX.

গেমটি শেষ না হয়ে বোর্ডের মাঝারি বর্গক্ষেত্র সহ পাঁচটি এক্সের একমাত্র উপায় (প্রতিসাম্য অবধি) রয়েছে। মাঝের বর্গক্ষেত্রে একটি এক্স রয়েছে, প্রতিটি তীরের উপর একটি (একে অপরের 90 ডিগ্রীতে) এবং প্রতিটি অনুভূমিক / উল্লম্ব কেন্দ্রিকরেখার উপর একটি (একে অপরের 90 ডিগ্রিতে।) পুরো প্রান্তটি কেবল দখল করা যায় না কারণ উপরেরটি একমাত্র ব্যবস্থা সম্ভব। অন্যান্য খেলোয়াড়কে পরবর্তী পদক্ষেপে হারাতে হবে।

গেম অ্যানালাইসিস দ্বিতীয় প্লে খেলছে

অন্য খেলোয়াড়টি মাঝের বর্গক্ষেত্রটি বেছে নিলে খেলাগুলি একেবারে আলাদা।

R = 1

মধ্য বর্গ দখল

.X. X..  binary representation 1 
.X. .X.
... ...

মাঝারি বর্গ মুক্ত

X.. .X. binary representation 10001=17
... ...
..X .X.

R = 3

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

XX. .XX binary representation 1011=11 
.X. XX. or mirror image 1101=13
X.. ...

তবে উপরেরটি সেরা পদক্ষেপ নয় এবং গল্ফযুক্ত সংস্করণে সমর্থিত নয়। সর্বোত্তম পদক্ষেপটি হ'ল পরের বারে জয়ের জন্য:

XX. binary representation 111=7.           XXX
XX. Only to be used where j is odd.        .X.
... Even j would look like image to right. ...

মধ্য বর্গক্ষেত্রটি দখল করা হয়েছে, যদি অন্য খেলোয়াড় আপনার শেষ এক্সে 90 বা 135 ডিগ্রি খেলেন তবে নাইটের সরানো খেলুন)

X.X .X. binary representation 100101=37 
.X. .XX
.X. X..

মধ্য বর্গ মুক্ত

X.X .X. XX. binary representations:
... X.X ...    1010101=85 (first two)
X.X .X. .XX and 110011=51 (last one)

R = 5

মধ্য বর্গ দখল। R = 4 এ উপরে বর্ণিত কারণে, এখানে চারটি সম্ভাব্য পদক্ষেপ রয়েছে, যার সবকটিই হেরে যায়। শুধুমাত্র একটি সমর্থিত: 101111 = 47।

মাঝারি বর্গ মুক্ত। প্রতিলিপি পর্যন্ত কেবলমাত্র একটি সম্ভাব্য বোর্ড রয়েছে, নীচে। অন্যান্য খেলোয়াড়কে অবশ্যই পরবর্তী পদক্ষেপে হারাতে হবে, সুতরাং আর> 5 সমর্থন করার দরকার নেই।

XX. binary representation 1110111=119
X.X
.XX

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

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