HI all, I am a python beginner, trying to complete the “Arithmetic formatter” challenge as part of the “Scientific Computing with Python” but stuck on formatting my output.
My code is:
def arithmetic_arranger(problems: list, answers=False):
if(len(problems) > 5):
return 'Error: Too many problems.'
first_num = ''
second_num = ''
operator = ''
line_one = line_two = line_three = line_four = ''
"""1. Break-down the problems list into items"""
for i in problems:
split_item = i.split()
first_num = split_item[0]
operator = split_item[1]
second_num = split_item[2]
"""2. Check if the input values are valid"""
if(len(first_num) > 4 or len(second_num) > 4): #No more than 4 digit numbers
return 'Error: Numbers cannot be more than four digits.'
if not first_num.isnumeric() or not second_num.isnumeric(): #Check if the numbers contains digits only
return 'Error: Numbers must only contain digits.'
#Check if the operands are correct and if so format the output
if(operator == '+' or operator == '-'):
#Get the results from multiplication or substraction
if(operator == '+'):
result = int(first_num) + int(second_num)
else:
result = int(first_num) - int(second_num)
#Get the length of the lines
line_length = len(max(first_num, second_num)) + 2
line = ''
for s in range(line_length):
line += '-'
#Do the maths
if operator == '+':
result = int(first_num) + int(second_num)
elif operator == '-':
result = int(first_num) - int(second_num)
line_one += ' ' * (line_length - len(str(first_num))) + str(first_num) + ' ' * 4
line_two += operator + ' ' * (line_length - len(str(second_num)) - 1) + str(second_num) + ' ' * 4
line_three += line + ' ' * 4
line_four += ' ' * (line_length - len(str(result))) + str(result) + ' ' * 4
else:
return 'Error: Operator must be \'+\' or \'-\'.'
if answers:
#If the answer is required, concatenate the numbers, lines and the answer
return line_one + '\n' + line_two + '\n' + line_three + '\n' + line_four
else:
return line_one + '\n' + line_two + '\n' + line_three```
The test errors:
arguments = [['3801 - 2', '123 + 49']]
expected_output = ' 3801 123\n- 2 + 49\n------ -----'
fail_message = 'Expected different output when calling "arithmetic_arranger()" with ["3801 - 2", "123 + 49"]'
@pytest.mark.parametrize('arguments,expected_output,fail_message', test_cases)
def test_template(arguments, expected_output, fail_message):
actual = arithmetic_arranger(*arguments)
> assert actual == expected_output, fail_message
E AssertionError: Expected different output when calling "arithmetic_arranger()" with ["3801 - 2", "123 + 49"]
E assert ' 3801 123 \n- 2 + 49 \n------ ---- ' == ' 3801 123\n- 2 + 49\n------ -----'
E - 3801 123
E ? -
E + 3801 123
E ? ++++
E - - 2 + 49
E ? -
E + - 2 + 49
E ? ++++
E - ------ -----
E ? ^
E + ------ ----
E ? ^^^^