ট্র্যাক
/
Crystal
Crystal
/
অনুশীলনী
/
নেভিগেশন কম্পিউটার
নেভিগেশন কম্পিউটার

নেভিগেশন কম্পিউটার

লার্নিং অনুশীলনী

ভূমিকা

Crystal-এ নানা কাজের জন্য বিভিন্ন রকমের সংখ্যার টাইপ রয়েছে। উদাহরণস্বরূপ, কিছু টাইপ দ্রুততর, কিন্তু সম্ভাব্য মানের পরিসর অন্য টাইপগুলোর চেয়ে ছোট। আবার কিছু টাইপের সম্ভাব্য মানের পরিসর অনেক বড়, কিন্তু সেগুলো ধীরগতির।

Crystal-এ সাইনড এবং আনসাইনড, দুধরনের ইন্টিজার টাইপই আছে। সাইনড ইন্টিজার টাইপ ধনাত্মক বা ঋণাত্মক হতে পারে। আনসাইনড ইন্টিজার টাইপ কেবল ধনাত্মক হতে পারে।

সাইনড ইন্টিজার টাইপ

Crystal-এ এগুলো হলো সাইনড ইন্টিজার টাইপ:

টাইপ আকার (বিট) পরিসর
Int8 8 -128 to 127
Int16 16 -32_768 to 32_767
Int32 32 -2_147_483_648 to 2_147_483_647
Int64 64 -9_223_372_036_854_775_808 to 9_223_372_036_854_775_807
Int128 128 -170_141_183_460_469_231_731_687_303_715_884_105_728 to 170_141_183_460_469_231_731_687_303_715_884_105_727

ছোট টাইপগুলো বড় টাইপের চেয়ে কম মেমরি ব্যবহার করে এবং দ্রুততর, তবে সম্ভাব্য মানের পরিসর ছোট।

যখন আপনি জানেন যে মানগুলো একটি নির্দিষ্ট পরিসরের মধ্যে থাকবে, তখন মেমরি বাঁচাতে ও পারফরম্যান্স বাড়াতে সম্ভব হলে সবচেয়ে ছোট টাইপ ব্যবহার করাই সবচেয়ে ভালো।

ডিফল্ট ইন্টিজার টাইপ হলো Int32. নির্দিষ্ট টাইপের একটি ইন্টিজার ডিক্লেয়ার করতে, <number>_I <bit> যোগ করে টাইপের নামটি সাফিক্স হিসেবে ব্যবহার করতে পারেন।

1_i8.class
# => Int8

ভিন্ন ভিন্ন ইন্টিজার টাইপের মধ্যে রূপান্তর করতে আপনি to_i<bit> মেথড ব্যবহার করতে পারেন। to_i মেথড ডিফল্ট ইন্টিজার টাইপ Int32-এ রূপান্তর করে।

1_i8.to_i16.class
# => Int16

2_i16.to_i.class
# => Int32

আনসাইনড ইন্টিজার টাইপ

Crystal-এ এগুলো হলো আনসাইনড ইন্টিজার টাইপ:

UInt8, UInt16, UInt32, UInt64, UInt128

সাইনড ও আনসাইনড ইন্টিজারের মধ্যে একমাত্র পার্থক্য হলো, আনসাইনড ইন্টিজার কেবল ধনাত্মক হতে পারে। নির্দিষ্ট টাইপের একটি আনসাইনড ইন্টিজার ডিক্লেয়ার করতে, <number>_u<bit> যোগ করে টাইপের নামটি সাফিক্স হিসেবে ব্যবহার করতে পারেন। ভিন্ন ভিন্ন আনসাইনড ইন্টিজার টাইপের মধ্যে রূপান্তর করতে আপনি to_u<bit> মেথড ব্যবহার করতে পারেন। to_u মেথড ডিফল্ট আনসাইনড ইন্টিজার টাইপ UInt32-এ রূপান্তর করে।

1_u8.to_u16.class
# => UInt16

ফ্লোটিং পয়েন্ট টাইপ

Crystal-এ এগুলো হলো ফ্লোটিং পয়েন্ট টাইপ:

টাইপ আকার (বিট) পরিসর
Float32 32 1.2E-38 to 3.4E+38
Float64 64 2.3E-308 to 1.7E+308

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

ডিফল্ট ফ্লোটিং পয়েন্ট টাইপ হলো Float64.

ভিন্ন ভিন্ন ফ্লোটিং পয়েন্ট টাইপের মধ্যে রূপান্তর করতে আপনি to_f<bit> মেথড ব্যবহার করতে পারেন। to_f মেথড ডিফল্ট ফ্লোটিং পয়েন্ট টাইপ Float64-এ রূপান্তর করে।

নির্দেশনা

ESA (Exercism Space Agency) মঙ্গলগ্রহের একটি উপগ্রহ ফোবোস-এ নতুন একটি মিশনের পরিকল্পনায় পুরোদমে এগিয়ে চলেছে। মিশনের লক্ষ্য হলো ফোবোসের পৃষ্ঠে একটি প্রোব অবতরণ করানো এবং সেই পৃষ্ঠ সম্পর্কে ডেটা ফেরত পাঠানো। প্রোবটির নেভিগেশন কম্পিউটার তৈরিতে ESA আপনার সাহায্য চেয়েছে। নেভিগেশন কম্পিউটারের মেমরি সীমিত, তাই মেমরির ব্যবহার যতটা সম্ভব কম রাখতে হবে। তাই আমাদের উপযুক্ত ডেটা টাইপ ব্যবহার করতে হবে।

1. নেভিগেশন কনস্ট্যান্ট

সঠিক হিসাব করার জন্য নেভিগেশন কম্পিউটারকে মহাকাশের কিছু বস্তুর মধ্যে দূরত্ব জানতে হয়। এই দূরত্ব মাপা হয় km-এ।

নিচের কনস্ট্যান্টগুলো ডিফাইন করুন:

  • NEPTUNE_DISTANCE নামে 4_400_000_000 মানের একটি কনস্ট্যান্ট, যা Int64 হিসেবে সংরক্ষণ করতে হবে
  • MARS_DISTANCE নামে 227_940_000 মানের একটি কনস্ট্যান্ট, যা Int32 হিসেবে সংরক্ষণ করতে হবে
  • ATMOSPHERE_DISTANCE নামে 10_000 মানের একটি কনস্ট্যান্ট, যা Int16 হিসেবে সংরক্ষণ করতে হবে

2. সঠিক ক্ষেত্রফল বিশ্লেষণ

সঠিক হিসাব করার জন্য নেভিগেশন কম্পিউটারকে মহাকাশের কিছু বস্তুর ক্ষেত্রফল জানতে হয়। একটি ক্ষেত্রফল ঋণাত্মক হতে পারে না। ইঞ্জিনিয়াররা প্রোগ্রামটি এমনভাবে বানানোর পরিকল্পনা করেছিলেন যাতে ক্ষেত্রফল ঋণাত্মক হলে একটি ওভারফ্লো এরর তৈরি হয়। তবে ইঞ্জিনিয়াররা সাইনড ইন্টিজারটিকে আনসাইন্ড ইন্টিজারে বদলাতে ভুলে গিয়েছিলেন।

তাই ইঞ্জিনিয়াররা এমন একটি প্রোগ্রাম চান যা একটি সাইনড ইন্টিজারকে আনসাইন্ড ইন্টিজারে রূপান্তর করে।

Navigation#correct_area_analysis মেথডটি ইমপ্লিমেন্ট করুন, যা আর্গুমেন্ট হিসেবে একটি measurement নেয় এবং ৩২ বিটের একটি আনসাইন্ড ইন্টিজার হিসেবে ক্ষেত্রফল রিটার্ন করে।

Note

প্রদত্ত ক্ষেত্রফল সর্বদা ৩২ বিটের একটি আনসাইন্ড ইন্টিজার হিসেবে ধরে যাবে।

measurement = 52554
measurement.class
# => Int32

Navigation.new.correct_area_analysis(measurement)
# => 52554

Navigation.new.correct_area_analysis(measurement).class
# => UInt32

3. বেগ হিসাব করা

নেভিগেশন কম্পিউটারকে প্রোবের বেগ জানতে হবে। বেগ মাপা হয় m/s-এ।

বেগ হিসাব করতে হলে অতিক্রম করা দূরত্ব এবং সেই দূরত্ব অতিক্রম করতে যে সময় লেগেছে, তা জানতে হবে। তারপর দূরত্ব নিয়ে সেটিকে সময় দিয়ে ভাগ করুন।

বেগ সবসময় নিখুঁত নাও হতে পারে এবং কখনোই খুব বড় কোনো সংখ্যা হবে না। তাই আমরা একটি Float32 ব্যবহার করতে পারি।

Navigation#calculate_velocity মেথডটি ইমপ্লিমেন্ট করুন, যা আর্গুমেন্ট হিসেবে distance ও time নেয় এবং ৩২ বিটের একটি Float হিসেবে বেগ রিটার্ন করে।

distance = 52554
time = 2.5

Navigation.new.calculate_velocity(distance, time)
# => 21021.6

Navigation.new.calculate_velocity(distance, time).class
# => Float32
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Crystal Exercism

নেভিগেশন কম্পিউটার শুরু করতে প্রস্তুত?

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