def pascal(num_linhas):
    pascal_dict = {(0,0): 1}
    for n in range(1,num_linhas+1):
        for k in range(n+1):
            if k == 0 or k == n:
                pascal_dict[(n,k)] = 1
            else:
                pascal_dict[(n,k)] = pascal_dict[(n-1,k-1)] + pascal_dict[(n-1,k)]
    return pascal_dict

def gera_linhas(num_linhas):
    pascal_dict = pascal(num_linhas)
    linhas = {0: '1'}
    max_len_num = 0
    for n in range(num_linhas+1):
        max_len_num = max(max_len_num,max(len(str(pascal_dict[(n,k)])) for k in range(n+1)))
        
    for n in range(num_linhas+1):
        linhas[n] = ' '.join([f'{pascal_dict[(n,k)]:^{max_len_num}}' for k in range(n+1)])

    max_len_linha = max([len(l) for l in linhas.values()])
    return linhas, max_len_linha, max_len_num

def printa_centralizado(num_linhas):
    print()
    linhas, max_len_linha,_ = gera_linhas(num_linhas)
    L = len(str(num_linhas))
    for n,l in enumerate(linhas.values()):
        print(f'{n:>{L}} ┃ {l:^{max_len_linha}}')

def printa_esquerda(num_linhas):
    print()
    linhas, max_len_linha, max_len_num = gera_linhas(num_linhas)
    L = len(str(num_linhas))
    cab = " ".join([f'{k:^{max_len_num}}' for k in range(num_linhas + 1)])
    sep = '━'*(L + 1) + '╋' + '━'*(len(cab) + 1)
    print(f'{"":>{L}} ┃ {cab}')
    print(sep)
    for n,l in enumerate(linhas.values()):
        print(f'{n:>{L}} ┃ {l}')
