import math

def apply_perm(omega,fbn):
    
    for m in range(len(fbn)):
        g = fbn[m]
        if g > 0:
            
            
            new_first = omega[m+g]
            
            omega[m+1:m+g+1] = omega[m:m+g]
            
            omega[m] = new_first

    return omega

def int_to_fbn(i):
    
    current = i
    divisor = 2
    new_fbn = []
    while current > 0:
        remainder = current% divisor
        current = current 
        new_fbn.append(remainder)
        divisor += 1

    return list(reversed(new_fbn))

def leading_zeros(l,n):
   
   if len(l) < n:
       return(([0] * (n - len(l))) + l)
   else:
       return l

def get_fbn(n):
    
    max = math.factorial(n)

    for i in range(max):
        
        current = i
        divisor = 1
        new_fbn = int_to_fbn(i)
        yield leading_zeros(new_fbn,n-1)

def print_write(f, line):
    
    print(line)
    f.write(str(line)+'\n')     

def dot_format(l):
    
    
    if len(l) < 1:
        return 
    
    dot_string = str(l[0])
    
    for e in l[1:]:
        dot_string += +str(e)

    return dot_string

def str_format(l):
    
    if len(l) < 1:
        return 

    new_string = 

    for e in l:
        new_string += str(e)

    return new_string 

with open(, , encoding=) as f:
    f.write()

    

    omega=[0,1,2,3]

    four_list = get_fbn(4)

    for l in four_list:
        print_write(f,dot_format(l)+' -> '+str_format(apply_perm(omega[:],l)))

    print_write(f,)

    
    
    
    


    num_permutations = 0

    for p in get_fbn(11):
        num_permutations += 1
        if num_permutations% 1000000 == 0:
            print_write(f,+str(num_permutations))

    print_write(f,)
    print_write(f,+str(num_permutations))
    print_write(f,+str(math.factorial(11)))

    print_write(f,)



    

    shoe = []

    for suit in [u,u,u,u]:
        for value in ['A','K','Q','J','10','9','8','7','6','5','4','3','2']:
            shoe.append(value+suit)

    print_write(f,str_format(shoe))

    p1 = [39,49,7,47,29,30,2,12,10,3,29,37,33,17,12,31,29,34,17,25,2,4,25,4,1,14,20,6,21,18,1,1,1,4,0,5,15,12,4,3,10,10,9,1,6,5,5,3,0,0,0]

    p2 = [51,48,16,22,3,0,19,34,29,1,36,30,12,32,12,29,30,26,14,21,8,12,1,3,10,4,7,17,6,21,8,12,15,15,13,15,7,3,12,11,9,5,5,6,6,3,4,0,3,2,1]

    print_write(f,)
    print_write(f,dot_format(p1))
    print_write(f,)
    print_write(f,str_format(apply_perm(shoe[:],p1)))

    print_write(f,)
    print_write(f,dot_format(p2))
    print_write(f,)
    print_write(f,str_format(apply_perm(shoe[:],p2)))

    

    import random

    max = math.factorial(52)

    random_int = random.randint(0, max-1)

    myperm = leading_zeros(int_to_fbn(random_int),51)

    print(len(myperm))

    print_write(f,)
    print_write(f,dot_format(myperm))
    print_write(f,)
    print_write(f,str_format(apply_perm(shoe[:],myperm)))

    f.write()