আপনি এইমাত্র গণিতের অধ্যাপক হিসেবে নিয়োগ পেয়েছেন। প্রথম সপ্তাহ ভালোই কেটেছিল, কিন্তু দ্বিতীয় সপ্তাহে কোথাও একটা গোলমাল। সমস্যা হলো, আপনার শিক্ষার্থীরা যে উত্তরগুলো দিচ্ছে, প্রতিটিই ভুল! ভাগ্যক্রমে, আপনার গণিতের দক্ষতা দিয়ে আপনি সমস্যাটি চিহ্নিত করতে পেরেছেন: শিক্ষার্থীদের উত্তরগুলো আসলে সঠিক, কিন্তু সেগুলো সবই বেস ২-এ (বাইনারি) লেখা! আশ্চর্যের ব্যাপার হলো, দেখা গেল প্রতি সপ্তাহে শিক্ষার্থীরা ভিন্ন একটি বেস ব্যবহার করে। শিক্ষার্থীদের উত্তর দ্রুত যাচাই করতে সাহায্য করার জন্য আপনি এমন একটি টুল বানাবেন, যা এক বেস থেকে আরেক বেসে রূপান্তর করে।
একটি বেসে লেখা অঙ্কের একটি ক্রম, যা একটি সংখ্যাকে বোঝায়, সেটিকে অন্য একটি বেসে সেই একই সংখ্যাকে বোঝায় এমন অঙ্কের ক্রমে রূপান্তর করুন।
রূপান্তরটি নিজে নিজেই লেখার চেষ্টা করুন। রূপান্তরের কাজটি করার জন্য অন্য কিছু ব্যবহার করবেন না।
পজিশনাল নোটেশনে, b বেসের একটি সংখ্যাকে b-এর ঘাতগুলোর একটি রৈখিক সমন্বয় হিসেবে বোঝা যায়।
সংখ্যা 42, বেস 10-এ, মানে:
(4 × 10¹) + (2 × 10⁰)
সংখ্যা 101010, বেস 2-এ, মানে:
(1 × 2⁵) + (0 × 2⁴) + (1 × 2³) + (0 × 2²) + (1 × 2¹) + (0 × 2⁰)
সংখ্যা 1120, বেস 3-এ, মানে:
(1 × 3³) + (1 × 3²) + (2 × 3¹) + (0 × 3⁰)
হ্যাঁ। উপরের এই তিনটি সংখ্যাই আসলে একেবারে একই। অভিনন্দন!
WebAssembly এক্সপোর্ট convert-এর ফাংশন সিগনেচার নিম্নরূপ:
(func (export "convert")
(param $arrOffset i32)
(param $arrLength i32)
(param $inputBase i32)
(param $outputBase i32)
(result i32 i32 i32)
)
প্রথম দুটি প্যারামিটার $arrOffset ও $arrLength হলো ৩২-বিট সাইনড ইন্টিজারের একটি অ্যারের বেস অফসেট ও দৈর্ঘ্য। দৈর্ঘ্যের প্যারামিটারটি অ্যারের এলিমেন্টের সংখ্যায় মাপা হয়, বাইটে নয়। এই ফাংশনটি কল করার আগে কলকারী অ্যারেটি $arrOffset অফসেট থেকে শুরু করে WebAssembly-এর লিনিয়ার মেমোরিতে লেখে। WebAssembly-এর লিনিয়ার মেমোরি সবসময় লিটল-এন্ডিয়ানে প্রকাশ করা হয়।
সুতরাং কলকারী [1,2] অ্যারেটিকে নিচের আট বাইটের ক্রম হিসেবে এনকোড করবে।
| 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 |
| ---- arr[0] ----- | ---- arr[1] ----- |
,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
$inputBase ও $outputBase প্যারামিটারদুটির সঙ্গে লিনিয়ার মেমোরির কোনো সম্পর্ক নেই।
রেজাল্ট টাইপটি (i32 i32 i32)। প্রথম দুটি মান হলো লিনিয়ার মেমোরিতে আপনার আউটপুটের offset ও length। আপনি চাইলে ইনপুটের জন্য ব্যবহৃত লিনিয়ার মেমোরির অ্যাড্রেসগুলো ওভাররাইট করতে পারেন। তৃতীয় রিটার্ন ভ্যালুটি একটি i32 স্টেটাস কোড, যা এরর হ্যান্ডলিংয়ের জন্য ব্যবহৃত হয়।
তৃতীয় রিটার্ন ভ্যালুটি যদি কোনো এরর অবস্থা বোঝায়, তবে ইউনিট টেস্ট প্রথম দুটি রিটার্ন ভ্যালু পড়ে না।
Exercism-এ সাইন আপ করুন, WebAssembly ট্র্যাকের 87টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।