abdelrhani ghouizi
abdelrhani ghouizi

Reputation: 3

how can I align the output horizantally with python?

can anyone take a look to my code and tell me what I'm missing? I am trying to solve a freecodingcamp project called arithmetic formatter this is my code:

def arithmetic_arranger(lst):
  for x in lst:
     if '+' in x:
         x = x.split('+')
         a = int(x[0])
         b = int(x[1])
         upa = str(a)
         downb = str(b)
         total = str(a + b)
         s_total = str(total)
         plusAndB = '+ ' + downb
         line = '---------'
         print('{:>8}'.format(upa),'\n','{:>7}'.format(plusAndB),'\n', '{:>8}'.format(line[0:len(s_total)]),'\n','{:>7}'.format(s_total))
     if '-' in x:
         y = x.split('-')
         c = int(y[0])
         d = int(y[1])
         substracion = c - d
         s_sub = str(substracion)
         subAndD = '- ' + str(d)
         line = '---------'
         print('{:>8}'.format( c),'\n','{:>7}'.format(subAndD),'\n', '{:>8}'.format(line[0:len(s_sub) + 2]),'\n','{:>7}'.format(s_sub))
         print('')
print(arithmetic_arranger(["32 + 8", "1 - 3801", "9999 + 9999", "523 - 49"]))

I want the results to be aligned as follows:

  32         1      9999      523
+  8    - 3801    + 9999    -  49
----    ------    ------    -----
  40     -3800     19998      474

no matter what I have tried I always get this output:

       32  
     + 8  
       -- 
      40  
       1  
  - 3801  
  ------- 
   -3800  

    9999  
  + 9999  
    ----- 
   19998  
     523  
    - 49  
    ----- 
     474  

Upvotes: 0

Views: 43

Answers (1)

Alexander
Alexander

Reputation: 17355

I left inline comments to explain what the code does

def output(seq):
    final = []  #  final output list
    for expression in seq:   
        op = "+" if "+" in expression else "-"  # op will represent the operator
        
        top,bottom = [i.strip() for i in expression.split(op)]  # split equation
        
        ibottom = int(bottom) if op == "+" else int(bottom) * -1 # make bottom 
                                                                 # negative if 
                                                                 # operater is a 
                                                                 # minus
        
        solution = str(sum([i for i in [int(top), ibottom]])) # sum solution
        bottom = op + " " + bottom                 # add operator to bottom
        out = []                                   # formated output list
        mx = max(int(i) for i in [top, bottom, solution])  # largest string
        for val in [top, bottom, solution]:
            out.append(str(val).rjust(mx, " ")) # pad with spaces
        out.insert(2, ("-" * mx))    # insert line before answer
        final.append(out)                    
    return final                    # return all solutions

out = output(["32 + 8", "1 - 3801", "9999 + 9999", "523 - 49"])  

# join lines from each solution into their own lines to print them one at a time
print('\n'.join([('  '.join([out[i][j] for i in range(len(out))])) for j in range(len(out))]))

output

 32       1    9999   523
+ 8  - 3801  + 9999  - 49
---  ------  ------  ----
 40   -3800   19998   474

Upvotes: 1

Related Questions