1
resposta

Resolução de Atividades - 09 Gerador de senha segura

import random
 
def gerador_senha_aleatoria (limite):

    """ 
    Função responsável pela distribuição do limite de caracteres máximos em quatro (4) categorias e a concepção da senha aleatória

    input: limite de caracteres máximos que a senha deve ter
    output: senha aleatória para o usuário
    """

    distribuicao = limite / 4
    resto = limite % 4

    numero_maiusculas = int (distribuicao)
    numero_minusculas = int (distribuicao)
    numero_numerais = int (distribuicao)
    numero_caracteres_especiais = int (distribuicao)

    if resto != 0:

        lista_elementos = [numero_maiusculas, numero_minusculas, numero_numerais, numero_caracteres_especiais]
        contador = 0

        while resto != 0:

            lista_elementos[contador] += 1
            resto -= 1
            contador = (contador + 1) % 4

    senha = sorteador_elementos (lista_elementos[0], lista_elementos[1], lista_elementos[2], lista_elementos[3])
    return senha
            

def sorteador_elementos (numero_maiusculas, numero_minusculas, numero_numerais, numero_caracteres_especiais):

    """
    Essa função tem por objetivo sortear, entre os caracteres definidos pelo desenvolvedor, os elementos que irão compor a senha aleatória do usuário. 
    
    input: recebe o número de elementos que precisa ter de cada categoria. Exemplo: quatro (4) numerais, três (3) letras maiusculas, etc.output: retorna a senha aleatória"""

    senha = []      # Fazer a senha virar uma lista para que o .shuffle funcione
    banco_dados_letras_maiusculas = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    banco_dados_letras_minusculas = banco_dados_letras_maiusculas.lower()
    banco_dados_numerais = "0123456789"
    banco_dados_caracteres_especiais = "!@#$%¨&*()[]?ºª°/~^`+-""'.|"

    # Dica do gabarito = No import do Random existe o método .choice() que escolhe, dentre o iterável passado de argumento, um elemento.

    while numero_maiusculas != 0 or numero_minusculas != 0 or numero_numerais != 0 or numero_caracteres_especiais != 0: 

        if numero_maiusculas != 0:

            letra = random.choice (banco_dados_letras_maiusculas)
            senha.append (letra)
            numero_maiusculas -= 1

        
        if numero_minusculas != 0:

            letra = random.choice (banco_dados_letras_minusculas)
            senha.append (letra)
            numero_minusculas -= 1
        
        if numero_numerais != 0:

            numero = random.choice (banco_dados_numerais)
            senha.append (numero)
            numero_numerais -= 1

        if numero_caracteres_especiais != 0:

            caracter = random.choice (banco_dados_caracteres_especiais)
            senha.append (caracter)
            numero_caracteres_especiais -= 1

    random.shuffle (senha)
    senha = ''.join (senha) # Usar o método .join() para quebrar a lista em uma string
    return senha


def main ():

    usuario_nome = input ("Digite seu nome: ").strip()

    caracteres_limites = 14

    usuario_senha = gerador_senha_aleatoria (caracteres_limites)

    print ("\nUsuário: ", usuario_nome)
    print ("Senha: ", usuario_senha)

main()

Nota de tristeza: eu demorei 2 horas nesse exercício por conta que o operador lógico para não sair do while enquanto gerava a senha era OR e não AND, e eu tinha colocado o segundo.... Isso que o Copilot checou e não avisou. Tive que ficar 30 minutos no debuger (aqeule insetinho do VS Code) do Python para ver esse problema... Tá resolvido, mas ainda assim foi tenso (´。_。`), pelo menos agora tá funcionando kkkkk, mas que foi cansativo, foi...

1 resposta

Olá, Victor, como vai?

Seu código atende perfeitamente aos requisitos do exercício e apresenta uma lógica de distribuição de caracteres muito bem pensada. A preocupação em garantir que todos os tipos de caracteres estejam presentes dividindo o limite total demonstra um bom domínio sobre manipulação de dados e fluxos de repetição.

É gratificante ver como você utilizou o depurador para identificar o comportamento dos operadores lógicos, pois esse processo de investigação é fundamental para a evolução na programação.

Parabéns pela dedicação em resolver o problema e por compartilhar sua experiência, continue praticando e postando seus avanços.

O fórum está à disposição.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!