لازانیا

لازانیا

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

مقدمه

در کل مسیر آموزشی Julia از شما خواسته می‌شود که با راه‌حل خود مانند کتابخانه‌های کوچک رفتار کنید؛ یعنی باید توابع، نوع‌ها و مواردی از این دست را تعریف کنید که سپس در برابر یک مجموعه‌ی آزمون اجرا می‌شوند. به همین دلیل، اولین مفهومی که معرفی می‌کنیم توابع نامدار است.

Julia یک زبان برنامه‌نویسی پویا و با نوع‌بندی قوی است. سبک برنامه‌نویسی آن عمدتاً تابعی است، هرچند انعطاف‌پذیری بیشتری از زبان‌هایی مانند Haskell دارد.

متغیرها و انتساب

نیازی نیست متغیری را از پیش اعلام کنید. کافی است مقداری را به یک اسم مناسب نسبت دهید:

julia> myvar = 42  # an integer
42

julia> name = "Maria"  # strings are surrounded by double-quotes ""
"Maria"

ثابت‌ها

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

قرار دادن کلیدواژه‌ی const در ابتدای یک انتساب به کامپایلر اجازه می‌دهد کدی کارآمدتر از آنچه برای یک متغیر ممکن است تولید کند.

ثابت‌ها همچنین به شما کمک می‌کنند در برابر خطاهای برنامه‌نویسی از خود محافظت کنید. اگر به‌طور تصادفی بخواهید مقدار const را تغییر دهید، هشدار دریافت می‌کنید:

julia> const answer = 42
42

julia> answer = 24
WARNING: redefinition of constant Main.answer. This may fail, cause incorrect answers, or produce other errors.
24

توجه کنید که const را فقط بیرون از هر تابعی می‌توان اعلام کرد. این کار معمولاً نزدیک بالای فایل *.jl و پیش از تعریف توابع انجام می‌شود.

عملگرهای حسابی

این عملگرها مانند بسیاری از زبان‌های دیگر هستند:

2 + 3  # 5 (addition)
2 - 3  # -1 (subtraction)
2 * 3  # 6 (multiplication)
8 / 2  # 4.0 (division with floating-point result)
8 % 3  # 2 (remainder)

توابع

دو روش رایج برای تعریف یک تابع نامدار در Julia وجود دارد:

  1. استفاده از کلیدواژه‌ی function

    function muladd(x, y, z)
        x * y + z
    end
    

    تورفتگی با ۴ فاصله برای خوانایی مرسوم است، اما کامپایلر آن را نادیده می‌گیرد. کلیدواژه‌ی end ضروری است.

    توجه کنید که می‌توانستیم return x * y + z را بنویسیم. اما توابع Julia همیشه آخرین عبارت ارزیابی‌شده را برمی‌گردانند، بنابراین کلیدواژه‌ی return اختیاری است. بسیاری از برنامه‌نویسان ترجیح می‌دهند آن را بنویسند تا منظورشان صریح‌تر باشد.

  2. استفاده از «شکل انتساب»

    muladd(x, y, z) = x * y + z
    

    این شکل بیشتر برای ساختن توابع کوتاه تک‌عبارتی به کار می‌رود.

    کلیدواژه‌ی return در شکل انتساب هرگز استفاده نمی‌شود.

این دو شکل معادل‌اند و دقیقاً به یک شکل استفاده می‌شوند، پس هرکدام را که خواناتر است انتخاب کنید.

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

# invoking a function
muladd(10, 5, 1)

# and of course you can invoke a function within the body of another function:
square_plus_one(x) = muladd(x, x, 1)

قراردادهای نام‌گذاری

مانند بسیاری از زبان‌ها، Julia می‌خواهد که اسم‌ها (اسم متغیرها، توابع و بسیاری موارد دیگر) با یک حرف شروع شوند و پس از آن هر ترکیبی از حروف، رقم‌ها و زیرخط‌ها بیاید.

بر اساس قرارداد، اسم متغیرها، ثابت‌ها و توابع با حروف کوچک نوشته می‌شود و تعداد زیرخط‌ها تا حد معقولی کم نگه داشته می‌شود.

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

در این تمرین می‌خواهید کدی بنویسید که به شما کمک کند یک لازانیای عالی را از کتاب آشپزی محبوبتان بپزید.

شما چهار کار دارید که همه به زمان صرف‌شده برای پخت لازانیا مربوط می‌شوند.

1. زمان پخت مورد انتظار را در یک ثابت ذخیره کنید

ثابت expected_bake_time را تعریف کنید که تعداد دقیقه‌هایی را برمی‌گرداند که لازانیا باید در فر بپزد.

طبق کتاب آشپزی، لازانیا باید در مجموع ۶۰ دقیقه در فر بماند.

julia> expected_bake_time
60

2. زمان آماده‌سازی را بر حسب دقیقه محاسبه کنید

تابع preparation_time را تعریف کنید که تعداد لایه‌هایی را که به لازانیا اضافه کرده‌اید به عنوان ورودی می‌گیرد و تعداد دقیقه‌هایی را برمی‌گرداند که صرف آماده‌سازی لازانیا کرده‌اید، با این فرض که آماده کردن هر لایه ۲ دقیقه طول می‌کشد.

julia> preparation_time(4)
8

3. زمان باقی‌مانده‌ی پخت در فر را بر حسب دقیقه محاسبه کنید

تابع remaining_time را تعریف کنید که تعداد واقعی دقیقه‌هایی را که لازانیا در فر بوده است به عنوان ورودی می‌گیرد و تعداد دقیقه‌هایی را برمی‌گرداند که لازانیا هنوز باید در فر بماند.

julia> remaining_time(50)
10

4. زمان کل کار را بر حسب دقیقه محاسبه کنید

تابع total_working_time را تعریف کنید که دو ورودی می‌گیرد: ورودی اول تعداد لایه‌هایی است که به لازانیا اضافه کرده‌اید و ورودی دوم تعداد دقیقه‌هایی است که لازانیا در فر بوده است.

تابع باید تعداد کل دقیقه‌هایی را برگرداند که صرف پخت لازانیا کرده‌اید؛ این مقدار برابر است با مجموع زمان آماده‌سازی بر حسب دقیقه و زمانی که لازانیا تا این لحظه در فر گذرانده است.

julia> total_working_time(3, 20)
26
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Julia Exercism

آماده‌اید لازانیا را شروع کنید؟

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