মিক্সড জুস

মিক্সড জুস

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

ভূমিকা

মূলত দুই ধরনের লুপ আছে:

  1. একটি শর্ত পূরণ হওয়া পর্যন্ত লুপ করা।
  2. একটি কালেকশনের এলিমেন্টগুলোর উপর লুপ করা।

দুটোই Julia-তে সম্ভব, তবে দ্বিতীয়টি আরও কমন হতে পারে।

while লুপ

যেসব খোলা-প্রান্তের সমস্যায় লুপটি কতবার ঘুরবে তা আগে থেকে জানা থাকে না, সেগুলোর জন্য Julia-তে রয়েছে while লুপ।

এর মৌলিক রূপটি বেশ সহজ:

while condition
    do_something()
end

এক্ষেত্রে condition যতক্ষণ true থাকে, প্রোগ্রামটি ততক্ষণ লুপে ঘুরতে থাকবে।

লুপ থেকে আগেভাগে বেরিয়ে আসার দুটি উপায় আছে:

  • break দিলে লুপটি থেকে বেরিয়ে আসা যায়, আর লুপের end-এর পরের লাইন থেকে এক্সিকিউশন চলতে থাকে।
  • return x বর্তমান ফাংশনের এক্সিকিউশন থামিয়ে দেয় এবং রিটার্ন ভ্যালু x কলারের কাছে ফিরিয়ে দেয়।

এই সুবিধাগুলো থাকলে, কখনও কখনও while true ... end দিয়ে একটি "অসীম" লুপ তৈরি করা সুবিধাজনক হতে পারে, তারপর লুপ বডির ভেতরে থামার একটি শর্ত খুঁজে পেয়ে সেটি দিয়ে break বা return চালু করা যায়।

একটি কালেকশনের উপর লুপ

সবচেয়ে সহজ উদাহরণ হলো একটি রেঞ্জের উপর লুপ করা।

যদি আমরা কোনো কাজ ১০ বার করতে চাই:

for n in 1:10
    do_something(n)
end

যদি বর্তমান ইটারেশনটি কোনো শর্ত পূরণ করতে না পারে, তাহলে continue দিয়ে সাথে সাথেই পরের ইটারেশনে চলে যাওয়া যায়:

for n in 1:10
    if is_useless(n)
        continue
    end
    
    # we decided this iteration could be useful
    do_something_slow(n)
end

আরও ছোট রূপে, if ব্লকটির বদলে is_useless(n) && continue লেখা যায়।

আরও অনেক ধরনের কালেকশনের উপর লুপ করা যায়: একটি অ্যারের এলিমেন্ট, একটি স্ট্রিংয়ের ক্যারেক্টার, একটি ডিকশনারির কী (key)...

এখন পর্যন্ত উদাহরণগুলো 1:10 রেঞ্জের উপর লুপ করেছে, যেখানে মানটিই আবার লুপ ইনডেক্স।

আরও সাধারণভাবে, শুধু মান নয়, ইনডেক্সও প্রয়োজন হতে পারে। এর জন্য eachindex() ফাংশনটি ব্যবহার করা হয়, যেমন for i in eachindex(my_array) ... end।

নির্দেশনা

আপনার বন্ধু Li Mei একটি জুসের দোকান চালান, যেখানে তিনি সুস্বাদু মিশ্র ফলের জুস বিক্রি করেন। আপনি তাঁর দোকানের নিয়মিত একজন ক্রেতা, এবং বুঝতে পারলেন যে আপনি আপনার বন্ধুর জীবন সহজ করে দিতে পারেন। আপনি ঠিক করলেন যে কোডিং দক্ষতা কাজে লাগিয়ে Li Mei-কে তাঁর কাজে সাহায্য করবেন।

1. একটি জুস মেশাতে কত সময় লাগে তা নির্ধারণ করুন

Li Mei মেনু থেকে ক্রেতারা যে জুস অর্ডার করেছেন, তা তৈরি করতে তাদের কতক্ষণ অপেক্ষা করতে হবে তা আগেই বলতে পছন্দ করেন। সঠিক সংখ্যাগুলো তাঁর মনে রাখতে বেশ কষ্ট হয়, কারণ জুস মেশাতে যত সময় লাগে তা জুসভেদে বদলে যায়। "Pure Strawberry Joy" নিতে সময় লাগে ০.৫ মিনিট, "Energizer" আর "Green Garden" প্রতিটি ১.৫ মিনিট, "Tropical Island" লাগে ৩ মিনিট, আর "All or Nothing" লাগে ৫ মিনিট। বাকি সব পানীয়ের (যেমন বিশেষ অফার) ক্ষেত্রে প্রস্তুতির সময় ২.৫ মিনিট ধরে নিতে পারেন।

আপনার বন্ধুকে সাহায্য করতে time_to_mix_juice নামে একটি ফাংশন লিখুন, যা আর্গুমেন্ট হিসেবে মেনু থেকে একটি জুস নেয় এবং ওই পানীয়টি মেশাতে কত মিনিট লাগে তা রিটার্ন করে।

julia> time_to_mix_juice("Tropical Island")
3

julia> time_to_mix_juice("Berries & Lime")
2.5

2. লাইমের টুকরার মজুত আবার ভরে নিন

Li Mei-এর তৈরি অনেক পানীয়তেই লাইমের টুকরা থাকে, তা উপকরণ হিসেবে হোক বা সাজসজ্জার অংশ হিসেবে। তাই সকালে শিফট শুরু করার সময় সামনের দিনটার জন্য লাইমের টুকরার পাত্রটি ভর্তি আছে কি না, তা তিনি নিশ্চিত হয়ে নেন।

limes_to_cut ফাংশনটি তৈরি করুন, যা Li Mei-এর কাটা প্রয়োজন এমন লাইমের টুকরার সংখ্যা এবং তাঁর হাতে থাকা আস্ত লাইমের সরবরাহ বোঝানো একটি অ্যারে নেয়। একটি "small" লাইম থেকে তিনি ৬টি টুকরা পান, একটি "medium" লাইম থেকে ৮টি, আর একটি "large" লাইম থেকে ১০টি। তিনি সবসময় তালিকায় লাইমগুলো যেই ক্রমে আছে সেই ক্রমেই কাটেন, প্রথমটি দিয়ে শুরু করে। তিনি প্রয়োজনের সংখ্যক টুকরা না হওয়া পর্যন্ত, বা লাইম ফুরিয়ে না যাওয়া পর্যন্ত কাটতে থাকেন।

Li Mei আগেই জানতে চান তাঁর কতটি লাইম কাটতে হবে। limes_to_cut ফাংশনটি কাটতে হবে এমন লাইমের সংখ্যা রিটার্ন করবে।

julia> limes_to_cut(25, ["small", "small", "large", "medium", "small"])
4

3. সারিতে থাকা প্রতিটি অর্ডার মেশানোর সময়ের তালিকা করুন

ক্রেতারা যে অর্ডারগুলোর জন্য অপেক্ষা করছেন, সেগুলো মেশাতে কত সময় লাগবে তার হিসাব Li Mei রাখতে পছন্দ করেন।

order_times ফাংশনটি তৈরি করুন, যা অর্ডারের একটি সারি নেয় এবং মেশানোর সময়গুলোর একটি ভেক্টর রিটার্ন করে।

julia> order_times(["Energizer", "Tropical Island"])
[1.5, 3.0]

4. শিফট শেষ করুন

Li Mei সবসময় 3pm পর্যন্ত কাজ করেন। এরপর তাঁর কর্মচারী Dmitry দায়িত্ব নেন। Li Mei-এর শিফট শেষ হওয়ার সময় অনেক সময় এমন হয় যে পানীয় অর্ডার করা হয়েছে কিন্তু এখনো তৈরি হয়নি। এরপর Dmitry বাকি জুসগুলো তৈরি করেন।

দায়িত্ব হস্তান্তর সহজ করতে remaining_orders নামে একটি ফাংশন তৈরি করুন, যা Li Mei-এর শিফটে বাকি থাকা মিনিটের সংখ্যা এবং অর্ডার করা কিন্তু এখনো তৈরি হয়নি এমন জুসের একটি অ্যারে নেয়। এই ফাংশনটি এমন অর্ডারগুলো রিটার্ন করবে, যা Li Mei তাঁর কাজের দিন শেষ হওয়ার আগে তৈরি শুরু করতে পারবেন না।

শিফটে বাকি থাকা সময় সবসময় ০-এর চেয়ে বেশি থাকবে। যে জুসগুলো তৈরি করতে হবে সেই অ্যারে কখনো খালি থাকবে না। তাছাড়া, অর্ডারগুলো অ্যারেতে যেই ক্রমে আছে সেই ক্রমেই তৈরি করা হয়। Li Mei যদি কোনো একটি জুস মেশানো শুরু করেন, তাহলে একটু বেশি সময় কাজ করতে হলেও তিনি সেটি সবসময় শেষ করেন। Dmitry-কে দেখতে হবে এমন কোনো অর্ডার বাকি না থাকলে একটি খালি ভেক্টর রিটার্ন করতে হবে।

julia> remaining_orders(5, ["Energizer", "All or Nothing", "Green Garden"])
["Green Garden"]
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Julia Exercism

মিক্সড জুস শুরু করতে প্রস্তুত?

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