# Autor - https://pt.stackoverflow.com/users/132
def solucao_triangular_inferior(lista_1, lista_2):
    # Descobre a altura e a largura e verifica se as listas tem o tamanho certo.
    altura = len(lista_2)
    largura = altura + 1
    if altura * (altura + 1) / 2 != len(lista_1):
        raise IndexError("A segunda lista não tem a quantidade correta de termos.")

    # Constrói a matriz a partir das listas. A última coluna serão os valores de lista_2.
    matriz = []
    n = 0
    for i in range(0, altura):
        linha = []
        for j in range(0, i + 1):
            linha.append(lista_1[n])
            n += 1
        for j in range(i + 1, altura):
            linha.append(0)
        matriz.append(linha)
        linha.append(lista_2[i])

    # Cria uma segunda matriz como cópia da primeira, pois a primeira será destruída como parte do processo de eliminação de Gauss.
    copia = []
    for linha in matriz:
        copia.append(linha[:])

    # Verifica se não há nenhum zero na diagonal principal.
    for i in range(0, altura):
        if matriz[i][i] == 0:
            raise IndexError("Zero na coluna principal.")

    # Zera os coeficientes fora da diagonal principal.
    for i in range(0, altura):
        # Reduz o coeficiente da diagonal principal para 1 e todos os outros da mesma linha na mesma proporção.
        valor = 1 / matriz[i][i]
        for coluna in range(0, largura):
            matriz[i][coluna] *= valor

        # Corrige as demais linhas abaixo.
        for j in range(i + 1, altura):
            # Conceitualmente, o certo seria percorrer todas as colunas da linha j.
            # No entanto, todas as colunas diferentes da coluna i e da última teriam seus valores inalterados,
            # e portanto só precisamos mexer nessas duas colunas.
            matriz[j][-1] -= matriz[i][-1] * matriz[j][i]
            matriz[j][i] = 0

    # Monta o resultado final.
    ret = []
    for i in range(0, altura):
        ret.append(matriz[i][-1])

    # Retorna a matriz original e o resultado.
    return copia, ret

def mostra_matriz(matriz):
    altura = len(matriz)
    largura = len(matriz[0])
    t = ""
    for i in range(0, altura):
        for j in range(0, largura):
            v = matriz[i][j]
            if j == largura - 1:
                t += f" = {v: >6.2f}"
            else:
                if j != 0: t += " "
                if v == 0:
                    t += " " * (12 + len(str(j + 1)))
                else:
                    s = "+" if v > 0 else "-"
                    t += f"{s} {abs(v): >6.2f} * x{j + 1}"
        t += "\n"
    return t

def mostra_vetor(vetor):
    aux = ""
    for i in range(0, len(vetor)):
        aux += f"{vetor[i]} * x{i + 1}\n"
    return aux

matriz, resultado = solucao_triangular_inferior([-13, 13, 3, -5, -1, -1, 3, 0, 1, 1], [-13, 13, -7, 4])
print(mostra_matriz(matriz))
print(mostra_vetor(resultado))