রুবি, রেভ বি 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