from math import ceil, log10

mutliplier = 3
n = 5
maxiter = 4
listofnumbers = [n]
card = [len(listofnumbers)]
for iterations in range(0,maxiter):
  for N in range(0,card[iterations]):
    dl = int(log10(listofnumbers[N]))+1
    for i in range(0, dl):
      for j in range(1,dl-i+1):
        if i>0:
          if (ceil(listofnumbers[N] // 10**(i-1)) % 10 !=0) and
          (ceil(listofnumbers[N] // 10**(i+j-1)) % 10 !=0):
            middle = listofnumbers[N] // 10**i % 10**j
            left = ceil(listofnumbers[N] // 10**(i+j))
            right = listofnumbers[N] % 10**i
            ta = int(str(left)+str(mutliplier*middle)+str(right))
            if ta not in listofnumbers:
              listofnumbers.append(ta)
            if middle%mutliplier == 0:
              tb = int(str(left)+str(middle // mutliplier)+str(right))
              if tb not in listofnumbers:
                listofnumbers.append(tb)
        if i == 0:
          if (ceil(listofnumbers[N] // 10**(i+j-1)) % 10 !=0):
            middle = listofnumbers[N] // 10**i % 10**j
            left = ceil(listofnumbers[N] // 10**(i+j))
            ta = int(str(left)+str(mutliplier*middle))
            if ta not in listofnumbers:
              listofnumbers.append(ta)  
            if middle%mutliplier == 0:
              tb = int(str(left)+str(middle // mutliplier))
              if tb not in listofnumbers:
                listofnumbers.append(tb)      
  card.append(len(listofnumbers))
  ### statistics and 200 or less the lowest numbers
  print('==========='+str(iterations+1)+'==============') 
  print(sorted(listofnumbers)[0:min(200,card[iterations+1])])
  print('Maximum at current iteration =', max(listofnumbers))
  print('Current cardinality of the list:', len(listofnumbers)) 
print('===================================') 
print('List of cardinalities', card)