برنامه نویسی

چالش هفتگی: شمارش مالیات

چالش هفتگی 323

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

چالش ، راه حل های من

کار 1: کاهش افزایش

وظیفه

به شما لیستی از عملیات داده می شود.

برای بازگشت مقدار نهایی پس از انجام عملیات داده شده به ترتیب ، یک اسکریپت بنویسید. مقدار اولیه همیشه 0 است.

راه حل من

این یکی نسبتاً مستقیم به جلو است ، بنابراین نیازی به توضیحات زیادی ندارد. من با counter روی صفر تنظیم کنید. من از طریق هر اپراتور حلقه می کنم و در صورت لزوم 1 را اضافه یا تفریق می کنم. من یک ValueError (die در perl) اگر یک اپراتور انتظار نداشته باشد.

def increment_decrement(operations: list) -> int:
    counter = 0
    for operation in operations:
        if operation == "x++" or operation == "++x":
            counter += 1
        elif operation == "x--" or operation == "--x":
            counter -= 1
        else:
            raise ValueError(f"Unknown operation: {operation}")

    return counter
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

کد Perl از منطق یکسان پیروی می کند ، با نحو کمی متفاوت.

نمونه

$ ./ch-1.py --x x++ x++
1

$ ./ch-1.py x++ ++x x++
3

$ ./ch-1.py x++ ++x --x x--
0
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

کار 2: مبلغ مالیات

وظیفه

به شما مبلغ درآمد و براکت های مالیاتی داده می شود.

برای محاسبه کل مالیات ، یک اسکریپت بنویسید.

راه حل من

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

def main():
    # Convert input into floating point numbers
    array = [float(n) for n in sys.argv[1:]]

    if len(array) < 3 or len(array) % 2 == 0:
        raise ValueError("Input must contain at least one income and at least one tax bracket.")
    income = array[0]
    tax_brackets = [array[i:i + 2] for i in range(1, len(array), 2)]

    result = tax_amount(income, tax_brackets)
    print(result)
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

محلول Perl مشابه است ، اما از آن استفاده می کند shift تابع برای به دست آوردن مقادیر.

sub main (@numbers) {
    # Check we have an odd number of arguments
    die "Please provide an odd number of arguments" if @numbers % 2 == 0;

    my $income       = shift(@numbers);
    my @tax_brackets = ();
    while ( scalar(@numbers) ) {
        push @tax_brackets, [ shift(@numbers), shift(@numbers) ];
    }
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مثالها ذکر نمی کنند که چه اتفاقی می افتد income بالاتر از آخرین سطل مالیاتی است. به همین ترتیب اگر این اتفاق بیفتد خطایی ایجاد می کنم.

def tax_amount(income, tax_brackets: list) -> float:
    if income > tax_brackets[-1][0]:
        raise ValueError("Income exceeds the last tax bracket limit.")
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مورد بعدی که من انجام می دهم این است که لیستی (آرایه در Perl) از [0, 0] به tax_brackets لیست من هم تنظیم کردم total_tax ارزش به 0بشر

    tax_brackets.insert(0, [0, 0])
    total_tax = 0
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

در آن حلقه از 1 به طول tax_brackets لیست با متغیر idxبشر متغیر را تنظیم کردم tax_threshold وت tax_rate از tax_brackets لیست

مالیات این براکت به صورت تعریف شده است

  • حداقل income یا tax_threshold
  • منهای آستانه نرخ قبلی
  • ضرب شده توسط نرخ مالیات (که توسط 100 تقسیم می شود)

اگر income کمتر از یا برابر است tax_threshold، ما دیگر نیازی به محاسبه نداریم و می توانیم از حلقه خارج شویم.

    for idx in range(1, len(tax_brackets)):
        tax_threshold, tax_rate = tax_brackets[idx]
        total_tax += (min(income, tax_threshold) - tax_brackets[idx - 1][0]) * (tax_rate / 100)

        if income <= tax_threshold:
            break

    return round(total_tax, 2)
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

کد Perl همان منطق راه حل پایتون را دنبال می کند.

نمونه

$ ./ch-2.py 10 3 50 7 10 12 25
2.65

$ ./ch-2.py 2 1 0 4 25 5 50
0.25

$ ./ch-2.py 0 2 50
0.0
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا