ট্র্যাক
/
Crystal
Crystal
/
অনুশীলনী
/
Chaitana-এর বিশাল কোস্টার
Chaitana-এর বিশাল কোস্টার

Chaitana-এর বিশাল কোস্টার

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

ভূমিকা

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

এই মেথডগুলোর কয়েকটি ডেস্ট্রাকটিভ, অর্থাৎ এগুলো মূল অ্যারেটিকে বদলে দেয়। আবার বাকিগুলো নন-ডেস্ট্রাকটিভ, অর্থাৎ এগুলো একটি নতুন অ্যারে রিটার্ন করে এবং মূল অ্যারেটি বদলায় না।

অ্যারে নিয়ে কাজ করার সময় সবচেয়ে বেশি ব্যবহৃত কিছু মেথড এখানে দেওয়া হলো:

insert

অ্যারেতে একটি এলিমেন্ট ইনসার্ট করতে চাইলে আপনি insert মেথডটি ব্যবহার করতে পারেন, যা একটি ইনডেক্স আর একটি এলিমেন্ট আর্গুমেন্ট হিসেবে নেয়। নির্দিষ্ট ইনডেক্সে এলিমেন্টটি যোগ হবে, আর অ্যারের বাকি অংশ ডান দিকে সরে যাবে। ইনডেক্সটি সীমার বাইরে গেলে একটি IndexError উত্থাপিত হবে।

numbers = [1, 2, 3]
numbers.insert(1, 4)
numbers # => [1, 4, 2, 3]

numbers.insert(5, 5) # => Error: Index out of bounds (IndexError)

delete

অ্যারে থেকে কোনো নির্দিষ্ট এলিমেন্ট মুছে ফেলতে চাইলে আপনি delete মেথডটি ব্যবহার করতে পারেন, যা একটি এলিমেন্ট আর্গুমেন্ট হিসেবে নেয়। মেথডটি মুছে ফেলা এলিমেন্টটি রিটার্ন করে। এলিমেন্টটি অ্যারেতে না থাকলে nil রিটার্ন হবে।

numbers = [1, 2, 3]
numbers.delete(2) # => 2
numbers           # => [1, 3]

first & last

অ্যারের প্রথম বা শেষ এলিমেন্টটি পেতে চাইলে আপনি first আর last মেথড ব্যবহার করতে পারেন। এই মেথডগুলো একটি ঐচ্ছিক আর্গুমেন্ট নেয়, যা দিয়ে বোঝানো যায় কতটি এলিমেন্ট রিটার্ন করতে হবে। ইনডেক্স 0 বা -1 ব্যবহার করা, কিংবা একটি রেঞ্জ ব্যবহার করার চেয়ে এগুলো পড়তে বেশি সুবিধাজনক। অ্যারেটি খালি থাকলে একটি Enumerable::EmptyError উত্থাপিত হবে।

numbers = [1, 2, 3]
numbers.first # => 1
numbers.last  # => 3

numbers.first(2) # => [1, 2]
numbers.last(2)  # => [2, 3]

empty_array = [] of Int32
empty_array.last # => Error: Empty enumerable (Enumerable::EmptyError)

reverse

অ্যারেটি উল্টে দিতে চাইলে আপনি reverse মেথডটি ব্যবহার করতে পারেন, যা এলিমেন্টগুলো উল্টো ক্রমে সাজিয়ে একটি নতুন অ্যারে রিটার্ন করে। খেয়াল রাখা জরুরি যে reverse একটি নতুন অ্যারে রিটার্ন করে এবং মূল অ্যারেটি বদলায় না। মূল অ্যারেটি বদলাতে চাইলে মেথডের নামের শেষে একটি ! যোগ করুন।

numbers = [1, 2, 3]
numbers.reverse # => [3, 2, 1]
numbers         # => [1, 2, 3]

numbers.reverse! # => [3, 2, 1]
numbers          # => [3, 2, 1]

Concat(+)

অ্যারেতে অবজেক্ট যোগ করতে চাইলে অ্যাপেন্ড মেথড(<<) কাজে লাগে। তবে দুটি অ্যারে একসাথে মেলাতে চাইলে আপনি + অপারেটরটি ব্যবহার করতে পারেন, যা দুটি অ্যারের এলিমেন্ট নিয়ে একটি নতুন অ্যারে রিটার্ন করে।

[1, 2] + [3, 4] # => [1, 2, 3, 4]

কোনো অ্যারের সাথে আরেকটি অ্যারে অ্যাপেন্ড করলে অ্যারেটি একটি একক এলিমেন্ট হিসেবে যোগ হবে।

[1, 2] << [3, 4] # => [1, 2, [3, 4]]

empty?

অ্যারেটি খালি কি না পরীক্ষা করতে আপনি empty? মেথডটি ব্যবহার করতে পারেন, যা অ্যারেটি খালি হলে true এবং অন্যথায় false রিটার্ন করে। অ্যারের দৈর্ঘ্য 0-এর সাথে মিলিয়ে দেখার চেয়ে এটি পড়তে বেশি সুবিধাজনক।

[].empty? # => true
[1, 2, 3].empty? # => false

index

অ্যারেতে কোনো এলিমেন্টের ইনডেক্স পেতে চাইলে আপনি index মেথডটি ব্যবহার করতে পারেন, যা একটি এলিমেন্ট আর্গুমেন্ট হিসেবে নেয়। এলিমেন্টটি অ্যারেতে না থাকলে nil রিটার্ন হবে।

numbers = [1, 2, 3]
numbers.index(2) # => 1

size

অ্যারেতে কতটি এলিমেন্ট আছে জানতে চাইলে আপনি size মেথডটি ব্যবহার করতে পারেন।

numbers = [1, 2, 3]
numbers.size # => 3

count

অ্যারেতে কোনো এলিমেন্ট কতবার আছে গুনতে চাইলে আপনি count মেথডটি ব্যবহার করতে পারেন।

fruits = ["apple", "banana", "apple"]
fruits.count("apple")      # => 2
fruits.count("banana")     # => 1
fruits.count("watermelon") # => 0

sort

অ্যারেটি সাজাতে চাইলে আপনি sort মেথডটি ব্যবহার করতে পারেন, যা এলিমেন্টগুলো সাজিয়ে একটি নতুন অ্যারে রিটার্ন করে। reverse-এর মতোই, এই মেথডটিও একটি নতুন অ্যারে রিটার্ন করে এবং মূল অ্যারেটি বদলায় না।

numbers = [3, 2, 1]
numbers.sort # => [1, 2, 3]
numbers      # => [3, 2, 1]

numbers.sort! # => [1, 2, 3]
numbers       # => [1, 2, 3]

নির্দেশনা

Chaitana-এর মালিকানায় একটি খুব জনপ্রিয় থিম পার্ক আছে। সুন্দরভাবে সাজানো প্রাঙ্গণের একেবারে কেন্দ্রে তাঁর রয়েছে মাত্র একটি রাইড: বিশ্বের সবচেয়ে বড় রোলার কোস্টার (TM)। যদিও এখানে এই একটিমাত্র আকর্ষণ আছে, তারপরও সারা বিশ্ব থেকে মানুষ এসে Chaitana-র হাইপারকোস্টারে চড়ার সুযোগ পেতে ঘণ্টার পর ঘণ্টা লাইনে দাঁড়িয়ে থাকে।

এই রাইডের জন্য দুটি কিউ আছে, যার প্রতিটিকে একটি array হিসেবে প্রকাশ করা হয়েছে:

  1. সাধারণ কিউ
  2. এক্সপ্রেস কিউ (ফাস্ট-ট্র্যাক নামেও পরিচিত), যেখানে মানুষ অগ্রাধিকারমূলক প্রবেশের জন্য অতিরিক্ত টাকা দেয়।

পার্কের অতিথিদের আরও ভালোভাবে সামলানোর জন্য আপনাকে কিছু কোড লিখতে বলা হয়েছে। অতিথিরা (আর আপনার বস, Chaitana!) বিরক্ত হয়ে ওঠার আগেই যত দ্রুত সম্ভব নিচের ফাংশনগুলো আপনাকে ইমপ্লিমেন্ট করতে হবে।

1. কিউতে ব্যক্তিকে যোগ করুন

ColossalCoaster.add_to_queue মেথডটি ডিফাইন করুন, যা ৪টি আর্গুমেন্ট <express_queue>, <normal_queue>, <ticket_type>, <person_name> নেয় এবং ব্যক্তির নাম যোগ করে সংশ্লিষ্ট কিউ রিটার্ন করে।

  1. <ticket_type> একটি Int32, যেখানে 1 == express_queue আর 0 == normal_queue।
  2. <person_name> হলো সংশ্লিষ্ট কিউতে যোগ করতে হবে এমন ব্যক্তির নাম (একটি String হিসেবে)।
express_queue = ["Tony", "Bruce"]
normal_queue = ["RobotGuy", "WW"]
ColossalCoaster.add_to_queue(express_queue, normal_queue, 1, "RichieRich")
# => ["Tony", "Bruce", "RichieRich"]

2. আমার বন্ধুরা কোথায়?

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

ColossalCoaster.find_my_friend মেথডটি ডিফাইন করুন, যা queue আর friend_name নামে ২টি আর্গুমেন্ট নেয় এবং ওই ব্যক্তির নাম কিউতে কোন অবস্থানে আছে তা রিটার্ন করে।

  1. <queue> হলো কিউতে দাঁড়িয়ে থাকা মানুষের একটি array।
  2. <friend_name> হলো সেই বন্ধুর নাম, যার ইনডেক্স (কিউতে অবস্থান) আপনাকে খুঁজে বের করতে হবে।
ColossalCoaster.find_my_friend(["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], "Steve")
# => 1

3. আমি কি তাদের সাথে যোগ দিতে পারি?

এখন যেহেতু তার বন্ধুরা খুঁজে পাওয়া গেছে (উপরের টাস্ক #2-এ), দেরিতে আসা ব্যক্তিটি কিউতে তাদের অবস্থানেই তাদের সাথে যোগ দিতে চায়। ColossalCoaster.add_with_friends মেথডটি ডিফাইন করুন, যা queue, friend_name আর person_name নামে ৩টি আর্গুমেন্ট নেয়।

  1. <queue> হলো কিউতে দাঁড়িয়ে থাকা মানুষের একটি array।
  2. <friend_name> হলো সেই বন্ধুর নাম, যার অবস্থানে ওই ব্যক্তিকে যোগ করতে হবে।
  3. <person_name> হলো ইনডেক্স অবস্থানে যোগ করতে হবে এমন ব্যক্তির নাম।

দেরিতে আসা ব্যক্তির নাম যোগ করে হালনাগাদ করা কিউটি রিটার্ন করুন।

ColossalCoaster.add_with_friends(["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], "Steve", "Bucky")
# => ["Natasha", "Bucky", "Steve", "T'challa", "Wanda", "Rocket"]

4. কিউতে দুষ্টু ব্যক্তি

কিউ থেকে আপনি এইমাত্র শুনলেন যে একজন সত্যিই দুষ্টু ব্যক্তি ধাক্কাধাক্কি করছে, চিৎকার করছে আর ঝামেলা বানাচ্ছে। দুর্ব্যবহারের জন্য আপনাকে ওই দুষ্টু লোকটিকে কিউ থেকে বের করে দিতে হবে!

ColossalCoaster.remove_from_queue মেথডটি ডিফাইন করুন, যা queue আর person_name নামে ২টি আর্গুমেন্ট নেয়।

  1. <queue> হলো কিউতে দাঁড়িয়ে থাকা মানুষের একটি array।
  2. <person_name> হলো সেই ব্যক্তির নাম, যাকে বের করে দিতে হবে।

দুষ্টু ব্যক্তির নাম ছাড়া হালনাগাদ করা কিউটি রিটার্ন করুন।

ColossalCoaster.remove_from_queue(["Natasha", "Steve", "Eltran", "Wanda", "Rocket"], "Eltran")
# => ["Natasha", "Steve", "Wanda", "Rocket"]

5. কিউয়ের তালিকা সাজান

প্রশাসনিক প্রয়োজনে, নির্দিষ্ট একটি কিউয়ের সব নাম বর্ণানুক্রমিক ক্রমে সাজিয়ে নিতে হবে।

ColossalCoaster.sorted_queue মেথডটি ডিফাইন করুন, যা ১টি আর্গুমেন্ট নেয়, queue (কিউতে দাঁড়িয়ে থাকা মানুষের array)। মেথডটি array-এর একটি সাজানো কপি রিটার্ন করবে।

ColossalCoaster.sorted_queue(["Natasha", "Steve", "Eltran", "Natasha", "Rocket"])
# => ['Eltran', 'Natasha', 'Natasha', 'Rocket', 'Steve']
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Crystal Exercism

Chaitana-এর বিশাল কোস্টার শুরু করতে প্রস্তুত?

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