আপনি একটি বায়োইঞ্জিনিয়ারিং কোম্পানিতে কাজ করেন, যেটি থেরাপিউটিক সমাধান তৈরিতে বিশেষজ্ঞ।
আপনার দল সদ্য একটি নতুন প্রকল্পের দায়িত্ব পেয়েছে: এক বিরল ধরনের ক্যান্সারের জন্য একটি টার্গেটেড থেরাপি তৈরি করা।
বিষয়টা আসলে খুবই জটিল, তবে মূল ধারণাটি হলো, মাঝে মাঝে মানুষের শরীরে একটি নির্দিষ্ট প্রোটিন প্রয়োজনীয় পরিমাণের চেয়ে অনেক বেশি তৈরি হয়। এতে নানা রকম ক্ষতি হতে পারে।
কিন্তু আপনি যদি খুব নির্দিষ্ট একটি অণু তৈরি করতে পারেন (যাকে micro-RNA বলা হয়), তবে সেটি ওই প্রোটিন তৈরি হওয়া আটকে দিতে পারে।
এই কৌশলটির নাম RNA Interference।
আপনার কাজ হলো একটি প্রদত্ত DNA সিকোয়েন্সের RNA কমপ্লিমেন্ট নির্ণয় করা।
DNA এবং RNA, দুটি স্ট্র্যান্ডই নিউক্লিওটাইডের একটি সিকোয়েন্স।
DNA-তে পাওয়া চারটি নিউক্লিওটাইড হলো অ্যাডেনিন (A), সাইটোসিন (C), গুয়ানিন (G) এবং থাইমিন (T)।
RNA-তে পাওয়া চারটি নিউক্লিওটাইড হলো অ্যাডেনিন (A), সাইটোসিন (C), গুয়ানিন (G) এবং ইউরাসিল (U)।
একটি DNA স্ট্র্যান্ড দেওয়া হলে, প্রতিটি নিউক্লিওটাইডকে তার কমপ্লিমেন্ট দিয়ে প্রতিস্থাপন করে এর ট্রান্সক্রাইব করা RNA স্ট্র্যান্ড তৈরি হয়:
G -> C
C -> G
T -> A
A -> U
ইনপুট আর আউটপুট কীভাবে সাজানো থাকে তা দেখতে চাইলে test suite-এর উদাহরণগুলো একবার দেখুন।
স্ট্রাক্টে প্রাইভেট ফিল্ড রেখে এবং Option বা Result রিটার্ন করে এমন পাবলিক new ফাংশন ব্যবহার করে (এখানে যেমন DNA::new ও RNA::new) আমরা নিশ্চিত করতে পারি যে DNA-এর অভ্যন্তরীণ রিপ্রেজেন্টেশন সঠিক। যেহেতু প্রতিটি বৈধ DNA স্ট্রিংয়ের একটি বৈধ RNA স্ট্রিং থাকে, তাই into_rna থেকে Result/Option রিটার্ন করার দরকার নেই।
টেস্টে যে টাইপ সিগনেচারগুলো দেখবেন, তার ব্যাখ্যা এটাই।
DNA::new() ও RNA::new() দুটিরই রিটার্ন টাইপ Result<Self, usize>, যেখানে এরর টাইপ usize প্রথম অবৈধ ক্যারেক্টারের ইনডেক্স বোঝায় (char ইনডেক্স, utf8 নয়)।
Exercism-এ সাইন আপ করুন, Rust ট্র্যাকের 99টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।