Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

validação de dificuldade.

Durante o curso, na parte 6: Gerando números aleatórios, no exercício 6: "O grande sorteio", nos é apresentado um problema aonde um dos alunos, tem 50% de chances de ganhar, enquanto os outros tem 25%.

Com isso em mente, percebi que o seletor de níveis do professor vai deixar na dificuldade mais alta para qualquer resultado diferente de 1 ou 2. Vou cola-lo abaixo pra facilitar:

`if (nivel == 1):
total_de_tentativas = 20
elif (nivel == 2):
total_de_tentativas = 10
else:
total_de_tentativas = 5
`

Como solução cheguei ao resultado abaixo, gostaria de saber se a lógica ficou legal, ou posso chegar num resultado tão bom quanto com menos trabalho ou processamento. Desde já obrigado ;D

    'while(validacao != True):

    dificuldade = int(input("digite o nº correspondente ao nível: "))

    if(dificuldade < 1 or dificuldade > 3):
        print("O numero informado é inválido, tente novamente")
        continue

    elif(dificuldade == 1):
        tentativas = 15
        validacao = True
    elif(dificuldade == 2):
        tentativas = 10
        validacao = True
    else:
        tentativas = 5
        validacao = True
    `
2 respostas
solução!

Comparado ao apresentado pelo professor, apresenta maior tempo de execução por ter mais intruções, mas já evita que qualquer entrada seja contraintuivia (Ex: -1, 5, 0, passariam como total_de_tentativas = 5). A ideia é boa e já adiciona um toque a mais no seu programa: válidar a entrada do usuário.

Em termos de processamento, o laço while, por ser acompanhado de uma condição, é mais "lento" que o for. The Fastest Way to Loop in Python - An Unfortunate Truth

No seu código, o while é acompanhado da condição validacao != True, mas você pode fazer algumas pequenas alterações que podem significar algum ganho de desempenho.

  1. Invés de sempre verificar a condição da variável validacao podemos deixar o laço "livre", rodando enquanto for True (isso vai ser completado com o item 2);
while (True):

    dificuldade = int (input ("digite o nº correspondente ao nível: "))

    if (dificuldade < 1 or dificuldade > 3):
        print ("O numero informado é inválido, tente novamente")
        continue
  1. Uma vez que a entrada do usuário é válida e se encaixa nas condições do programa, basta encerrar a execução do laço, sem precisar comparar novamente;
    #Novo bloco de condicionais
    if (dificuldade == 1):
        tentativas = 15
        break             #É válido? Se sim, break

    elif (dificuldade == 2):
        tentativas = 10
        break            #É válido? Se sim, break

    else:
        tentativas = 5
        break           #É válido? Se sim, break

Nesse caso, o primeiro elif foi trocado por if; por já ter sido validado anteriormente e ser um novo bloco de código achei mais legível. Testanto as duas versões não vi nenhum erro na execução.

Muito obrigado pelas dicas :D