مسیرها
/
Crystal
Crystal
/
تمرین‌ها
/
راکتان غول‌آسای چایتانا
راکتان غول‌آسای چایتانا

راکتان غول‌آسای چایتانا

تمرین یادگیری

مقدمه

آرایه‌ها ساختار داده‌ی رایجی هستند که با آن‌ها کار می‌کنیم. به همین دلیل، مجموعه‌ای از متدها وجود دارد که می‌توان از آن‌ها برای کار با آرایه‌ها استفاده کرد. از جمله مرتب‌سازی، معکوس‌سازی، درج کردن و بسیاری موارد دیگر.

برخی از این متدها مخرب هستند، یعنی آرایه‌ی اصلی را تغییر می‌دهند. برخی دیگر غیرمخرب‌اند، یعنی یک آرایه‌ی جدید برمی‌گردانند و آرایه‌ی اصلی را تغییر نمی‌دهند.

در ادامه چند مورد از رایج‌ترین متدهایی را می‌بینید که می‌توان هنگام کار با آرایه‌ها از آن‌ها استفاده کرد:

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]

دستورالعمل‌ها

چایتانا صاحب یک پارک تفریحی بسیار محبوب است. او فقط یک اسباب‌بازی درست در وسط محوطه‌ای زیبا و آراسته دارد: بزرگ‌ترین ترن هوایی جهان(TM). با اینکه فقط همین یک جاذبه وجود دارد، افراد از سراسر جهان سفر می‌کنند و ساعت‌ها در صف می‌ایستند تا فرصت سوار شدن به هایپرکوستر چایتانا را پیدا کنند.

برای این اسباب‌بازی دو صف وجود دارد که هر کدام به‌صورت یک array نمایش داده می‌شوند:

  1. صف عادی
  2. صف اکسپرس (که به آن فست‌ترک هم می‌گویند) که افراد در آن برای دسترسی اولویت‌دار پول بیشتری می‌پردازند.

از شما خواسته شده است کدی بنویسید تا مهمان‌های پارک را بهتر مدیریت کنید. باید هرچه سریع‌تر توابع زیر را پیاده‌سازی کنید، پیش از آنکه مهمان‌ها (و رئیس شما، چایتانا!) بدقلق شوند.

1. افزودن یک فرد به صف

متد ColossalCoaster.add_to_queue را تعریف کنید که ۴ آرگومان <express_queue>, <normal_queue>, <ticket_type>, <person_name> می‌گیرد و صف مناسب را همراه با اسم آن شخص برمی‌گرداند.

  1. <ticket_type> یک Int32 است که در آن ۱ یعنی express_queue و ۰ یعنی 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. آیا می‌توانم به آن‌ها بپیوندم؟

حالا که دوستانشان پیدا شده‌اند (در بخش ۲ بالا)، فرد دیررسیده می‌خواهد در همان موقعیتی که آن‌ها در صف دارند به آن‌ها بپیوندد. متد 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

آماده‌اید راکتان غول‌آسای چایتانا را شروع کنید؟

در Exercism ثبت‌نام کنید تا Crystal را همراه با 26 مفهوم142 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.