# Python - Arithmetic Formatter Problem

I’m not sure what’s wrong here. I’ve written code to handle the key rules for this challenge and all the tests look to be showing the correctly formatted answers, but they are not evaluating in the tests. My code is below:

``````def arithmetic_arranger(problems, torf=True):
# if optional argument is true, execute code
if torf:
#define variables used later
nums = ''
dens = ''
sums = ''
# error when too many problems
if len(problems) > 5:
return 'Error: Too many problems.'
# split problem into components
for k in problems:
l = (k.split(' '))
num = l[0]
op = l[1]
den = l[2]
# error when numbers are too long or non-numeric
if len(num) > 4 or len(den) > 4:
return 'Error: Numbers cannot be more than four digits.'
if not num.isnumeric() or not den.isnumeric():
return 'Error: Numbers must only contain digits.'
# execute code if operators are correct
if  op == '+' or op == '-':
# set length of sum and top, bottom and line values
length = max(len(num), len(den)) + 2
top = str(num).rjust(length)
bottom = op + str(den).rjust(length - 1)
sum = ''
for s in range(length):
sum += '-'
# add to the overall string
nums += top + '    '
dens += bottom + '    '
sums += sum + '    '
else:
return "Error: Operator must be '+' or '-'."
# strip out spaces to the right of the string
nums.rstrip()
dens.rstrip()
sums.rstrip()

arranged_problems = nums + '\n' + dens + '\n' + sums
return arranged_problems
``````

Below is the error message shown in the console.

``````    3      3801      45      123
+ 855    -    2    + 43    +  49
-----    ------    ----    -----
F..F..
======================================================================
FAIL: test_arrangement (test_module.UnitTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/runner/GratefulCuddlyDatasets/test_module.py", line 10, in test_arrangement
self.assertEqual(actual, expected, 'Expected different output when calling "arithmetic_arranger()" with ["3 + 855", "3801 - 2", "45 + 43", "123 + 49"]')
AssertionError: '    [23 chars]  123    \n+ 855    -    2    + 43    +  49   [35 chars]    ' != '    [23 chars]  123\n+ 855    -    2    + 43    +  49\n-----[23 chars]----'
-     3      3801      45      123
?                                 ----
+     3      3801      45      123
- + 855    -    2    + 43    +  49
?                                 ----
+ + 855    -    2    + 43    +  49
- -----    ------    ----    -----    ?                                 ----
+ -----    ------    ----    ----- : Expected different output when calling "arithmetic_arranger()" with ["3 + 855", "3801 - 2", "45 + 43", "123 + 49"]

======================================================================
FAIL: test_solutions (test_module.UnitTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/runner/GratefulCuddlyDatasets/test_module.py", line 39, in test_solutions
self.assertEqual(actual, expected, 'Expected solutions to be correctly displayed in output when calling "arithmetic_arranger()" with arithemetic problems and a second argument of `True`.')
AssertionError: '   3[23 chars]  123    \n- 698    - 3801    + 43    +  49   [35 chars]    ' != '   3[23 chars]  123\n- 698    - 3801    + 43    +  49\n-----[57 chars] 172'
-    32         1      45      123
?                                 ----
+    32         1      45      123
- - 698    - 3801    + 43    +  49
?                                 ----
+ - 698    - 3801    + 43    +  49
- -----    ------    ----    -----    ?                                 ^^^^
+ -----    ------    ----    -----
?                                 ^
+  -666     -3800      88      172 : Expected solutions to be correctly displayed in output when calling "arithmetic_arranger()" with arithemetic problems and a second argument of `True`.

----------------------------------------------------------------------
Ran 6 tests in 0.005s

FAILED (failures=2)
``````

User Agent is: `Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36`.

Challenge: Arithmetic Formatter

you need to just use the given numbers, and display them as required, not do the calculations

Oof, is one not allowed to use format strings in this challenge? This looks tedious as all get-out.

I’m not trying to solve the calculations - just trying to format the given numbers in the correct way. It looks like they are showing formatted correctly but the FCC test is not evaluating my code as being correct. That’s the help I was asking for as I’m not sure what’s wrong with my solution.

I’m not sure. I also tried a workaround where the code would add the spaces to display the numbers in the correct places, but that showed the same errors too.

you have spaces before the `\n` character after the last number on a line, instead there should not be

I’m not able to tell you if there’s an error or where that would be - looks like I’m much more of a beginner than you - just wanted to say hi and thank you for posting your code as it’s helping me figure out where I was stuck!

3 Likes

Instead of stripping the empty strings like that, you can use join method with empty spaces.

``````nums = []
for top in tops:
nums.append(top)

"    ".join(nums)
``````

Implement this logic within your code.

Updated:
I saw you rstrip the end spaces but you didn’t take the return value.

Try

``````nums = nums.rstrip()
``````

Also you don’t have the answer line implemented. So the test with answer will not pass

1 Like

I have a far more verbose solution to this project, and it works fine if I pass the test values directly to the arithmetic_arranger method:

``````> # This entrypoint file to be used in development. Start by reading README.md
> from arithmetic_arranger import arithmetic_arranger
> from unittest import main
>
>
> print(arithmetic_arranger(["32 + 698", "3801 - 2", "45 + 43", "123 + 49"], True))
> print(arithmetic_arranger(["3 + 855", "3801 - 2", "45 + 43", "123 + 49"]))
> print(arithmetic_arranger(["11 + 4", "3801 - 2999", "1 + 2", "123 + 49", "1 - 9380"]))
> print(arithmetic_arranger(["44 + 815", "909 - 2", "45 + 43", "123 + 49", "888 + 40", "653 + 87"]))
> print(arithmetic_arranger(["3 / 855", "3801 - 2", "45 + 43", "123 + 49"]))
> print(arithmetic_arranger(["24 + 85215", "3801 - 2", "45 + 43", "123 + 49"]))
> print(arithmetic_arranger(["98 + 3g5", "3801 - 2", "45 + 43", "123 + 49"]))
> print(arithmetic_arranger(["32 - 698", "1 - 3801", "45 + 43", "123 + 49"], True))
>
> # Run unit tests automatically
> #main(module='test_module', exit=False)
``````

Yet if I comment out the method calls and use the test_module instead I am seeing the same errors as yourself.

My code:

``````def arithmetic_arranger(problems, dosum=None):

arranged_problems = ""

# Test that number of problems is within range
if len(problems) > 5:
arranged_problems="Error: Too many problems."
return arranged_problems

top = []  # Will store values for top row
bottom = []  # Will store values for bottom row
if dosum: allsums = []  # Will store sum values if desired
for problem in problems:
pieces = problem.split()

# Error checking
if not pieces[0].isnumeric() or not pieces[2].isnumeric():
arranged_problems = "Error: Numbers must only contain digits."
return arranged_problems
if len(pieces[0]) > 4 or len(pieces[2]) > 4:
arranged_problems = "Error: Numbers cannot be more than four digits."
return arranged_problems
if pieces[1] != "+" and pieces[1] != "-":
arranged_problems = "Error: Operator must be '+' or '-'."
return arranged_problems

if dosum is True: # Get sums if these are desired
calc = 0
if pieces[1] == "+":
calc = int(pieces[0]) + int(pieces[2])
elif pieces[1] == "-":
calc = int(pieces[0]) - int(pieces[2])
else:
arranged_problems="Error: Operator must be '+' or '-'."
return arranged_problems
pieces.append(str(calc))

top.append(pieces[0])  # Top values
bottom.append((pieces[1], pieces[2]))  # Bottom values
if dosum: allsums.append(pieces[3])  # Sum values

# Determine length of each sum
alltop_lengths = []
allbottom_lengths = []
actual_lengths = []

for top_length in top:
alltop_lengths.append(len(top_length))

for bottom_length in bottom:
allbottom_lengths.append(len(bottom_length[1]))

for count in range(0, len(alltop_lengths)):  # We could also use allbottom_lengths here
if alltop_lengths[count] >= allbottom_lengths[count]:
actual_lengths.append(alltop_lengths[count])
else:
actual_lengths.append(allbottom_lengths[count])

actual_length_int = (int(actual_lengths[count])) + 2  # Add operator plus one space
actual_lengths[count] = actual_length_int

# Build string

# Top row of operands
count = 0
for top_string in alltop_lengths:
space_length = actual_lengths[count] - top_string
spacing = ""
for spacecount in range(1, space_length+1):  # I suspect there is a better way of doing this
spacing = spacing + " "
arranged_problems = arranged_problems + spacing
arranged_problems = arranged_problems + top[count]
arranged_problems = arranged_problems + "    "
count = count + 1
arranged_problems = arranged_problems.rstrip()
arranged_problems = arranged_problems + "\n"

# Second row of operators and operands
count = 0
for bottom_string in allbottom_lengths:
arranged_problems = arranged_problems + bottom[count][0] + " "
space_length = (actual_lengths[count] - 2) - bottom_string
if space_length > 0:
spacing = ""
for spacecount in range(1, space_length+1):
spacing = spacing + " "
arranged_problems = arranged_problems + spacing
arranged_problems = arranged_problems + bottom[count][1]
arranged_problems = arranged_problems + "    "
count = count + 1
arranged_problems = arranged_problems.rstrip()
arranged_problems = arranged_problems + "\n"

# Dashes row
for dashes_length in actual_lengths:
for dashcount in range (1, dashes_length+1):
arranged_problems = arranged_problems + "-"
arranged_problems = arranged_problems + "    "
arranged_problems = arranged_problems.rstrip()
arranged_problems = arranged_problems + "\n"

# Sums row
if dosum:
count = 0
for thissum in allsums:
space_length = actual_lengths[count] - len(thissum)
for spacecount in range (1, space_length+1):
arranged_problems = arranged_problems + " "
arranged_problems = arranged_problems + thissum
arranged_problems = arranged_problems + "    "
count = count + 1
arranged_problems = arranged_problems.rstrip()
arranged_problems = arranged_problems + "\n"

return arranged_problems
``````
1 Like

look at the errors, the `diff` scheme shows you where you have extra characters - it’s the easiest way if you have extra spaces or `\n` and where

I think I have figured it out, the trick is not to add “\n” to the end of the last lineof the output string.

``````PS C:\Users\Craig\Python\FCCProjects\Scientific Computing with Python\Arithmetic Formatter> & C:/Users/Craig/AppData/Local/Programs/Python/Python39/python.exe "c:/Users/Craig/Python/FCCProjects/Scientific Computing with Python/Arithmetic Formatter/main.py"
......
----------------------------------------------------------------------
Ran 6 tests in 0.004s

OK
``````

A post was split to a new topic: Python arithmetic formatter

Can you explain this with code, which line exactly you are referring to?

In the output you are formatting a number of lines, basically the very last line that you output should not have a ‘\n’ at the end of it.

Hi! It looks like you have wrapped all of your code inside the “if torf” block. The code would run only if torf is set to true. The assignment asked for just the formatted numbers, without the answere, if there was no true argument. I may have misunderstood your code, but that is what stands out to me. Good luck!

1 Like