# Tuplas: "aglomerados" de valores. São imutáveis!

tupla = "Hugo", 38, True
unitária = (99,)

# Strings: informação textual. São imutáveis!

# Listas: "aglomerados" MUTÁVEIS de valores

lista = ["Hugo", 38, True]

# Dicionários: associações entre chaves e valores. São mutáveis!

outratupla = (1,2,3)
a = 'blablabla'
outratuplaainda = (1,2,3,[4], a)

a = 'agora outra coisa'

dicionário = {'nome' : "Hugo",
              outratupla: 'blabla',}

outralista = lista

nome = "hugo"
apelido = nome
nome = "Hugo"

lista_de_quadrados_até_100 = [x**2 for x in range(100)]
dict_de_cubos_até_100 = {x:x**3 for x in range(100)}

# curiosidade inútil:
isso_aqui_não_é_tupla = (x**4 for x in range(100))

def teste_for(N=10**5):
    for i in range(N):
        pass

def teste_while(N=10**5):
    i = 0
    while i < N:
        i += 1

# P3-2018-1-João-Nuclear+Ambiental

# Q1

def fatorial(n):
    prod = 1
    for i in range(1,n+1):
        # prod = prod * i
        prod *= i
    return prod

def combinações(n,p):
    return (fatorial(n))//(fatorial(p)*fatorial(n-p))

def soma_linha(n):
    return sum([combinações(n,p) for p in range(n+1)])
    # soma = 0
    # for p in range(n+1):
    #     soma += combinações(n,p)
    # return soma

def soma_diagonal(n,k):
    soma = 0
    for bla in range(0,k+1):
        print(f'{n=}, {bla=}, {combinações(n+bla, bla)=}')
        soma += combinações(n+bla, bla)
    return soma

# Q2

def ordena(lista):
    list.sort(lista)
    lista1 = [list.pop(lista,0)]
    pos = 1
    lista2 = []
    tamanho = len(lista)
    for i in range(tamanho):
        for p in lista:
            list.append(lista2, [p[pos:],p])
        list.sort(lista2)
        lista1 += [lista2[0][1]]
        list.remove(lista, lista2[0][1])
        pos += 1
        lista2 = []
    return lista1
