مسیرها
/
Julia
Julia
/
تمرین‌ها
/
آبمیوه‌های مخلوط
آبمیوه‌های مخلوط

آبمیوه‌های مخلوط

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

مقدمه

اساساً دو نوع «حلقه» وجود دارد:

  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 جایگزین کرد.

می‌توان روی انواع دیگری از مجموعه‌ها هم حلقه زد: عناصر یک آرایه، کاراکترهای یک رشته، کلیدهای یک دیکشنری...

مثال‌های تا اینجا روی بازه‌ی 1:10 حلقه می‌زنند، که در آن مقدار همان اندیس حلقه هم هست.

به‌طور کلی‌تر، ممکن است به اندیس نیاز باشد و نه فقط به مقدار. برای این کار از تابع eachindex() استفاده می‌شود، مثلاً for i in eachindex(my_array) ... end.

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

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

1. تعیین کنید که ترکیب یک آبمیوه چقدر طول می‌کشد

لی می دوست دارد از قبل به مشتریانش بگوید که برای آبمیوه‌ای که از منو سفارش داده‌اند چقدر باید منتظر بمانند. به خاطر سپردن اعداد دقیق برایش سخت است، چون زمان لازم برای ترکیب آبمیوه‌ها متفاوت است. "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. ذخیره‌ی قاچ‌های لیموترش را دوباره پر کنید

بسیاری از نوشیدنی‌های ابتکاری لی می قاچ لیموترش دارند، چه به عنوان یک ماده‌ی اولیه و چه به عنوان بخشی از تزیین. پس وقتی صبح شیفتش را شروع می‌کند، باید مطمئن شود که ظرف قاچ‌های لیموترش برای روز پیش رو پر است.

تابع limes_to_cut را پیاده‌سازی کنید که دو ورودی می‌گیرد: تعداد قاچ‌های لیموترشی که لی می باید ببرد و آرایه‌ای از لیموترش‌های کامل که در دسترس دارد. او از یک لیموترش "small" ۶ قاچ، از یک لیموترش "medium" ۸ قاچ و از یک لیموترش "large" ۱۰ قاچ به دست می‌آورد. او همیشه لیموترش‌ها را به همان ترتیبی که در فهرست آمده‌اند می‌برد و از اولین عنصر شروع می‌کند. او ادامه می‌دهد تا به تعداد قاچ‌هایی که لازم دارد برسد یا تا لیموترش‌هایش تمام شود.

لی می می‌خواهد از قبل بداند که چند لیموترش باید ببرد. تابع limes_to_cut باید برگرداند که چند لیموترش باید بریده شود.

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

3. زمان‌های ترکیب هر سفارش در صف را فهرست کنید

لی می دوست دارد بداند که ترکیب سفارش‌هایی که مشتریان منتظرشان هستند چقدر طول می‌کشد.

تابع order_times را پیاده‌سازی کنید که یک صف از سفارش‌ها می‌گیرد و برداری از زمان‌های ترکیب را برمی‌گرداند.

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

4. شیفت را تمام کنید

لی می همیشه تا ساعت ۳ بعدازظهر کار می‌کند. بعد کارمندش دمیتری کار را به دست می‌گیرد. وقتی شیفت لی می تمام می‌شود، اغلب نوشیدنی‌هایی هستند که سفارش داده شده‌اند اما هنوز آماده نشده‌اند. آن وقت دمیتری بقیه‌ی آبمیوه‌ها را آماده می‌کند.

برای اینکه تحویل کار راحت‌تر باشد، تابعی به اسم remaining_orders پیاده‌سازی کنید که دو ورودی می‌گیرد: تعداد دقیقه‌های باقی‌مانده از شیفت لی می و آرایه‌ای از آبمیوه‌هایی که سفارش داده شده‌اند اما هنوز آماده نشده‌اند. این تابع باید سفارش‌هایی را برگرداند که لی می نمی‌تواند پیش از پایان روز کاری‌اش آماده کردنشان را شروع کند.

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

julia> remaining_orders(5, ["Energizer", "All or Nothing", "Green Garden"])
["Green Garden"]
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Julia Exercism

آماده‌اید آبمیوه‌های مخلوط را شروع کنید؟

در Exercism ثبت‌نام کنید تا Julia را همراه با 35 مفهوم128 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.