#!/usr/bin/python3

import sys
import numpy
import time

def sb_addition(arg1: str, arg2: str) -> str: #will do both addition and substraction
    result = ''
    # transform arg1 to string if not already in string and test if it's a full integer (without decimal part or decimal part equals zero)
    arg1_as_string = str(arg1)
    arg1_integer_part = arg1_as_string
    arg1_decimal_part = ''
    arg1_is_full_integer = True
    arg1_is_negative = True if arg1_integer_part.startswith('-') else False
    try:
        arg1_integer_part, arg1_decimal_part = arg1_as_string.split(".")
        if arg1_decimal_part==len(arg1_decimal_part)*'0': arg1_is_full_integer = True
        else: arg1_is_full_integer = False
    except:
        pass#nothing to do
    if arg1_is_negative: arg1_integer_part = arg1_integer_part.replace('-', '')
    # transform arg2 to string if not already in string and test if it's a full integer (without decimal part or decimal part equals zero)
    arg2_as_string = str(arg2)
    arg2_integer_part = arg2_as_string
    arg2_decimal_part = ''
    arg2_is_full_integer = True
    arg2_is_negative = True if arg2_integer_part.startswith('-') else False
    try:
        arg2_integer_part, arg2_decimal_part = arg2_as_string.split(".")
        if arg2_decimal_part==len(arg2_decimal_part)*'0': arg2_is_full_integer = True
        else: arg2_is_full_integer = False
    except:
        pass#nothing to do
    if arg2_is_negative: arg2_integer_part = arg2_integer_part.replace('-', '')
    # making integer and decimal parts same size
    max_integer_part_size = max( len(arg1_integer_part), len(arg2_integer_part) )
    arg1_integer_part = '0'*(max_integer_part_size-len(arg1_integer_part)) + arg1_integer_part
    arg2_integer_part = '0'*(max_integer_part_size-len(arg2_integer_part)) + arg2_integer_part

    max_decimal_part_size = max(len(arg1_decimal_part),len(arg2_decimal_part))
    arg1_decimal_part = arg1_decimal_part + '0'*(max_decimal_part_size-len(arg1_decimal_part))
    arg2_decimal_part = arg2_decimal_part + '0'*(max_decimal_part_size-len(arg2_decimal_part))
    
    print("arg1_integer_part", arg1_integer_part)
    print("arg1_decimal_part", arg1_decimal_part)
    print("arg2_integer_part", arg2_integer_part)
    print("arg2_decimal_part", arg2_decimal_part)
    # making real addition operation
    rem = '0'
    if (not(arg1_is_negative) and not(arg2_is_negative)) or (arg1_is_negative and arg2_is_negative): # both numbers are positives OR both numbers are negatives
        if not(arg1_is_full_integer) or not(arg2_is_full_integer):
            for i in range(max_decimal_part_size-1, -1, -1):
                res = int( eval('(' + arg1_decimal_part[i] + '+' + arg2_decimal_part[i] + '+' + str(rem) + ')%10') )
                result = str(res) + result
                rem = int( eval('((' + arg1_decimal_part[i] + '+' + arg2_decimal_part[i] + '+' + str(rem) + ') - ' + str(res) + ')/10') )
                print("rem", rem)
            result = '.' + result
        for i in range(max_integer_part_size-1, -1, -1):
            res = int( eval('(' + arg1_integer_part[i] + '+' + arg2_integer_part[i] + '+' + str(rem) + ')%10') )
            result = str(res) + result
            rem = int( eval('((' + arg1_integer_part[i] + '+' + arg2_integer_part[i] + '+' + str(rem) + ') - ' + str(res) + ')/10') )
            print("rem", rem)
        if str(rem) != '0': result = str(rem) + result
        if arg1_is_negative and arg2_is_negative: result = '-' + result # treat the case both numbers are negative
    elif not(arg1_is_negative) and arg2_is_negative: # first number is positive and second one is negative
        pass
    elif arg1_is_negative and not(arg2_is_negative): # first number is negative and second one is positive
        pass
    print("result now:", result)
    return result

def sb_substract(arg1: str, arg2: str, are_already_same_size: bool=False) -> str:
    result = '' # will be arg1-arg2
    # transform arg1 to string if not already in string and test if it's a full integer (without decimal part or decimal part equals zero)
    arg1_as_string = str(arg1)
    arg1_integer_part = arg1_as_string
    arg1_decimal_part = ''
    arg1_is_full_integer = True
    arg1_is_negative = True if arg1_integer_part.startswith('-') else False
    try:
        arg1_integer_part, arg1_decimal_part = arg1_as_string.split(".")
        if arg1_decimal_part==len(arg1_decimal_part)*'0': arg1_is_full_integer = True
        else: arg1_is_full_integer = False
    except:
        pass#nothing to do
    if arg1_is_negative: arg1_integer_part = arg1_integer_part.replace('-', '')
    # transform arg2 to string if not already in string and test if it's a full integer (without decimal part or decimal part equals zero)
    arg2_as_string = str(arg2)
    arg2_integer_part = arg2_as_string
    arg2_decimal_part = ''
    arg2_is_full_integer = True
    arg2_is_negative = True if arg2_integer_part.startswith('-') else False
    try:
        arg2_integer_part, arg2_decimal_part = arg2_as_string.split(".")
        if arg2_decimal_part==len(arg2_decimal_part)*'0': arg2_is_full_integer = True
        else: arg2_is_full_integer = False
    except:
        pass#nothing to do
    if arg2_is_negative: arg2_integer_part = arg2_integer_part.replace('-', '')

    if not(are_already_same_size):
        # making integer and decimal parts same size
        max_integer_part_size = max( len(arg1_integer_part), len(arg2_integer_part) )
        arg1_integer_part = '0'*(max_integer_part_size-len(arg1_integer_part)) + arg1_integer_part
        arg2_integer_part = '0'*(max_integer_part_size-len(arg2_integer_part)) + arg2_integer_part

        max_decimal_part_size = max(len(arg1_decimal_part),len(arg2_decimal_part))
        arg1_decimal_part = arg1_decimal_part + '0'*(max_decimal_part_size-len(arg1_decimal_part))
        arg2_decimal_part = arg2_decimal_part + '0'*(max_decimal_part_size-len(arg2_decimal_part))
    # making real substraction operation
    if arg1_is_negative and not(arg2_is_negative): # first number is negative and second one is positive
        return sb_addition('-'+arg1_integer_part+'.'+arg1_decimal_part, '-'+arg2_integer_part+'.'+arg2_decimal_part) # second number will become negative when doing arg1-arg2
    if not(arg1_is_negative) and arg2_is_negative: # first number is positive and second one is negative
        return sb_addition(arg1_integer_part+'.'+arg1_decimal_part, arg2_integer_part+'.'+arg2_decimal_part) # second number will become positive when doing arg1-arg2
    # when not in one of the above cases, substraction operation can be considered as not being a simple addition
    if arg1_is_negative and arg2_is_negative: # both numbers are negatives
        # then (-arg1)-(-arg2) becomes arg2-arg1
        temp = arg1_integer_part
        arg1_integer_part = arg2_integer_part
        arg2_integer_part = temp
        # --------------
        temp = arg1_decimal_part
        arg1_decimal_part = arg2_decimal_part
        arg2_decimal_part = temp
    rem = '0'
    print("arg1_integer_part", arg1_integer_part, "arg1_decimal_part", arg1_decimal_part)
    print("arg2_integer_part", arg2_integer_part, "arg2_decimal_part", arg2_decimal_part)
    if not(arg1_is_full_integer) or not(arg2_is_full_integer):
        for i in range(max_decimal_part_size-1, -1, -1):
            upper_digit_to_consider = int( eval( arg1_decimal_part[i] + '+' + '10 if ' + arg1_decimal_part[i] + '<(' + arg2_decimal_part[i] + '+' + str(rem) + ') else ' + arg1_decimal_part[i] ) )
            res = int( eval( str(upper_digit_to_consider) + '-(' + arg2_decimal_part[i] + '+' + str(rem) + ')' ) )
            print("res", str(res))
            result = str(res) + result
            rem = int( eval( '1 if ' + arg1_decimal_part[i] + '<(' + arg2_decimal_part[i] + '+' + str(rem) + ') else 0' ) )
        print("result now:", result)

if __name__=='__main__':
    #print( type(sb_addition("-9999999.019999", "-99999.99999993")) )
    #print( type(sb_substract("9999999.019999", "99999.99999993")) )
    print( type(sb_substract("0.1", "0.9")) )
    pass