ট্র্যাক
/
Go
Go
/
অনুশীলনী
/
রোবট সিমুলেটর
রোবট সিমুলেটর

রোবট সিমুলেটর

মধ্যম

নির্দেশনা

একটি রোবট সিমুলেটর লিখুন।

একটি রোবট কারখানার টেস্ট ফ্যাসিলিটির রোবটের নড়াচড়া যাচাই করার জন্য একটি প্রোগ্রাম দরকার।

রোবটদের তিনটি সম্ভাব্য নড়াচড়া আছে:

  • ডান দিকে ঘোরা
  • বাম দিকে ঘোরা
  • সামনে এগোনো

রোবটদের একটি কাল্পনিক অসীম গ্রিডে রাখা হয়, যেখানে তারা {x,y} কোঅর্ডিনেটে, যেমন {3,8}, একটি নির্দিষ্ট দিকে (উত্তর, পূর্ব, দক্ষিণ বা পশ্চিম) মুখ করে থাকে; উত্তর ও পূর্ব দিকে গেলে কোঅর্ডিনেট বাড়ে।

এরপর রোবট বেশ কিছু নির্দেশনা পায়, আর তখনই টেস্টিং ফ্যাসিলিটি যাচাই করে রোবটের নতুন অবস্থান এবং এটি কোন দিকে মুখ করে আছে।

  • "RAALAL" অক্ষর-স্ট্রিংটির অর্থ:
    • ডান দিকে ঘোরা
    • দুইবার সামনে এগোনো
    • বাম দিকে ঘোরা
    • একবার সামনে এগোনো
    • আবারও বাম দিকে ঘোরা
  • ধরুন একটি রোবট {7, 3} অবস্থানে উত্তর দিকে মুখ করে যাত্রা শুরু করল। তাহলে নির্দেশনার এই ধারাটি চালালে শেষে সেটি {9, 4} অবস্থানে পশ্চিম দিকে মুখ করে থাকবে।

ইমপ্লিমেন্টেশন নোট

টেস্টগুলো ৩টি ধাপে ভাগ করা হয়েছে।

সব টেস্ট go test দিয়ে রান করুন, অথবা -tags অপশন দিয়ে নির্দিষ্ট টেস্ট রান করুন।

উদাহরণ:

go test                      # run all tests
go test -tags step1          # run just step 1 tests.
go test -tags 'step1 step2'  # run step1 and step2 tests

আপনাকে defs.go সোর্স ফাইলটি দেওয়া হয়েছে, যেখানে টেস্ট প্রোগ্রামের প্রয়োজন হয় এমন অনেক কিছু ডিফাইন করা আছে। এটি ধাপ অনুযায়ী তিনটি অংশে সাজানো।

ধাপ ১

ধাপ ১ সম্পূর্ণ করতে হলে আপনি Right, Left, Advance, N, S, E, W এবং Dir ডিফাইন করবেন। ধাপ ২-এ যাওয়ার আগে ধাপ ১ শেষ করুন।

ধাপ ২

ধাপ ১-এ আপনি রোবটের নড়াচড়া ইমপ্লিমেন্ট করেছিলেন, কিন্তু সেটা তেমন সিমুলেশন নয়। যেমন, সোর্স কোডে "রোবট" কোথায়? "গ্রিড" কোথায়? রোবটের অ্যাকশনকে গ্রিডের অবস্থানে বদলে দেওয়ার হিসাবগুলো কোথায়, রোবটের ভেতরে, নাকি গ্রিডের ভেতরে? বাস্তব জগৎটা আলাদা।

ধাপ ২-এ একটি "রুম" যুক্ত হয়। এটা ছোট একটি সংযোজন মনে হলেও, "রুম", "রোবট" আর "টেস্ট প্রোগ্রাম"-এর ভূমিকা স্পষ্ট করতে এবং সিমুলেশনের ভৌত দিকগুলো পরিষ্কার করতে আমরা বড় পরিবর্তন করব। আপনি Room আর Robot-কে ফাংশন হিসেবে ডিফাইন করবেন, যাদের টেস্ট প্রোগ্রাম গোরুটিন হিসেবে চালু করে "অস্তিত্বে নিয়ে আসে"। টেস্ট প্রোগ্রাম, রোবট আর রুমের মধ্যে তথ্য চলাচল করে Go চ্যানেলের মাধ্যমে।

Room-কে ভাবুন একটি "ফিজিক্স ইঞ্জিন" হিসেবে, যা দেয়াল আর একটি রোবটসহ একটি বাস্তব রুমের মডেল তৈরি করে এবং সিমুলেট করে। এটিকে কোনোভাবে রুমের কোঅর্ডিনেট স্পেস, রোবট ও দেয়ালের অবস্থান মডেল করতে হবে, আর নিশ্চিত করতে হবে যে রোবট দেয়াল ভেদ করে হেঁটে যায় না। আমরা চাই Robot হোক এমন একটি এজেন্ট যা অ্যাকশন সম্পাদন করে, কিন্তু চাই Room একটি সুসংগত সত্য ধরে রাখুক।

টেস্ট প্রোগ্রামটি চ্যানেলগুলো তৈরি করে এবং Room ও Robot দুটোই চালু করে। এরপর টেস্ট প্রোগ্রাম Robot-এর কাছে কমান্ড পাঠায়। কমান্ড পাঠানো শেষ হলে সে কমান্ড চ্যানেলটি বন্ধ করে দেয়। Robot-কে কমান্ড গ্রহণ করতে হবে এবং যে অ্যাকশনগুলো সে করতে যাচ্ছে তা Room-কে জানাতে হবে। কমান্ড চ্যানেল বন্ধ হয়ে যাওয়া টের পেলে তাকে নিজেকে বন্ধ করে দিতে হবে। রুমকে রোবটের অ্যাকশনের ভৌত পরিণতি ব্যাখ্যা করতে হবে। রোবট বন্ধ হয়ে যাচ্ছে টের পেলে সে টেস্ট প্রোগ্রামের কাছে একটি চূড়ান্ত রিপোর্ট পাঠায়, যেখানে রোবটের চূড়ান্ত অবস্থান ও দিক থাকে।

ধাপ ৩

ধাপ ৩-এ তিনটি বড় পরিবর্তন আছে:

  • রোবটগুলো আলাদা আলাদা কমান্ডের উত্তর দেওয়ার বদলে স্ক্রিপ্ট চালায়।
  • একটি লগ চ্যানেল রোবট আর রুমকে মেসেজ লগ করার সুযোগ দেয়।
  • রুম একাধিক রোবটকে একসাথে থাকতে ও চলতে দেয়।

Room3 থেকে পাঠানো চূড়ান্ত অবস্থান রিপোর্টের জন্য, robots চ্যানেল থেকে পাওয়া একই স্লাইসই রিটার্ন করতে পারেন, শুধু হালনাগাদ করা অবস্থান ও দিকসহ। নিচের ক্ষেত্রে লগ চ্যানেলে মেসেজ পাঠাতে হবে:

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

সূত্র

একটি বিখ্যাত কোম্পানির ইন্টারভিউ প্রশ্ন থেকে অনুপ্রাণিত।
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Go Exercism

রোবট সিমুলেটর শুরু করতে প্রস্তুত?

Exercism-এ সাইন আপ করুন, Go ট্র্যাকের 34টি কনসেপ্ট165টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।