Search code examples
pythonprintingalignment

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  


Solution

  • 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