ট্র্যাক
/
Elixir
Elixir
/
অনুশীলনী
/
ক্যাপ্টেনের লগ
ক্যাপ্টেনের লগ

ক্যাপ্টেনের লগ

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

ভূমিকা

র‍্যান্ডমনেস

Elixir-এ একটি এনিউমারেবল ডেটা স্ট্রাকচার (যেমন অ্যারে, রেঞ্জ) থেকে এলোমেলো একটি এলিমেন্ট বাছতে আমরা Enum.random ব্যবহার করি। এই ফাংশনটি একটি মাত্র এলিমেন্ট বাছবে এবং প্রতিটি এলিমেন্ট বাছাই হওয়ার সম্ভাবনা সমান থাকবে।

এলোমেলো ফ্লোট বাছার জন্য Elixir-এর নিজস্ব কোনো ফাংশন নেই। এটি করতে হলে আমাদের সরাসরি Erlang ব্যবহার করতে হয়।

Erlang লাইব্রেরি

Elixir কোড BEAM ভার্চুয়াল মেশিনে চলে। BEAM হলো Erlang Run-Time System-এর একটি অংশ। Erlang দ্বারা অনুপ্রাণিত এবং তার রান এনভায়রনমেন্ট ভাগ করে নেওয়ায় Elixir, Erlang লাইব্রেরিগুলোর সাথে চমৎকার ইন্টারঅপারেবিলিটি প্রদান করে। এর মানে হলো, Elixir ডেভেলপাররা তাঁদের Elixir কোডের ভেতর থেকেই Erlang লাইব্রেরি ব্যবহার করতে পারেন। বাস্তবে, Erlang লাইব্রেরি ইতিমধ্যে যে কার্যকারিতা দেয়, তার জন্য Elixir লাইব্রেরি লেখা Elixir কমিউনিটিতে নিরুৎসাহিত করা হয়।

ফলাফল হিসেবে, গাণিতিক অপারেশন বা টাইমার ফাংশনের মতো কিছু কার্যকারিতা Elixir-এ কেবল Erlang-এর মাধ্যমে পাওয়া যায়।

Erlang-এর স্ট্যান্ডার্ড লাইব্রেরি কোনো বাড়তি ধাপ ছাড়াই আমাদের Elixir কোডে ব্যবহার করা যায়।

Erlang ফাংশন আমরা Elixir ফাংশন যেভাবে কল করি, ঠিক সেভাবেই কল করতে পারি, কেবল একটি ছোট পার্থক্য আছে। Erlang মডিউলের নাম হয় snake_case অ্যাটম। উদাহরণস্বরূপ, math মডিউল থেকে Erlang-এর pi/0 ফাংশনটি কল করতে হলে লিখতে হবে:

:math.pi()
# => 3.141592653589793

যে Erlang ফাংশনগুলোর Elixir-এ সমতুল্য কিছু নেই, সেগুলোর মধ্যে সবচেয়ে বেশি ব্যবহৃত হয়:

  • :timer.sleep/1, যা নির্দিষ্ট সংখ্যক মিলিসেকেন্ডের জন্য একটি প্রসেসকে স্থগিত রাখে।
  • :rand.uniform/0, যা একটি এলোমেলো ফ্লোট x তৈরি করে, যেখানে 0.0 <= x < 1.0।
  • :io_lib.format/2, যা C-স্টাইলের স্ট্রিং ফরম্যাটিং প্রদান করে (কন্ট্রোল সিকোয়েন্স ব্যবহার করে)। এই ফাংশনটি ব্যবহার করে আমরা উদাহরণস্বরূপ ২ থেকে ৩৬-এর যেকোনো বেসে একটি ইন্টিজার প্রিন্ট করতে পারি, বা কাঙ্ক্ষিত নির্ভুলতায় একটি ফ্লোট ফরম্যাট করতে পারি। মনে রাখবেন, অনেক Erlang ফাংশনের মতো এই ফাংশনটিও একটি চারলিস্ট রিটার্ন করে।
  • math মডিউল, যা sin/1, cos/1, log2/1, log10/1, pow/2 ইত্যাদি গাণিতিক ফাংশন প্রদান করে।

Erlang-এর স্ট্যান্ডার্ড লাইব্রেরি সম্পর্কে জানতে, STDLIB Reference Manual ঘুরে দেখুন।

নির্দেশনা

মেরি টিভি সিরিজ Star Trek: The Next Generation-এর একজন বড় ভক্ত। তিনি প্রায়ই কলম-কাগজের রোল প্লেয়িং গেম খেলেন, যেখানে তিনি ও তাঁর বন্ধুরা Starship Enterprise-এর ক্রু সেজে অভিনয় করেন। মেরির চরিত্রটি ক্যাপ্টেন পিকার্ড, অর্থাৎ তাঁকে ক্যাপ্টেনের লগ রাখতে হয়। গেমটির সৃজনশীল অংশটি তিনি খুব ভালোবাসেন, কিন্তু সঙ্গে সঙ্গে র্যান্ডম ডেটা জেনারেট করতে পছন্দ করেন না।

ক্যাপ্টেনের লগে সাধারণত যে ডেটা দেখা যায়, তার জন্য র্যান্ডম জেনারেটর তৈরি করে মেরিকে সাহায্য করুন।

1. একটি র্যান্ডম গ্রহ তৈরি করুন

Starship Enterprise তার যাত্রায় অনেক গ্রহের মুখোমুখি হয়। স্টার ট্রেক মহাবিশ্বের গ্রহগুলোকে তাদের বৈশিষ্ট্যের ভিত্তিতে ক্লাসে ভাগ করা হয়েছে। উদাহরণস্বরূপ, পৃথিবী একটি M ক্লাসের গ্রহ। সম্ভাব্য সব গ্রহের ক্লাস হলো: D, H, J, K, L, M, N, R, T এবং Y।

random_planet_class/0 ফাংশনটি ইমপ্লিমেন্ট করুন। এটি র্যান্ডমভাবে গ্রহের ক্লাসগুলোর একটি রিটার্ন করবে।

CaptainsLog.random_planet_class()
# => "K"

2. একটি র্যান্ডম স্টারশিপ রেজিস্ট্রি নম্বর তৈরি করুন

মহাকাশে ঘুরে বেড়ানো একমাত্র স্টারশিপ এন্টারপ্রাইজ (রেজিস্ট্রি নম্বর NCC-1701) নয়! অন্য একটি স্টারশিপের সঙ্গে মিলিত হলে মেরিকে সেই স্টারশিপের রেজিস্ট্রি নম্বর লগ করতে হয়।

রেজিস্ট্রি নম্বরের শুরুতে "NCC-" প্রিফিক্স থাকে এবং তারপর 1000 থেকে 9999 (সহ) পর্যন্ত একটি সংখ্যা ব্যবহৃত হয়।

random_ship_registry_number/0 ফাংশনটি ইমপ্লিমেন্ট করুন, যা একটি র্যান্ডম স্টারশিপ রেজিস্ট্রি নম্বর রিটার্ন করে।

CaptainsLog.random_ship_registry_number()
# => "NCC-1947"

3. একটি র্যান্ডম স্টারডেট তৈরি করুন

লগে তারিখ না থাকলে লগের কী লাভ?

স্টারডেট হলো একটি ফ্লোটিং পয়েন্ট সংখ্যা। The Next Generation-এর প্রথম সিজনের Starship Enterprise-এর অভিযানগুলো 41000.0 থেকে 42000.0 স্টারডেটের মধ্যে ঘটে। এখানে "4" বোঝায় ২৪তম শতাব্দী, আর "1" বোঝায় প্রথম সিজন।

random_stardate/0 ফাংশনটি ইমপ্লিমেন্ট করুন, যা 41000.0 (সহ) থেকে 42000.0 (বহির্ভূত) এর মধ্যে একটি ফ্লোটিং পয়েন্ট সংখ্যা রিটার্ন করে।

ইমপ্লিমেন্টেশনে একটি Erlang ফাংশন ব্যবহার করা উচিত।

CaptainsLog.random_stardate()
# => 41458.15721310934

4. স্টারডেট ফরম্যাট করুন

ক্যাপ্টেনের লগে স্টারডেট সাধারণত এক দশমিক স্থান পর্যন্ত রাউন্ড করা হয়।

format_stardate/1 ফাংশনটি ইমপ্লিমেন্ট করুন, যা একটি ফ্লোটিং পয়েন্ট সংখ্যা নেবে এবং সংখ্যাটি এক দশমিক স্থান পর্যন্ত রাউন্ড করা একটি স্ট্রিং রিটার্ন করবে।

ইমপ্লিমেন্টেশনে একটি Erlang ফাংশন ব্যবহার করা উচিত।

CaptainsLog.format_stardate(41458.15721310934)
# => "41458.2"
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Elixir Exercism

ক্যাপ্টেনের লগ শুরু করতে প্রস্তুত?

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