আটকে যাওয়া দাবার ঘোড়া



একটা দাবার বোর্ড চিন্তা করুন, যেটা আসীম। অর্থাৎ এটা কোনো শেষ সীমানা নেই। অসীম বোর্ডটি নাম্বার দিয়ে ডিফাইন করা থাকবে ছবির মতো করে সিকুয়েন্স অনুযায়ী। অন্য কোনো গুটি নেই শুধু একটি ঘোড়া বা Knight আছে। আপনি ঘোড়াটিকে আড়াই ঘর করে দাবার নিয়মে চালাতে পারবেন। শর্ত শুধু দুটি, ১ম শর্ত হচ্ছে  knight টি সম্ভাব্য যেই যেই ঘরে যেতে পারবে সেই সেই ঘরের মধ্যে সবচেয়ে ছোট নাম্বার দিয়ে মার্ক করা ঘরে যেতে পারবে। ২য় শর্তটি হচ্ছে যেখানে knight টি গিয়েছিল সেখানে ২য় বার যেতে পারবে না।


> *প্রথম কেস*

ছক কাটা প্রথম ছবিতে ১ দিয়ে ডিফাইন করা স্থান থেকে যদি মুভ করাই তাহলে knight টি চালানোর সম্ভাব্য স্থান হলো 18,16,14,12,10,24,22,20. এখন এই সংখ্যাগুলোর মধ্যে সবচেয়ে ছোট সংখ্যা হলো 10. তাই knight টি 10 নম্বার ঘরে যাবে এভাবে দেখতে হবে 10 থেকে সম্ভাব্য কতটি স্থানে যেতে পারবে knight টি। এভাবে ওই পয়েন্টগুলো বের করে দেখবেন সবচেয়ে ছোট কোন পয়েন্ট আছে। সেই পয়েন্ট

এ knight টি  যাবে এভাবে আবার রিপিট করে দেখতে হবে।

বলুন তো knight টি কি কতদুর যেতে পারবে ? Knight কি ২ টি শর্ত মেনে এভাবে স্পেশাল বোর্ডে কি কখনো আজীবন চলতে পারবে ? উত্তরটা হচ্ছে, আজীবন পারবে না। এই দুটি শর্ত মেনে চললে একসময় থেমে যাবে। knight টি এমন স্থানে যাবে যেখান থেকে অন্য কোথাও যেতে পারবে না। কারন ঐ অবস্থান থেকে নির্ধারিত সকল স্থানে আগেই knight টি আগেই গিয়েছে। 2016 টা স্টেপের পর 2084 ঘরে knight চালানোর পর knight টি আটকে যাবে। 2084 নরমাল একটা আরবিটারি নাম্বার কিন্তু Knight এর জন্য একটা বিরাট দুঃসপ্ন।

অনেক ধরনের সিকুয়েন্স করে পাওয়া যায় ঠিক কত দামের পর knight টি চলা বন্ধ করে দিবে কিন্তু বন্ধ হবেই। এর মধ্যে যেসব নাম্বার কে knight ভিজিট করে না সেগুলো মধ্যে সবচেয়ে ছোট সংখ্যা হচ্ছে  961. মজার ব্যাওয়ার হচ্ছে এই নাম্বারগুলো সিকুয়েন্স পাবেন । যেমনঃ ............, 1223,1221,1220,1219,1092,1091,1090,1089,1088,1087,1086,962,961. Knight দিয়ে আপনি বপদে পড়লেও আপনি Queen নিয়ে এমন বপদে পড়বেন না।

সবচেয়ে মজার ব্যাপার হচ্ছে, আপনি আরো ভিন্ন ধরনের আকারের বোর্ড নিয়ে সিকুয়েন্স ধরে নাম্বারিং করেন তবেও একই রেজাল্ট আসবে। অসীম পর্যন্ত কখনই knight কে নিয়ে দৌড়াতে পারবেন না। আপনি যদি একটি দীর্ঘ ও প্রস্থ বিশিষ্ট half square নেন। তার সাথে কর্ণ বরাবর যদি নাম্বারিং করি নিচে দেওয়া ছবির মতো করে। তারপর আমরা যদি knight টাকে আবার আগের মতো করে চালানো শুরু করি তাহলেও দেখা যাবে যে knight টি একটি স্থানে বন্দি হয়ে যাবে। এভাবে, বিভিন্ন shape এর নাম্বারিং করা একটা ইনফিনাইট বোর্ডে আপনি যেভাবে চালনা করেন কেনো না কেনো আপনি ঘুরে ফিরে এমন একটা নাম্বারে আসবেন যেখান থেকে আর মুভ করা পসিবল না।


> *২য় কেস *

একটি দীর্ঘ ও প্রস্থ বিশিষ্ট half square নিয়ে নেই আর নিচে যেওয়া ছবির মতো করে কর্ণ বরাবর মার্ক করি তাহলে কি হয়? চলুন দেখি শর্ত অনুযায়ী knight টি 1 no থেকে 8,9 নাম্বারে যেতে পারে। তাহলে, এখানে সবচেয়ে ছোট নাম্বার দেওয়া  স্থান 8. সুতরাং knight টি 8 যাবে। এরপর ? 6,11,24,14,25 স্থানে যেতে পারে কিন্তু সবচেয়ে ছোট সংখ্যার নিয়ম অনুযায়ী যাবে 6 নাম্বার স্থানে। এভাবে সেইম সিকুয়েন্স মেনে সামনে আগাবে। এক্ষেত্রেও চলতে থাকবে আর সেই সাথে 2402 ঘরে knight হাটার পর আর সামনে যেতে পারবে না। চারদিকে যত সম্ভাব্য ঘর থাকবে সবগুলোতেই আগে একবার সে স্টেপ দিয়েছিলো অতপর সে থেমে যাবে।

এখন আপনি যদি নিজে নিজে হিসেব করে দেখতে চান? তাহলেও করা যাবে কিন্তু একটু সময় সাপেক্ষ নয় কি ? খুব দ্রুত এত লম্বা  কিন্তু সিম্পেল একটা অপারেশন কিভাবে করা যায় ? একটি উপায় আছে…….. আসুন Python  পুরা ব্যাপারটি Code করি।

> *# code starts*

GlowScript 2.7 VPython

# Set knight's starting point.

starting_point_x = 0 # Each must be an integer.

starting_point_y = 0 # Square 1 is at (0,0).

# Set knight's movement amounts.

d1 = 1

d2 = 2

# Begin setting up chessboard.

global squares

global grid_width

squares = [vector(starting_point_x,starting_point_y,0)]

squares[0].num = 1

squares[0].block = box(pos=vector(0,0,0),size=vector(0.9,0.9,0.1))

#squares[0].text = label(pos=vector(0,0,0),text="1",color=color.black,box=False,background=color.white)

grid_width = 1

add_squares()

add_squares()

# Create the knight and its list of visited squares.

knight = sphere(color=color.red,radius=0.25,pos=vector(starting_point_x,starting_point_y,0.25),make_trail=True,interval=1)

visited = [square(starting_point_x,starting_point_y)]

# Set up loop.

n = 1

# Set maximum number of iterations.

n_max = 2017

# Begin loop.

done = False

while (not done):

# Use rate to optimize speed.

# Use sleep to show all points on the knight's path.

rate(10000)

#sleep(0.0001)

# Establish which squares can be visited.

can_visit = []

can_visit.append(square(knight.pos.x+d1,knight.pos.y+d2))

can_visit.append(square(knight.pos.x+d2,knight.pos.y+d1))

can_visit.append(square(knight.pos.x+d1,knight.pos.y-d2))

can_visit.append(square(knight.pos.x+d2,knight.pos.y-d1))

can_visit.append(square(knight.pos.x-d1,knight.pos.y+d2))

can_visit.append(square(knight.pos.x-d2,knight.pos.y+d1))

can_visit.append(square(knight.pos.x-d1,knight.pos.y-d2))

can_visit.append(square(knight.pos.x-d2,knight.pos.y-d1))

# Remove squares that have been visited.

for s in visited:

if (s in can_visit):

can_visit.remove(s)

# If can't visit any, game is over!

if (len(can_visit)==0):

print("I am trapped!")

done = True

else:

# Find minimum number among squares that can be visited.

min_num = len(squares)

for p in can_visit:

if (p.num < min_num):

min_num = p.numerical

# MOVE THAT KNIGHT!

knight.pos = vector(squares[min_num-1].x,squares[min_num-1].y,0)

# Update list of visited squares.

visited.append(squares[min_num-1])

print(min_num)

# If knight is too close to border, broaden the chessboard by two.

if ((abs(knight.pos.x) > grid_width/2-max(d1,d2)) or (abs(knight.pos.y) > grid_width/2-max(d1,d2))):

add_squares()

add_squares()

for x in range(2,max(d1,d2)+2,1):

add_squares()

n = n + 1

done = (n >= n_max)

def add_squares(): # Add a ring of squares in the spiral.

global squares

global grid_width

r = 10000

grid_width = grid_width+2

x = squares[len(squares)-1].x +1

y = squares[len(squares)-1].y

while (y <= int(grid_width/2)):

rate(r)

s = vector(x,y,0)

s.num=len(squares)+1

s.block = box(pos=vector(x,y,0),size=vector(0.9,0.9,0.1))

#s.text = label(pos=vector(x,y,0),text=s.num,color=color.black,box=False,background=color.white)

squares.append(s)

y = y + 1

y = int(grid_width/2)

x = x - 1

while (x >= -int(grid_width/2)):

rate(r)

s = vector(x,y,0)

s.num=len(squares)+1

s.block = box(pos=vector(x,y,0),size=vector(0.9,0.9,0.1))

#s.text = label(pos=vector(x,y,0),text=s.num,color=color.black,box=False,background=color.white)

squares.append(s)

x = x - 1

x = -int(grid_width/2)

y = y - 1

while (y >= -int(grid_width/2)):

rate(r)

s = vector(x,y,0)

s.num=len(squares)+1

s.block = box(pos=vector(x,y,0),size=vector(0.9,0.9,0.1))

#s.text = label(pos=vector(x,y,0),text=s.num,color=color.black,box=False,background=color.white)

squares.append(s)

y = y - 1

y = -int(grid_width/2)

x = x + 1

while (x <= int(grid_width/2)):

rate(r)

s = vector(x,y,0)

s.num=len(squares)+1

s.block = box(pos=vector(x,y,0),size=vector(0.9,0.9,0.1))

#s.text = label(pos=vector(x,y,0),text=s.num,color=color.black,box=False,background=color.white)

squares.append(s)

x = x + 1

return

def square(x,y):

# Retrieve the square located at (x,y).

global squares

for s in squares:

if (abs(s.x-x)<0.1 and abs(s.y-y)<0.1):

return s

return 7

##############


> *কোড রান করার উপায় *

Code টি রান করলে Knight টি 2084 নাম্বার বার গিয়ে Trapped হয়ে যায়। Python সম্পর্কে মোটামুটি Code করার অভিজ্ঞতা থাকলে Code টি বুঝতে পারবেন।

কোডটি আপনি চাইলে [https://trinket.io/glowscript/27ce3a6072](https://trinket.io/glowscript/27ce3a6072) তে ঢুকে কোড রান করতে পারেন। code টি edit করে আপনি আপনার ইচ্ছমতো সিকুয়েন্স বা বোর্ডের জন্য অন্তিম বিন্দু বের করতে পারবেন।

যদি আপনি Glow Script এর সাথে পরিচিত না হন। কিন্তু জনপ্রিয় Numpy framework & Matplotlib এর সাথে পরিচিত হয় তবেও চলবে। Numpy & Matplotlib এর কোড লেখার শেষে দিয়ে দিয়েছি link হিসেবে scipython এর। 

এভাবে আপনি চাইলে বিভিন্ন রকমের Shape এর জন্য কেমন ফিগার আসবে তা বের করতে পারবেন। কয়েকটি স্যাম্পল আমি দিয়ে দিলাম ছবিতে বিভিন্ন পজিশনের জন্য।


> *সিকুয়েন্স এন্ড প্রেডিকশন *

পুরা মহাবিশ্বটাই একটা সিকুয়েন্স নিয়ে চলে। দাবা খেলার রুলগুলোও একটা সিকুয়েন্সের অংশ। কয়েন টস করা, তাস খেলা এগুলো প্রকৃতিতে র‍্যান্ডম এক একটি ব্যাপার এগুলোর মধ্যে সিকুয়েন্স নেই একদম। অনিশ্চিত কিছু কিছু জিনিসের আবার কিছু র‍্যান্ডম সিকুয়েন্স থাকে যেগুলো ১০০% প্রেডিক্টেবল না। ওই ব্যাপারগুলতে আমরা একটা কয়েক ডিজিটের প্রবাবিলিটি থ্রো করতে পারি। যেমনটি হয় পরমানুর অভ্যন্তরে QUANTUM LEVEL এ Electron Cloud Density. আমরা শুধু সম্ভাবনা বলতে পারি কোথায় ৯০-৯৫% চান্স আছে ইলেক্ট্রেন পাবার। আইনেস্টাইন বলতেন “ ঈশ্বর পাশা খেলেন না”। ওনার মনোভাব আসলে কি ছিলো আমার জানা নেই। তবে আমি বলব “ঈশ্বর আমাদের ভাবচ্ছেন…..ভাববার সময় দিয়েছেন।”

>Reference:

1) Code

[https://scipython.com/blog/the-trapped-knight/](https://scipython.com/blog/the-trapped-knight/)

2) Lecture 

[https://www.youtube.com/watch?v=RGQe8waGJ4w](https://www.youtube.com/watch?v=RGQe8waGJ4w)

3) Article 

https://maartenmortier.medium.com/the-trapped-knight-revisited-132c034a8a28

4) Article 

[https://observablehq.com/@yusofbandar/the-trapped-knight](https://observablehq.com/@yusofbandar/the-trapped-knight)

[#tachyon](https://www.facebook.com/hashtag/tachyon?__eep__=6&__cft__[0]=AZWTiLV66yVSq_ky6IgRWJPJnnp3qKcCdbCNnZHfNFDUar9FY2bXinzlBZhmXojNOo3VPEifqVol9bgJBdgaQrRjFNllauQWKtYJQSfruiRt00xjSWBLxRmI95kHWEVdD_aTxY53De34mdCxP9BOeZXv&__tn__=*NK-R)


Writer: Taif Mahbub Shapnow

একটি মন্তব্য পোস্ট করুন

নবীনতর পূর্বতন

যোগাযোগ ফর্ম