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

چالش هفتگی 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