پول خرد

پول خرد

متوسط

مقدمه

در دهکده‌ی اسرارآمیز Coinholt، شما پشت پیشخوان نانوایی‌تان ایستاده‌اید و دسته‌ای تازه از شیرینی‌ها را می‌چینید. در به صدا در می‌آید و باز می‌شود و Denara وارد می‌شود؛ بازرگانی ماهر که چشمی تیزبین برای کالاهای باکیفیت دارد. پس از صرف غذایی سریع، سکه‌ای درخشان را روی پیشخوان می‌لغزاند که ارزشی برابر با ۱۰۰ واحد دارد.

لبخند می‌زنید، سکه را برمی‌دارید و نگاهی به هزینه‌ی کل غذا می‌اندازید: ۸۸ واحد. یعنی باید ۱۲ واحد باقی پول پس بدهید.

Denara با انتظار دستش را دراز می‌کند. «فقط کمترین تعداد سکه را به من بدهید»، با لبخندی می‌گوید. «کیسه‌ی من از قبل پُر است و نمی‌خواهم در راه خطر گم شدنشان را بپذیرم.»

می‌دانید که چند گزینه دارید. «برای باقی پول، Lumis (به ارزش ۱۰ واحد)، Viras (به ارزش ۵ واحد) و Zenth (به ارزش ۲ واحد) در دسترس داریم.»

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

  • یک Lumis (۱ × ۱۰ واحد) + یک Zenth (۱ × ۲ واحد) = در مجموع ۲ سکه
  • دو Viras (۲ × ۵ واحد) + یک Zenth (۱ × ۲ واحد) = در مجموع ۳ سکه
  • شش Zenth (۶ × ۲ واحد) = در مجموع ۶ سکه

«بهترین انتخاب دو سکه است: یک Lumis و یک Zenth»، می‌گویید و باقی پول را به او می‌دهید.

Denara لبخند می‌زند و آشکارا تحت تأثیر قرار گرفته است. «مثل همیشه، درست انجامش دادید.»

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

کمترین تعداد سکه را تعیین کنید که به مشتری داده شود، به‌طوری که مجموع ارزش آن‌ها با مقدار درست خرد برابر باشد.

مثال‌ها

  • مقدار ۱۵ با ارزش‌های سکه‌ی موجودِ [1, 5, 10, 25, 100] باید یک سکه به ارزش 5 و یک سکه به ارزش 10، یا [5, 10] را برگرداند.
  • مقدار ۴۰ با ارزش‌های سکه‌ی موجودِ [1, 5, 10, 25, 100] باید یک سکه به ارزش 5، یک سکه به ارزش 10 و یک سکه به ارزش 25، یا [5, 10, 25] را برگرداند.

پیام‌های استثنا

گاهی لازم است یک استثنا ایجاد کنید. وقتی این کار را می‌کنید، باید همیشه یک پیام خطای معنادار را هم بگنجانید که نشان دهد منبع خطا چیست. این کار کد شما را خواناتر می‌کند و کمک چشمگیری به debug کردن می‌کند. در موقعیت‌هایی که می‌دانید منبع خطا نوع مشخصی دارد، می‌توانید یکی از انواع خطای توکار را ایجاد کنید، اما همچنان باید پیام معناداری را در آن بگنجانید.

این تمرین خاص می‌خواهد که از دستور raise استفاده کنید تا وقتی نمی‌توان با سکه‌های داده‌شده پول را خرد کرد، یک ValueError را «پرتاب» کنید. آزمون‌ها تنها در صورتی قبول می‌شوند که هم exception را raise کنید و هم پیامی همراه آن بیاورید.

برای raise کردن یک ValueError همراه با پیام، پیام را به‌عنوان آرگومانی برای نوع exception بنویسید:

# example when change cannot be made with the coins passed in
raise ValueError("can't make target with given coins")
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Python Exercism

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

در Exercism ثبت‌نام کنید تا Python را همراه با 17 مفهوم146 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.